Browse Source

fix(chat): 修复表情删除时光标定位问题并添加年龄计算功能

- 修复了删除表情标记时光标位置计算错误的问题
- 优化了表情标记删除逻辑,正确处理光标在表情开始位置的情况
- 添加了根据出生年份计算年龄的工具方法
- 更新了聊天页面中年龄显示逻辑,使用动态计算的年龄值
master
Jolie 2 months ago
parent
commit
c604fcc72d
2 changed files with 49 additions and 5 deletions
  1. 21
      lib/pages/message/chat_page.dart
  2. 33
      lib/widget/message/chat_input_bar.dart

21
lib/pages/message/chat_page.dart

@ -35,6 +35,25 @@ class ChatPage extends StatefulWidget {
} }
class _ChatPageState extends State<ChatPage> { class _ChatPageState extends State<ChatPage> {
///
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(); final ScrollController _scrollController = ScrollController();
bool _isLoadingMore = false; bool _isLoadingMore = false;
late ChatController _controller; late ChatController _controller;
@ -515,7 +534,7 @@ class _ChatPageState extends State<ChatPage> {
), ),
SizedBox(width: 4.w), SizedBox(width: 4.w),
Text( Text(
'${marriageData.age}',
_calculateAgeFromBirthYear(marriageData.birthYear),
style: TextStyle( style: TextStyle(
fontSize: 12.sp, fontSize: 12.sp,
color: Colors.grey[700], color: Colors.grey[700],

33
lib/widget/message/chat_input_bar.dart

@ -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),
);
}
}
} }
} }

Loading…
Cancel
Save