From f91a8aa913870a4c83e6dcff02342d4a5341723b Mon Sep 17 00:00:00 2001 From: dom Date: Sat, 20 Jun 2026 10:32:39 +0800 Subject: [PATCH] fix RichTextField text replace on desktop Signed-off-by: dom --- .../flutter/text_field/editable_text.dart | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/common/widgets/flutter/text_field/editable_text.dart b/lib/common/widgets/flutter/text_field/editable_text.dart index 8300beafc..3c81f95eb 100644 --- a/lib/common/widgets/flutter/text_field/editable_text.dart +++ b/lib/common/widgets/flutter/text_field/editable_text.dart @@ -25,6 +25,7 @@ import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart'; import 'package:PiliPlus/common/widgets/flutter/text_field/editable.dart'; import 'package:PiliPlus/common/widgets/flutter/text_field/spell_check.dart'; import 'package:PiliPlus/common/widgets/flutter/text_field/text_selection.dart'; +import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart' @@ -3556,6 +3557,8 @@ class EditableTextState extends State } } + TextRange? _deletedRange; + @override void updateEditingValueWithDeltas(List textEditingDeltas) { if (textEditingDeltas.isEmpty) { @@ -3564,6 +3567,25 @@ class EditableTextState extends State } TextEditingValue remoteValue = _value; for (final TextEditingDelta delta in textEditingDeltas) { + if (PlatformUtils.isDesktop) { + if (_deletedRange case final range?) { + final deleteDelta = TextEditingDeltaDeletion( + oldText: remoteValue.text, + deletedRange: range, + selection: remoteValue.selection, + composing: remoteValue.composing, + ); + _deletedRange = null; + widget.controller.syncRichText(deleteDelta); + } else if (delta is TextEditingDeltaInsertion && + !remoteValue.selection.isCollapsed) { + final offset = delta.textInserted.length; + _deletedRange = TextRange( + start: remoteValue.selection.start + offset, + end: remoteValue.selection.end + offset, + ); + } + } widget.controller.syncRichText(delta); remoteValue = delta.apply(remoteValue); }