diff --git a/lib/pages/message/chat_page.dart b/lib/pages/message/chat_page.dart index cfca2aa..fd0906f 100644 --- a/lib/pages/message/chat_page.dart +++ b/lib/pages/message/chat_page.dart @@ -35,6 +35,25 @@ class ChatPage extends StatefulWidget { } class _ChatPageState extends State { + /// 根据出生年份计算年龄 + String _calculateAgeFromBirthYear(String birthYear) { + if (birthYear.isEmpty) { + return '0'; + } + + try { + final year = int.tryParse(birthYear); + if (year == null) { + return '0'; + } + + final currentYear = DateTime.now().year; + final age = currentYear - year; + return age > 0 ? age.toString() : '0'; + } catch (e) { + return '0'; + } + } final ScrollController _scrollController = ScrollController(); bool _isLoadingMore = false; late ChatController _controller; @@ -515,7 +534,7 @@ class _ChatPageState extends State { ), SizedBox(width: 4.w), Text( - '${marriageData.age}', + _calculateAgeFromBirthYear(marriageData.birthYear), style: TextStyle( fontSize: 12.sp, color: Colors.grey[700], diff --git a/lib/widget/message/chat_input_bar.dart b/lib/widget/message/chat_input_bar.dart index 945ddab..d26ce19 100644 --- a/lib/widget/message/chat_input_bar.dart +++ b/lib/widget/message/chat_input_bar.dart @@ -82,6 +82,7 @@ class EmojiTextInputFormatter extends TextInputFormatter { if (newValue.text.length < oldValue.text.length) { final oldSelection = oldValue.selection; final cursorOffset = oldSelection.baseOffset; + final deletedLength = oldValue.text.length - newValue.text.length; // 在整个文本中查找所有表情标记 final emojiRegex = RegExp(r'\[emoji:\d+\]'); @@ -92,21 +93,45 @@ class EmojiTextInputFormatter extends TextInputFormatter { final emojiStart = match.start; final emojiEnd = match.end; - // 如果光标在表情标记内部(包括开始和结束位置) - if (cursorOffset >= emojiStart && cursorOffset <= emojiEnd) { + // 如果光标在表情标记内部(不包括开始位置,包括结束位置) + if (cursorOffset > emojiStart && cursorOffset <= emojiEnd) { // 删除整个表情标记 final beforeEmoji = oldValue.text.substring(0, emojiStart); final afterEmoji = oldValue.text.substring(emojiEnd); final newText = beforeEmoji + afterEmoji; - // 光标位置设置为表情标记的开始位置 - final newCursorOffset = emojiStart; + // 删除表情后,光标保持在删除操作发生的位置 + // 跟删除普通文本一样:删除后光标停留在删除位置 + // 光标位置 = 删除位置 - 表情长度 + final emojiLength = emojiEnd - emojiStart; + int newCursorOffset = (cursorOffset - emojiLength).clamp(0, newText.length); return TextEditingValue( text: newText, 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), + ); + } + } } }