diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aae52a..ef6fffe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ -## 1.1.0 +## 1.2.0 + +* Fix: The issue of input area not showing, when switching from recording to keyboard, on `TIMUIKitChat`. +* Fix: Only the first receiver can receive the merged multiple forward messages. +* Optimize: `MessageItemBuilder` can now be used for shows on the merger message screen. + +## 1.1.0 And 1.1.0+1 * Add: Supports two new languages, Japanese and Korean. * Add: Supports adding new other languages, apart from our default ones, including English, Chinese(Simplified and Traditional), Japanese and Korean, or modifying the translations, refers to [this documentation](https://www.tencentcloud.com/document/product/1047/52154). diff --git a/README.md b/README.md index 9988a98..496c1fe 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@

-

Tencent Cloud Chat UIKIt

+

Tencent Cloud Chat UIKit


diff --git a/example/pubspec.lock b/example/pubspec.lock index 5de3a96..8bbf0b4 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -963,14 +963,14 @@ packages: name: tencent_cloud_chat_sdk url: "https://pub.dartlang.org" source: hosted - version: "5.0.6" + version: "5.0.7" tencent_cloud_chat_uikit: dependency: "direct main" description: path: ".." relative: true source: path - version: "1.1.0" + version: "1.2.0" tencent_extended_text: dependency: transitive description: @@ -998,7 +998,7 @@ packages: name: tencent_im_base url: "https://pub.dartlang.org" source: hosted - version: "1.0.14" + version: "1.0.17" tencent_im_sdk_plugin_platform_interface: dependency: transitive description: diff --git a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart index 0414ebb..c27fdc3 100644 --- a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart +++ b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart @@ -982,10 +982,10 @@ class TUIChatSeparateViewModel extends ChangeNotifier { lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); if (lifeCycleMsg == null) { - return null; + continue; } } - return _sendMessage( + _sendMessage( id: mergerMessageInfo.id!, convID: convID, convType: convType == 1 ? ConvType.c2c : ConvType.group, diff --git a/lib/ui/utils/permission.dart b/lib/ui/utils/permission.dart index 2c70b92..74b1e29 100644 --- a/lib/ui/utils/permission.dart +++ b/lib/ui/utils/permission.dart @@ -1,7 +1,6 @@ // ignore_for_file: unused_import import 'dart:io'; - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; @@ -19,9 +18,9 @@ class PermissionRequestInfo extends StatefulWidget { const PermissionRequestInfo( {Key? key, - required this.removeOverLay, - required this.permissionType, - required this.appName}) + required this.removeOverLay, + required this.permissionType, + required this.appName}) : super(key: key); @override @@ -205,11 +204,11 @@ class Permissions { } static Future checkPermission( - BuildContext context, - int value, [ - TUITheme? theme, - bool isShowPermissionPage = true, - ]) async { + BuildContext context, + int value, [ + TUITheme? theme, + bool isShowPermissionPage = true, + ]) async { final status = await Permission.byValue(value).status; if (status.isGranted || status.isLimited) { return true; @@ -256,7 +255,11 @@ class Permissions { static Future showPermissionConfirmDialog(BuildContext context, value, [TUITheme? theme, bool isShowPermissionPage = true]) async { + final platformUtils = PlatformUtils(); + // 第一次直接走系统文案 + if (!await checkPermissionSetBefore(value)) { await setLocalPermission(value); + if (platformUtils.isAndroid && isShowPermissionPage) { showPermissionRequestInfoDialog(context, value); } return true; @@ -280,54 +283,54 @@ class Permissions { builder: (context) { return platformUtils.isIOS ? CupertinoAlertDialog( - title: Text("“$appName”" + - TIM_t_para(" 想访问您的{{option2}}", " 想访问您的$option2")( - option2: option2)), - content: Text(permissionText), - actions: [ - CupertinoDialogAction( - child: Text(TIM_t("以后再说")), - onPressed: closeDialog, // 关闭对话框 - ), - CupertinoDialogAction( - child: Text(TIM_t("去开启")), - onPressed: getPermission, - ), - ], - ) + title: Text("“$appName”" + + TIM_t_para(" 想访问您的{{option2}}", " 想访问您的$option2")( + option2: option2)), + content: Text(permissionText), + actions: [ + CupertinoDialogAction( + child: Text(TIM_t("以后再说")), + onPressed: closeDialog, // 关闭对话框 + ), + CupertinoDialogAction( + child: Text(TIM_t("去开启")), + onPressed: getPermission, + ), + ], + ) : AlertDialog( - content: Text(permissionText), - actions: [ - const Divider(), - SizedBox( - height: 48, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - child: TextButton( - child: Text(TIM_t("以后再说"), - style: TextStyle( - color: theme?.black ?? Colors.black, - )), - onPressed: closeDialog, // 关闭对话框 - ), - ), - const VerticalDivider(), - Expanded( - child: TextButton( - child: Text(TIM_t("去开启"), - style: TextStyle( - color: theme?.black ?? Colors.black, - )), - onPressed: getPermission, - ), - ) - ], + content: Text(permissionText), + actions: [ + const Divider(), + SizedBox( + height: 48, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: TextButton( + child: Text(TIM_t("以后再说"), + style: TextStyle( + color: theme?.black ?? Colors.black, + )), + onPressed: closeDialog, // 关闭对话框 + ), + ), + const VerticalDivider(), + Expanded( + child: TextButton( + child: Text(TIM_t("去开启"), + style: TextStyle( + color: theme?.black ?? Colors.black, + )), + onPressed: getPermission, ), ) ], - ); + ), + ) + ], + ); }, ); } diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart index d3759a3..c4393d7 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart @@ -520,6 +520,7 @@ class _TIMUIKItHistoryMessageListItemState )!; } return TIMUIKitMergerElem( + messageItemBuilder: messageItemBuilder, model: model, isShowJump: isShowJump, clearJump: clearJump, diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart index aafa006..b5a23fd 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart @@ -5,6 +5,7 @@ import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; import 'package:tencent_open_file/tencent_open_file.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -15,10 +16,7 @@ import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; - -import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; - import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart'; import 'package:tencent_cloud_chat_uikit/ui/widgets/textSize.dart'; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart index 051fb5e..e318731 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; import 'package:tencent_cloud_chat_uikit/ui/widgets/merger_message_screen.dart'; @@ -21,6 +22,7 @@ class TIMUIKitMergerElem extends StatefulWidget { final V2TimMessage message; final bool? isShowMessageReaction; final TUIChatSeparateViewModel model; + final MessageItemBuilder? messageItemBuilder; const TIMUIKitMergerElem( {Key? key, @@ -31,7 +33,7 @@ class TIMUIKitMergerElem extends StatefulWidget { this.isShowMessageReaction, required this.messageID, required this.isShowJump, - this.clearJump}) + this.clearJump, this.messageItemBuilder}) : super(key: key); @override @@ -71,6 +73,7 @@ class TIMUIKitMergerElemState extends TIMUIKitState { context, MaterialPageRoute( builder: (context) => MergerMessageScreen( + messageItemBuilder: widget.messageItemBuilder, model: model, msgID: widget.messageID), )); } diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart index a38fae2..7aa01c0 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart @@ -795,8 +795,8 @@ class _InputTextFieldState extends TIMUIKitState { forbiddenText == null) InkWell( onTap: () async { + showKeyboard = showSendSoundText; if (showSendSoundText) { - showKeyboard = true; focusNode.requestFocus(); } if (await Permissions.checkPermission( @@ -806,7 +806,6 @@ class _InputTextFieldState extends TIMUIKitState { )) { setState(() { showEmojiPanel = false; - showKeyboard = false; showMore = false; showSendSoundText = !showSendSoundText; }); diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart index ad300f1..104b731 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart @@ -10,12 +10,10 @@ import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/chat_life_cyc import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; - import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_chat_controller.dart'; - import 'package:tencent_cloud_chat_uikit/ui/utils/frame.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart'; diff --git a/lib/ui/widgets/merger_message_screen.dart b/lib/ui/widgets/merger_message_screen.dart index ab8ccac..54cccba 100644 --- a/lib/ui/widgets/merger_message_screen.dart +++ b/lib/ui/widgets/merger_message_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:provider/provider.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; @@ -18,9 +19,13 @@ import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class MergerMessageScreen extends StatefulWidget { final TUIChatSeparateViewModel model; final String msgID; + final MessageItemBuilder? messageItemBuilder; const MergerMessageScreen( - {Key? key, required this.model, required this.msgID}) + {Key? key, + required this.model, + required this.msgID, + this.messageItemBuilder}) : super(key: key); @override @@ -39,7 +44,8 @@ class MergerMessageScreenState extends TIMUIKitState { } void initMessageList() async { - final mergerMessageList = await _messageService.downloadMergerMessage(msgID: widget.msgID); + final mergerMessageList = + await _messageService.downloadMergerMessage(msgID: widget.msgID); setState(() { messageList = mergerMessageList ?? []; }); @@ -51,7 +57,7 @@ class MergerMessageScreenState extends TIMUIKitState { if (hasCustomData) { try { final CloudCustomData messageCloudCustomData = - CloudCustomData.fromJson(json.decode(message.cloudCustomData!)); + CloudCustomData.fromJson(json.decode(message.cloudCustomData!)); if (messageCloudCustomData.messageReply != null) { MessageRepliedData.fromJson(messageCloudCustomData.messageReply!); return true; @@ -70,8 +76,22 @@ class MergerMessageScreenState extends TIMUIKitState { switch (type) { case MessageElemType.V2TIM_ELEM_TYPE_CUSTOM: + if (widget.messageItemBuilder?.customMessageItemBuilder != null) { + return widget.messageItemBuilder!.customMessageItemBuilder!( + message, + false, + () {}, + )!; + } return Text(TIM_t("[自定义]")); case MessageElemType.V2TIM_ELEM_TYPE_SOUND: + if (widget.messageItemBuilder?.soundMessageItemBuilder != null) { + return widget.messageItemBuilder!.soundMessageItemBuilder!( + message, + false, + () {}, + )!; + } return TIMUIKitSoundElem( chatModel: widget.model, isShowMessageReaction: false, @@ -82,6 +102,13 @@ class MergerMessageScreenState extends TIMUIKitState { localCustomInt: message.localCustomInt); case MessageElemType.V2TIM_ELEM_TYPE_TEXT: if (isReplyMessage(message)) { + if (widget.messageItemBuilder?.textReplyMessageItemBuilder != null) { + return widget.messageItemBuilder!.textReplyMessageItemBuilder!( + message, + false, + () {}, + )!; + } return TIMUIKitReplyElem( isShowMessageReaction: false, chatModel: widget.model, @@ -89,14 +116,29 @@ class MergerMessageScreenState extends TIMUIKitState { scrollToIndex: () {}, clearJump: () {}); } - - return Text( - message.textElem!.text!, - softWrap: true, - style: const TextStyle(fontSize: 16), + if (widget.messageItemBuilder?.textMessageItemBuilder != null) { + return widget.messageItemBuilder!.textMessageItemBuilder!( + message, + false, + () {}, + )!; + } + return TIMUIKitTextElem( + chatModel: widget.model, + message: message, + isFromSelf: message.isSelf ?? false, + clearJump: (){}, + isShowJump: false, + isShowMessageReaction: false, ); - // return Text(message.textElem!.text!); case MessageElemType.V2TIM_ELEM_TYPE_FACE: + if (widget.messageItemBuilder?.faceMessageItemBuilder != null) { + return widget.messageItemBuilder!.faceMessageItemBuilder!( + message, + false, + () {}, + )!; + } return TIMUIKitFaceElem( model: widget.model, isShowJump: false, @@ -104,6 +146,13 @@ class MergerMessageScreenState extends TIMUIKitState { path: message.faceElem?.data ?? "", message: message); case MessageElemType.V2TIM_ELEM_TYPE_FILE: + if (widget.messageItemBuilder?.fileMessageItemBuilder != null) { + return widget.messageItemBuilder!.fileMessageItemBuilder!( + message, + false, + () {}, + )!; + } return TIMUIKitFileElem( chatModel: widget.model, isShowMessageReaction: false, @@ -113,6 +162,13 @@ class MergerMessageScreenState extends TIMUIKitState { isSelf: isFromSelf, isShowJump: false); case MessageElemType.V2TIM_ELEM_TYPE_IMAGE: + if (widget.messageItemBuilder?.imageMessageItemBuilder != null) { + return widget.messageItemBuilder!.imageMessageItemBuilder!( + message, + false, + () {}, + )!; + } return TIMUIKitImageElem( chatModel: widget.model, isShowMessageReaction: false, @@ -121,12 +177,34 @@ class MergerMessageScreenState extends TIMUIKitState { key: Key("${message.seq}_${message.timestamp}"), ); case MessageElemType.V2TIM_ELEM_TYPE_VIDEO: + if (widget.messageItemBuilder?.videoMessageItemBuilder != null) { + return widget.messageItemBuilder!.videoMessageItemBuilder!( + message, + false, + () {}, + )!; + } return TIMUIKitVideoElem(message, chatModel: widget.model, - isFrom: "merger", isShowMessageReaction: false); + isFrom: "merger", + isShowMessageReaction: false); case MessageElemType.V2TIM_ELEM_TYPE_LOCATION: + if (widget.messageItemBuilder?.locationMessageItemBuilder != null) { + return widget.messageItemBuilder!.locationMessageItemBuilder!( + message, + false, + () {}, + )!; + } return Text(TIM_t("[位置]")); case MessageElemType.V2TIM_ELEM_TYPE_MERGER: + if (widget.messageItemBuilder?.mergerMessageItemBuilder != null) { + return widget.messageItemBuilder!.mergerMessageItemBuilder!( + message, + false, + () {}, + )!; + } return TIMUIKitMergerElem( model: widget.model, isShowJump: false, @@ -204,31 +282,36 @@ class MergerMessageScreenState extends TIMUIKitState { iconTheme: const IconThemeData( color: Colors.white, )), - body: messageList.isEmpty ? Row(children: [ - Expanded(child: Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - LoadingAnimationWidget.staggeredDotsWave( - color: theme.weakTextColor ?? Colors.grey, - size: 48, + body: messageList.isEmpty + ? Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + LoadingAnimationWidget.staggeredDotsWave( + color: theme.weakTextColor ?? Colors.grey, + size: 48, + ), + const SizedBox(height: 20), + Text(TIM_t("消息列表加载中")) + ], + )) + ], + ) + : Padding( + padding: const EdgeInsets.all(16), + child: ListView.builder( + shrinkWrap: true, + itemCount: messageList.length, + itemBuilder: (context, index) { + final message = messageList[index]; + return _itemBuilder(message, context); + }, + ), ), - const SizedBox(height: 20), - Text(TIM_t("消息列表加载中")) - ], - )) - ],) : Padding( - padding: const EdgeInsets.all(16), - child: ListView.builder( - shrinkWrap: true, - itemCount: messageList.length, - itemBuilder: (context, index) { - final messageItem = messageList[index]; - return _itemBuilder(messageItem, context); - }, - ), - ), ); } } diff --git a/pubspec.lock b/pubspec.lock index 7cbf479..90e53a0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1063,7 +1063,7 @@ packages: name: tencent_cloud_chat_sdk url: "https://pub.dartlang.org" source: hosted - version: "5.0.6" + version: "5.0.7" tencent_extended_text: dependency: "direct main" description: @@ -1091,7 +1091,7 @@ packages: name: tencent_im_base url: "https://pub.dartlang.org" source: hosted - version: "1.0.14" + version: "1.0.17" tencent_im_sdk_plugin_platform_interface: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c1bbc7e..f35fdca 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: tencent_cloud_chat_uikit description: UI components library and basic chat business logic for Tencent Cloud Chat service, helping you build In-APP Chat module easily. -version: 1.1.0 +version: 1.2.0 homepage: https://www.tencentcloud.com/products/im?from=pub repository: https://github.com/TencentCloud/tc-chat-uikit-flutter documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html @@ -62,7 +62,7 @@ dependencies: url_launcher: ^6.1.4 universal_html: ^2.0.8 link_preview_generator: ^1.2.0 - tencent_im_base: ^1.0.14 + tencent_im_base: ^1.0.17 disk_space: ^0.2.1 http: ^0.13.5 crypto: ^3.0.2