|
|
@ -82,6 +82,7 @@ class EmojiTextInputFormatter extends TextInputFormatter { |
|
|
if (newValue.text.length < oldValue.text.length) { |
|
|
if (newValue.text.length < oldValue.text.length) { |
|
|
final oldSelection = oldValue.selection; |
|
|
final oldSelection = oldValue.selection; |
|
|
final cursorOffset = oldSelection.baseOffset; |
|
|
final cursorOffset = oldSelection.baseOffset; |
|
|
|
|
|
final deletedLength = oldValue.text.length - newValue.text.length; |
|
|
|
|
|
|
|
|
// 在整个文本中查找所有表情标记 |
|
|
// 在整个文本中查找所有表情标记 |
|
|
final emojiRegex = RegExp(r'\[emoji:\d+\]'); |
|
|
final emojiRegex = RegExp(r'\[emoji:\d+\]'); |
|
|
@ -92,21 +93,45 @@ class EmojiTextInputFormatter extends TextInputFormatter { |
|
|
final emojiStart = match.start; |
|
|
final emojiStart = match.start; |
|
|
final emojiEnd = match.end; |
|
|
final emojiEnd = match.end; |
|
|
|
|
|
|
|
|
// 如果光标在表情标记内部(包括开始和结束位置) |
|
|
|
|
|
if (cursorOffset >= emojiStart && cursorOffset <= emojiEnd) { |
|
|
|
|
|
|
|
|
// 如果光标在表情标记内部(不包括开始位置,包括结束位置) |
|
|
|
|
|
if (cursorOffset > emojiStart && cursorOffset <= emojiEnd) { |
|
|
// 删除整个表情标记 |
|
|
// 删除整个表情标记 |
|
|
final beforeEmoji = oldValue.text.substring(0, emojiStart); |
|
|
final beforeEmoji = oldValue.text.substring(0, emojiStart); |
|
|
final afterEmoji = oldValue.text.substring(emojiEnd); |
|
|
final afterEmoji = oldValue.text.substring(emojiEnd); |
|
|
final newText = beforeEmoji + afterEmoji; |
|
|
final newText = beforeEmoji + afterEmoji; |
|
|
|
|
|
|
|
|
// 光标位置设置为表情标记的开始位置 |
|
|
|
|
|
final newCursorOffset = emojiStart; |
|
|
|
|
|
|
|
|
// 删除表情后,光标保持在删除操作发生的位置 |
|
|
|
|
|
// 跟删除普通文本一样:删除后光标停留在删除位置 |
|
|
|
|
|
// 光标位置 = 删除位置 - 表情长度 |
|
|
|
|
|
final emojiLength = emojiEnd - emojiStart; |
|
|
|
|
|
int newCursorOffset = (cursorOffset - emojiLength).clamp(0, newText.length); |
|
|
|
|
|
|
|
|
return TextEditingValue( |
|
|
return TextEditingValue( |
|
|
text: newText, |
|
|
text: newText, |
|
|
selection: TextSelection.collapsed(offset: newCursorOffset), |
|
|
selection: TextSelection.collapsed(offset: newCursorOffset), |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 如果光标刚好在表情标记的开始位置,且删除的是表情标记内部的字符 |
|
|
|
|
|
if (cursorOffset == emojiStart) { |
|
|
|
|
|
// 检查删除的字符是否在表情标记范围内 |
|
|
|
|
|
if (cursorOffset + deletedLength <= emojiEnd) { |
|
|
|
|
|
// 删除整个表情标记 |
|
|
|
|
|
final beforeEmoji = oldValue.text.substring(0, emojiStart); |
|
|
|
|
|
final afterEmoji = oldValue.text.substring(emojiEnd); |
|
|
|
|
|
final newText = beforeEmoji + afterEmoji; |
|
|
|
|
|
|
|
|
|
|
|
// 删除表情后,光标保持在删除位置 |
|
|
|
|
|
// 光标位置 = 删除位置 - 表情长度 |
|
|
|
|
|
final emojiLength = emojiEnd - emojiStart; |
|
|
|
|
|
int newCursorOffset = (cursorOffset - emojiLength).clamp(0, newText.length); |
|
|
|
|
|
|
|
|
|
|
|
return TextEditingValue( |
|
|
|
|
|
text: newText, |
|
|
|
|
|
selection: TextSelection.collapsed(offset: newCursorOffset), |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|