update flutter uikit to 1.7.0
This commit is contained in:
parent
8cab9d05cd
commit
b6ed4adc9c
201
CHANGELOG.md
201
CHANGELOG.md
|
|
@ -1,6 +1,15 @@
|
|||
## 1.7.0
|
||||
|
||||
* Addition: Support for quickly navigating to the first unread message in a group chat with more than 20 new unread messages, using the dynamic tongue located in the top right corner of the screen. This feature allows for swift movement through the messages, regardless of their quantity.
|
||||
* Addition: Customize the border radius for all avatars is now supported. You can set the default avatar border radius using `defaultAvatarBorderRadius` in `TIMUIKitConfig`.
|
||||
* Optimization: The delete button on the sticker sending panel has been improved for better usability.
|
||||
* Optimization: Some English labels on the screen have been updated to better reflect local expressions.
|
||||
* Fix: An issue causing errors when sending a large number of stickers has been resolved.
|
||||
* Fix: Some errors that were occurring in the sticker panel have been addressed.
|
||||
|
||||
## 1.6.2
|
||||
|
||||
* Optimize: Remove `fluttertoast`.
|
||||
* Optimization: Remove `fluttertoast`.
|
||||
* Fix: An issue that caused errors when sending files without extensions.
|
||||
|
||||
## 1.6.1
|
||||
|
|
@ -10,24 +19,23 @@
|
|||
|
||||
## 1.6.0
|
||||
|
||||
* Add: `scrollToConversation` on `TIMUIKitConversationController`. You can now easily navigate to a specific conversation in the conversation list and move to the next unread conversation by double-clicking the tab bar, [refers to our sample app](https://github.com/TencentCloud/chat-demo-flutter/blob/main/lib/src/conversation.dart).
|
||||
* Optimize: The performance of the history message list while scrolling over a large distance.
|
||||
* Addition: `scrollToConversation` on `TIMUIKitConversationController`. You can now easily navigate to a specific conversation in the conversation list and move to the next unread conversation by double-clicking the tab bar, [refers to our sample app](https://github.com/TencentCloud/chat-demo-flutter/blob/main/lib/src/conversation.dart).
|
||||
* Optimization: The performance of the history message list while scrolling over a large distance.
|
||||
|
||||
## 1.5.0+1
|
||||
|
||||
* Fix: Video message oversize.
|
||||
* Fix: An issue with video messages being oversize.
|
||||
|
||||
## 1.5.0
|
||||
|
||||
* Add: New configuration `defaultAvatarAssetPath` on global `TIMUIKitConfig`, aiming to define the default avatar.
|
||||
* Add: Supports Flutter 3.7.0.
|
||||
* Addition: New configuration `defaultAvatarAssetPath` on global `TIMUIKitConfig` to define the default avatar.
|
||||
* Addition: Supports Flutter 3.7.0.
|
||||
* Fix: `chatBgColor` configuration.
|
||||
|
||||
## 1.4.0
|
||||
|
||||
* Add: Text translation. Long press the text messages and choose `Translate`. This function can be turn off by `showTranslation` from `ToolTipsConfig`.
|
||||
* Optimize: The long press pop-up location.
|
||||
* Optimize: Keyboard pop-up event.
|
||||
* Addition: Text translation. Long press the text messages to choose `Translate`, which can be turned off by `showTranslation` from `ToolTipsConfig`.
|
||||
* Optimization: The long press pop-up location and keyboard pop-up event.
|
||||
|
||||
## 1.3.2
|
||||
|
||||
|
|
@ -35,129 +43,128 @@
|
|||
|
||||
## 1.3.1
|
||||
|
||||
* Optimize: Improve performance.
|
||||
* Optimization: Improve performance.
|
||||
|
||||
## 1.3.0
|
||||
|
||||
* Fix: Group tips not shows the nickname or remarks when transferring group owner.
|
||||
* Optimize: Remove the confirmation pop-up before opening the file.
|
||||
* Fix: A bug where group tips were not showing the nickname or remarks when transferring group owner.
|
||||
* Optimization: Remove the confirmation pop-up before opening the file.
|
||||
|
||||
## 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.
|
||||
* Fix: An issue where the input area was not showing when switching from recording to keyboard on `TIMUIKitChat`.
|
||||
* Fix: An issue where only the first receiver could receive the merged multiple forward messages.
|
||||
* Optimization: `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?from=pub).
|
||||
* Add: Sticker plug-in has been embedded in TUIKit by default. Now we support three types of stickers, Unicode Emoji, small image emoji and big image stickers, the usage has been optimized, refers to [this documentation](https://www.tencentcloud.com/document/product/1047/52227?from=pub).
|
||||
* Optimize: Themes, more customization.
|
||||
* Optimize: The animation of the input area, keyboard, sticker panel and the more panel.
|
||||
* Optimize: Emoji, both Unicode and small images, can be inserted to any position in text messages.
|
||||
* Optimize: Avatar in profile can be previewed with a large image.
|
||||
* Optimize: UserID in profile can be copied.
|
||||
* Optimize: Several UI details, including `TIMUIKitAddFriend`, `TIMUIKitAddGroup`, `TIMUIKitGroupProfile` and `TIMUIKitProfile`.
|
||||
* Optimize: `TIMUIKitGroupProfile` and `TIMUIKitProfile` can update automatically after `ID` changed.
|
||||
* Optimize: New loading animation when downloading the image/video on `TIMUIKitGroupChat`.
|
||||
* Fix: Some bugs.
|
||||
* Addition: We have added support for two new languages - Japanese and Korean.
|
||||
* Addition: You can now add other languages apart from our default ones, such as English, Chinese (Simplified and Traditional), Japanese, and Korean. You can also modify the translations using the instructions provided in [this documentation](https://www.tencentcloud.com/document/product/1047/52154?from=pub).
|
||||
* Addition: The sticker plug-in is now embedded in TUIKit by default. We support three types of stickers - Unicode Emoji, small image emoji, and big image stickers. You can refer to [this documentation](https://www.tencentcloud.com/document/product/1047/52227?from=pub) for optimized usage.
|
||||
* Optimization: Themes are now more customizable.
|
||||
* Optimization: We have optimized the animation of the input area, keyboard, sticker panel, and more panel.
|
||||
* Optimization: You can now insert both Unicode and small image emojis at any position in text messages.
|
||||
* Optimization: You can now preview profile avatars with a large image by clicking it, and copy UserIDs in profile.
|
||||
* Optimization: We have improved several UI details, including `TIMUIKitAddFriend`, `TIMUIKitAddGroup`, `TIMUIKitGroupProfile`, and `TIMUIKitProfile`.
|
||||
* Optimization: `TIMUIKitGroupProfile` and `TIMUIKitProfile` can now update automatically after the `ID` is changed.
|
||||
* Optimization: We have added a new loading animation when downloading images or videos on `TIMUIKitGroupChat`.
|
||||
* Fix: We have fixed some bugs.
|
||||
|
||||
## 1.0.1
|
||||
|
||||
* Modify: Remove `groupTRTCTipsItemBuilder` from `MessageItemBuilder`, please use `customMessageItemBuilder` instead.
|
||||
* Modify: Remove default rendering for calling messages, you can choose to use the default widgets, `CallMessageItem` and `GroupCallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart).
|
||||
* Modification: Remove `groupTRTCTipsItemBuilder` from `MessageItemBuilder`, please use `customMessageItemBuilder` instead.
|
||||
* Modification: Remove default rendering for calling messages, you can choose to use the default widgets, `CallMessageItem` and `GroupCallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart).
|
||||
|
||||
## 1.0.0
|
||||
|
||||
* Add: Support adding Flutter module to Native APP, for details, please refer to [this documentation](https://www.tencentcloud.com/document/product/1047/51456?from=pub) to implement.
|
||||
* Add: Customize sticker and Emoji for text messages. For details, please refer to [this documentation](https://cloud.tencent.com/document/product/269/80882) to modify.
|
||||
* Optimize: The loading duration for history message list, especially with lots of media and file messages.
|
||||
* Optimize: More panel area supports scroll.
|
||||
* Optimize: Load latest messages when scrolling back to bottom with more fluency.
|
||||
* Modify: It is required to provide the call record widget to `messageItemBuilder` => `customMessageItemBuilder` of `TIMUIKitChat`. You can choose to use the default widget, `CallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart).
|
||||
* Fix: The amount of photos from the album on Android.
|
||||
* Fix: The out of bounds for long text in the group profile info card.
|
||||
* Fix: Some bugs.
|
||||
* Addition: We have added support for adding Flutter module to Native APP. For implementation details, please refer to [this documentation](https://www.tencentcloud.com/document/product/1047/51456?from=pub).
|
||||
* Addition: You can now customize stickers and emojis for text messages. For more information, please refer to [this documentation](https://cloud.tencent.com/document/product/269/80882).
|
||||
* Optimization: We have improved the loading duration for history message lists, especially those with lots of media and file messages.
|
||||
* Optimization: More panel area now supports scrolling.
|
||||
* Optimization: We have made loading latest messages when scrolling back to the bottom smoother.
|
||||
* Modification: It is now required to provide the call record widget to `messageItemBuilder` => `customMessageItemBuilder` of `TIMUIKitChat`. You can choose to use the default widget, `CallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Please refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart).
|
||||
* Fix: We have fixed the issue with the number of photos from the album on Android.
|
||||
* Fix: We have fixed the issue with long text going out of bounds in the group profile info card.
|
||||
* Fix: We have resolved some bugs.
|
||||
|
||||
> **Please pay more attention to the second line and sixth line**, that some modifications are required, otherwise the module of sticker / emoji / call records will not work.
|
||||
> **Please note that modifications are required for the second and sixth lines**. Otherwise, the modules for stickers/emojis/call records will not work.
|
||||
|
||||
## 0.1.8
|
||||
|
||||
* Optimize: File batch downloading queue, allow click multiple file messages once.
|
||||
* Optimize: Group list widgets can be updated automatically.
|
||||
* Optimize: Camera capture supports relatively lower performance devices, adjusting resolution automatically.
|
||||
* Optimize: Supports customize the color and text style of the app bar, especially on TIMUIKitChat widget.
|
||||
* Fix: Friend remark or nickname can not show on group tips.
|
||||
* Fix: Crash on video playing.
|
||||
* Optimization: File batch downloading queue now allows clicking on multiple file messages at once.
|
||||
* Optimization: Group list widgets are now automatically updated.
|
||||
* Optimization: Camera capture now supports relatively lower performance devices and adjusts resolution automatically.
|
||||
* Optimization: Supports customization of the color and text style of the app bar, especially on TIMUIKitChat widget.
|
||||
* Fix: Friend remark or nickname no longer fails to show on group tips.
|
||||
* Fix: Resolved a crash when playing videos.
|
||||
* Fix: Several bugs.
|
||||
|
||||
## 0.1.7
|
||||
|
||||
* Add: Big and RAW images supported, especially for those captured from the latest version of iOS and iPhone 14 Pro series, compress and format before sending automatically.
|
||||
* Optimize: Performance and stability, especially for history message list and launching.
|
||||
* Optimize: Makes initializing the `TIMUIKitChat` an idempotent operation.
|
||||
* Optimize: Load latest messages when scrolling back to bottom.
|
||||
* Optimize: Supports Flutter both 2.x and 3.x series.
|
||||
* Fix: The issue of select photos permission.
|
||||
* Addition: Big and RAW images are now supported, especially for those captured from the latest version of iOS and iPhone 14 Pro series, with automatic compression and formatting before sending.
|
||||
* Optimization: Improved performance and stability, especially for the history message list and launching.
|
||||
* Optimization: Initializing the `TIMUIKitChat` is now an idempotent operation.
|
||||
* Optimization: Loads the latest messages when scrolling back to the bottom.
|
||||
* Optimization: Supports Flutter both 2.x and 3.x series.
|
||||
* Fix: Resolved an issue with select photos permission.
|
||||
* Fix: Several bugs.
|
||||
|
||||
## 0.1.5
|
||||
|
||||
* Add: Web supports. Now, you could implement TUIKit on iOS/Android/Web platforms.
|
||||
* Add: Disk storage checking after log in, and controls in `config` of `init`.
|
||||
* Add: `timeDividerConfig`, `notificationAndroidSound`, `isSupportMarkdownForTextMessage` and `onTapLink` to `TIMUIKitChatConfig`.
|
||||
* Remove: The default Emoji list, due to the copyright issues. You can provide your own sticker list to the panel by [tim_ui_kit_sticker_plugin](https://pub.dev/packages/tim_ui_kit_sticker_plugin).
|
||||
* Optimize: You could now choose to disable Markdown parsing for text messages.
|
||||
* Optimize: You could now choose to disable the shows for @ message in conversation list.
|
||||
* Optimize: You could now return `null` for `notificationExt`/`notificationBody` in `TIMUIKitChatConfig` and `messageRowBuilder` in `MessageItemBuilder`, to use default value up to your needs in the specific case, means you can control whether or not using customized setting based on the provided situation, without the necessary to re-define the same logic as the TUIKit in your code.
|
||||
* Optimize: Supports multiple lines for text messages.
|
||||
* Optimize: Rebuild and improve the experience of `TIMUIKitChat`. While, `TIMUIKitChatController` needs to be specified to `controller` here, like how we shows in [Demo](https://github.com/TencentCloud/tc-chat-demo-flutter/lib/src/chat.dart).
|
||||
* Addition: Web support is now available, allowing TUIKit to be implemented on iOS/Android/Web platforms.
|
||||
* Addition: Disk storage checking is now performed after login, with controls available in `config` of `init`.
|
||||
* Addition: `timeDividerConfig`, `notificationAndroidSound`, `isSupportMarkdownForTextMessage`, and `onTapLink` are added to `TIMUIKitChatConfig`.
|
||||
* Remove: The default Emoji list has been removed due to copyright issues. You can provide your own sticker list to the panel using [tim_ui_kit_sticker_plugin](https://pub.dev/packages/tim_ui_kit_sticker_plugin).
|
||||
* Optimization: You can now choose to disable Markdown parsing for text messages.
|
||||
* Optimization: You can now choose to disable shows for @ messages in the conversation list.
|
||||
* Optimization: You can now return `null` for `notificationExt`/`notificationBody` in `TIMUIKitChatConfig` and `messageRowBuilder` in `MessageItemBuilder` to use default values based on your needs in a specific case. This means you can control whether to use customized settings based on the provided situation, without having to redefine the same logic as TUIKit in your code.
|
||||
* Optimization: Supports multiple lines for text messages.
|
||||
* Optimization: Rebuilt and improved the experience of `TIMUIKitChat`. Note that `TIMUIKitChatController` needs to be specified to `controller`, as shown in the [Demo](https://github.com/TencentCloud/tc-chat-demo-flutter/lib/src/chat.dart).
|
||||
* Fix: Several bugs.
|
||||
|
||||
## 0.1.3
|
||||
|
||||
* Add: User inputting status.
|
||||
* Add: Message reactions, with sticker.
|
||||
* Add: User online status.
|
||||
* Addition: User inputting status is now available.
|
||||
* Addition: Message reactions with emoji/stickers are now available.
|
||||
* Addition: User online status is now available.
|
||||
|
||||
## 0.1.2
|
||||
|
||||
* Upgrade: flutter_record_plugin_plus to 0.0.4.
|
||||
* Upgrade: flutter_record_plugin_plus to version 0.0.4.
|
||||
|
||||
## 0.1.1
|
||||
|
||||
* Add: Lifecycle hooks for the main widgets, referring to the parameter description for details.
|
||||
* Add: Mute status display for group chat on the chat page.
|
||||
* Add: URL enrichment for text messages.
|
||||
* Add: Callback for global information (Flutter Error, Tips for Reminds, API Error) and you can display toast up to your needs.
|
||||
* Optimize: Image preview displaying.
|
||||
* Rebuild: TUIKitGroupProfile and TUIKitProfile, simplified usage.
|
||||
* Addition: Lifecycle hooks are now available for the main widgets, referring to the parameter description for details.
|
||||
* Addition: Mute status display is now available for group chat on the chat page.
|
||||
* Addition: URL enrichment is now available for text messages.
|
||||
* Addition: Callback for global information (Flutter Error, Tips for Reminds, API Error), and you can display toast as needed.
|
||||
* Optimization: Image preview display has been improved.
|
||||
* Rebuilt: TUIKitGroupProfile and TUIKitProfile have been simplified for ease of use.
|
||||
|
||||
## 0.1.0-bugfix
|
||||
|
||||
* Upgrade: Tencent IM SDK.
|
||||
* Upgrade: Tencent IM Native SDK.
|
||||
|
||||
## 0.1.0
|
||||
|
||||
* Add: Atomization widgets for TIMUIKitChat.
|
||||
* Add: Updating the UI when the message has been modified.
|
||||
* Add: The application page for joining the group.
|
||||
* Add: `updateMessage` API, users can refresh the view after modifying the local message.
|
||||
* Add: Support for Traditional Chinese.
|
||||
* Add: Customization for conversation list item.
|
||||
* Addition: Atomization widgets for TIMUIKitChat.
|
||||
* Addition: Updating the UI when the message has been modified.
|
||||
* Addition: The application page for joining the group.
|
||||
* Addition: `updateMessage` API, users can refresh the view after modifying the local message.
|
||||
* Addition: Support for Traditional Chinese.
|
||||
* Addition: Customization for conversation list item.
|
||||
|
||||
## 0.0.9
|
||||
|
||||
* Add: Offline push along with [tim_ui_kit_push_plugin](https://pub.dev/packages/tim_ui_kit_push_plugin).
|
||||
* Addition: Offline push along with [tim_ui_kit_push_plugin](https://pub.dev/packages/tim_ui_kit_push_plugin).
|
||||
* Adapt: Flutter 3.0.0.
|
||||
* Optimize: Local preview of multimedia files.
|
||||
* Optimization: Local preview of multimedia files.
|
||||
|
||||
## 0.0.8
|
||||
|
||||
* Add: Group read receipt module.
|
||||
* Add: Little tongue on the message list.
|
||||
* Add: Examples.
|
||||
* Addition: Group read receipt module.
|
||||
* Addition: Little tongue on the message list.
|
||||
* Addition: Examples.
|
||||
* Fix: Several bugs.
|
||||
|
||||
## 0.0.7
|
||||
|
|
@ -166,37 +173,37 @@
|
|||
|
||||
## 0.0.6
|
||||
|
||||
* Add: New `sendMessage` method to the controller `TIMUIKitChatController` for TIMUIKitChat.
|
||||
* Add: Configuration for TIMUIKitChat, which can control the functions for TIMUIKitChat components.
|
||||
* Addition: New `sendMessage` method to the controller `TIMUIKitChatController` for TIMUIKitChat.
|
||||
* Addition: Configuration for TIMUIKitChat, which can control the functions for TIMUIKitChat components.
|
||||
* Support: Customized for more panel customized ability to TIMUIKitChat.
|
||||
* Optimize: User authorization standardized.
|
||||
* Optimization: User authorization standardized.
|
||||
|
||||
## 0.0.5
|
||||
|
||||
* Add: Several new customized configs, includes, appBarConfig, morePanelConfig, and removed appBarActions config.
|
||||
* Optimize: Image preview displaying.
|
||||
* Addition: Several new customized configs, includes, appBarConfig, morePanelConfig, and removed appBarActions config.
|
||||
* Optimization: Image preview displaying.
|
||||
* Upgrade: Tencent IM SDK.
|
||||
* Fix: The issue of conversation item duplication for TIMUIKitConversation.
|
||||
|
||||
## 0.0.4
|
||||
|
||||
* Optimize: TIMUIKitChat, especially for media files selector.
|
||||
* Optimize: Previewing of image messages, video messages.
|
||||
* Optimize: Theme color.
|
||||
* Optimize: UI for search components.
|
||||
* Optimization: TIMUIKitChat, especially for media files selector.
|
||||
* Optimization: Previewing of image messages, video messages.
|
||||
* Optimization: Theme color.
|
||||
* Optimization: UI for search components.
|
||||
* Upgrade: Tencent IM SDK.
|
||||
|
||||
## 0.0.3
|
||||
|
||||
* Add: TIMUIKitSearch and TIMUIKitSearchMsgDetail, supports searching both in conversation and globally.
|
||||
* Add: TIMUIKitAddFriend.
|
||||
* Add: TIMUIKitAddGroup.
|
||||
* Add: Theme style configuration.
|
||||
* Optimize: Internationalization.
|
||||
* Addition: TIMUIKitSearch and TIMUIKitSearchMsgDetail, supports searching both in conversation and globally.
|
||||
* Addition: TIMUIKitAddFriend.
|
||||
* Addition: TIMUIKitAddGroup.
|
||||
* Addition: Theme style configuration.
|
||||
* Optimization: Internationalization.
|
||||
|
||||
## 0.0.2
|
||||
|
||||
* Optimize: TIMUIKitChat.
|
||||
* Optimization: TIMUIKitChat.
|
||||
* Fix: Bugs on Internationalization.
|
||||
|
||||
## 0.0.1
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
|
||||
| 会话列表用户在线状态 | 通讯录用户在线状态 |
|
||||
|---------|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/ca1c22cc3452f77186dcadde610626af.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/90a6a5ac3a54b4289f3ae473f61c1ed2.png" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/0353c92f612c22d11352b19d03c9c44c.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/4c0bcc45cab028507df6675e1d242cb9.jpg" /> |
|
||||
|
||||
#### 获取用户在线状态
|
||||
|
||||
|
|
@ -72,7 +72,7 @@
|
|||
|
||||
| 通讯录 |
|
||||
|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/47db4f2a1f6ba187ab9f14e1ce3aa470.png" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/4c0bcc45cab028507df6675e1d242cb9.jpg" /> |
|
||||
|
||||
### 好友关系
|
||||
|
||||
|
|
@ -147,10 +147,6 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群
|
|||
|
||||
群组资料是指单个群组维度的属性,包括群名称、简介、公告、群主等,以及群组维度自定义字段。
|
||||
|
||||
| Meeting 群 | Public 群 |
|
||||
|---------|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/80ce0f7c90b3a2116d00a21154a5cc4c.jpg" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/f2c6b0d3badea438b15a49ad5cb6933b.jpg" /> |
|
||||
|
||||
##### 获取群资料
|
||||
|
||||
在客户端上,可调用 [`getGroupsInfo`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMGroupManager/getGroupsInfo.html) 方法,获取特定群组资料详情。
|
||||
|
|
@ -187,7 +183,7 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群
|
|||
|
||||
| 会话列表 |
|
||||
|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/0f7ab6ee29f36a1faff6f933a06223d9.jpg" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/0353c92f612c22d11352b19d03c9c44c.png" /> |
|
||||
|
||||
#### 获取会话列表
|
||||
|
||||
|
|
@ -217,9 +213,9 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群
|
|||
|
||||
置顶状态会存储在服务器,切换终端设备后,置顶状态会同步到新设备上。
|
||||
|
||||
| 置顶的会话,注意最上方 “Yifan” 会话 |
|
||||
| 置顶的会话,注意最上方第一条 |
|
||||
|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/0f7ab6ee29f36a1faff6f933a06223d9.jpg" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/0353c92f612c22d11352b19d03c9c44c.png" /> |
|
||||
|
||||
置顶会话,通过客户端 [`pinConversation`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMConversationManager/pinConversation.html) 即可。
|
||||
|
||||
|
|
@ -260,7 +256,7 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群
|
|||
|
||||
| 引用回复文本 | [表情回应](https://cloud.tencent.com/document/product/269/85906) |
|
||||
|---------|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/826d1f6c230b29aadcf62b0b1a53b3c6.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/d9b075b14d89d5394d22c01e43cd7e05.jpg" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/cf6ded385d08f6ce4e3fde708e7dd588.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/0a7532c8c59a40fd4d548bfc64e1d119.png" /> |
|
||||
|
||||
#### 引用回复文本
|
||||
|
||||
|
|
@ -296,7 +292,7 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群
|
|||
|
||||
| 发送表情回应 [TUIKit](https://cloud.tencent.com/document/product/269/85906) | 表情回应详情 [TUIKit](https://cloud.tencent.com/document/product/269/85906) |
|
||||
|---------|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/d9b075b14d89d5394d22c01e43cd7e05.jpg" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/678ae70ae8f810b50b0e57946306a329.jpg" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/0a7532c8c59a40fd4d548bfc64e1d119.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/1f0930f86d405fc6e79bb607b762dbc8.png" /> |
|
||||
|
||||
**下面介绍实施细节:**
|
||||
|
||||
|
|
@ -346,7 +342,7 @@ messageReactions: [
|
|||
|
||||
| 全局搜索 | 会话内搜索 |
|
||||
|---------|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/3ae930db6fae191337885529f3e94543.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/e4b17eff7775be1f2e12efa7ff92d309.png" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/2a79909010aad73f0fe9cfec33c66857.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/739aaa8f9df01b0646aa3e66faceea5b.png" /> |
|
||||
|
||||
### 转发消息
|
||||
|
||||
|
|
@ -354,7 +350,7 @@ messageReactions: [
|
|||
|
||||
| 合并转发消息 | 合并消息详细内容 |
|
||||
|---------|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/8d569af68336d64b0e64ca294048fa10.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/a8aa1f4c3c11713a2f9e19fdfae8bc8a.png" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/61833485e037eb9bef71a618744e233a.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/07c14e870093f514755303ca9efe34a9.png" /> |
|
||||
|
||||
逐条转发消息,需要先在客户端调用 [`createForwardMessage`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMMessageManager/createForwardMessage.html) 方法创建一条和原消息内容完全一样的转发消息,再调用 [`sendMessage`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMMessageManager/sendMessage.html) 方法把转发消息发送出去。
|
||||
|
||||
|
|
@ -378,7 +374,7 @@ messageReactions: [
|
|||
|
||||
| 消息翻译 |
|
||||
|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/d0e184a60525316d067e100702b7a8a9.png" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/678b9d364dcd0e3f3924d66ef2ae9a1c.png" /> |
|
||||
|
||||
对于文本类型的消息,您可在客户端上调用 [`translateText`](https://im.sdk.qcloud.com/doc/zh-cn/classcom_1_1tencent_1_1imsdk_1_1v2_1_1V2TIMMessageManager.html#a1e1806c27bc7b76a3b816492ed9cbe5c) 方法,将待翻译文本列表和目标语言传至我们的服务端。原语言可由您自行判断,也可由我们判断。
|
||||
|
||||
|
|
@ -392,7 +388,7 @@ messageReactions: [
|
|||
|
||||
| 单聊,[TUIKit](https://cloud.tencent.com/document/product/269/85905)中以文字承载 | 群聊,[TUIKit](https://cloud.tencent.com/document/product/269/85905)中以圆圈承载 |
|
||||
|---------|---------|
|
||||
| <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/48a728ec352b4d593a9e39878caea189.jpg" /> | <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/2c35eb7b775c974bda6420193feb4615.jpg" /> |
|
||||
| <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/fe8aac1b9c3d38aaa81362fa66bd1276.png" /> | <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/3540692e8d43871d445a1a643fa74b50.png" /> |
|
||||
|
||||
|
||||
是否启用此功能,可根据您的社交业务需求决定。
|
||||
|
|
@ -413,7 +409,7 @@ messageReactions: [
|
|||
|
||||
| 已读 群成员 | 未读 群成员 |
|
||||
|---------|---------|
|
||||
| <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/a10c1e9b99b6b422b6c18c9800ce5bb1.jpg" /> | <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/c561fd2902d946f98a992eb1f7335b92.jpg" /> |
|
||||
| <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/16f2c468b375024f5e70345d657d0f73.png" /> | <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/916906e7bfb688719e6e96af8540a9c8.png" /> |
|
||||
|
||||
### 群内@消息
|
||||
|
||||
|
|
@ -423,7 +419,7 @@ messageReactions: [
|
|||
|
||||
| 监听 @ 字符选择群成员 | 编辑群 @ 消息发送 | 收到群 @ 消息 |
|
||||
|---------|---------|---------|
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/2cabd456df97fa93080f715962ea0d0b.jpg" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/6de66fb0bbdeb28013f2e16e01a05908.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/9bd023628e15570e07250f5e7782387a.png" /> |
|
||||
| <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/40ff8252c910c955a581ea498463d82a.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/71d01c4845b9bbab37585f4968d84ca4.png" /> | <img style="width:250px" src="https://qcloudimg.tencent-cloud.cn/raw/ecfeb41da226a6f8d7162bc935f3aaf6.png" /> |
|
||||
|
||||
>? 图一:在聊天界面监听到输入框输入 "@" 字符后,可跳转到群成员选择界面,选择需要 @ 的群成员。
|
||||
>图二:在群成员选择完成后,重新返回聊天界面,继续编辑群 @ 消息发送。
|
||||
|
|
@ -443,7 +439,7 @@ messageReactions: [
|
|||
|
||||
| 电脑端 | 手机移动端 |
|
||||
|---------|---------|
|
||||
| <img style="width:600px" src="https://qcloudimg.tencent-cloud.cn/raw/8644dd2335809cebc8058b75dfc8f14e.png" /> | <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/8df8e5b3204b22555ddd022c1a1c5715.jpg" /> |
|
||||
| <img style="width:600px" src="https://qcloudimg.tencent-cloud.cn/raw/c0e7e53a523390afa016e3c3c16d28dd.png" /> | <img style="width:200px" src="https://qcloudimg.tencent-cloud.cn/raw/a9d407a28d09f04602327b9fa12f5a08.png" /> |
|
||||
|
||||
### 更多丰富的消息形态
|
||||
|
||||
|
|
@ -504,7 +500,7 @@ messageReactions: [
|
|||
|
||||
特别是对于社交场景下的用户们,他们一定有很多想法想要交流与诉说。
|
||||
|
||||
因此,我们也强烈推荐您,再继承我们的音视频通话能力,一步到位,完成一对一或多人群组的音频/视频通话,并且支持离线唤起能力。
|
||||
因此,我们也强烈推荐您,再集成我们的音视频通话能力,一步到位,完成一对一或多人群组的音频/视频通话,并且支持离线唤起能力。
|
||||
|
||||
[详情可查看此文档](https://cloud.tencent.com/document/product/269/84296)。
|
||||
|
||||
|
|
|
|||
|
|
@ -38,14 +38,12 @@ class TIMUIKitChatExample extends StatelessWidget {
|
|||
GroupReceiptAllowType.public
|
||||
],
|
||||
),
|
||||
conversationID: _getConversationID() ?? "10040818",
|
||||
// Please fill in here according to the actual cleaning
|
||||
conversationShowName: selectedConversation?.showName ??
|
||||
selectedConversation?.userID ??
|
||||
selectedConversation?.groupID ??
|
||||
"Test Chat",
|
||||
// Please fill in here according to the actual cleaning
|
||||
conversationType: ConvType.values[selectedConversation?.type ?? 1],
|
||||
conversation: selectedConversation ??
|
||||
V2TimConversation(
|
||||
conversationID: "c2c_10040818",
|
||||
userID: "10040818",
|
||||
showName: "Test Chat",
|
||||
type: 1),
|
||||
appBarConfig: AppBar(
|
||||
actions: [
|
||||
IconButton(
|
||||
|
|
|
|||
|
|
@ -5,10 +5,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201"
|
||||
sha256: "569ddca58d535e601dd1584afa117710abc999d036c0cd2c51777fb257df78e8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "52.0.0"
|
||||
version: "53.0.0"
|
||||
adaptive_action_sheet:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -21,10 +21,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4
|
||||
sha256: "10927c4b7c7c88b1adbca278c3d5531db92e2f4b4abf04e2919a800af965f3f5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.4.0"
|
||||
version: "5.5.0"
|
||||
archive:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -37,10 +37,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611"
|
||||
sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.4.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -245,10 +245,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: extended_image
|
||||
sha256: "5854d0d05ee0c687d1852af9db05f15cfe058520fa56f417075705c5bce965d4"
|
||||
sha256: a6b738d9b8d5513be72c545cc3e9c5c451fbee77c8db3cbec7c32ae85b82fb93
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.4.0"
|
||||
version: "6.4.1"
|
||||
extended_image_library:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -359,10 +359,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: flutter_markdown
|
||||
sha256: "818cf6c28377ba2c91ed283c96fd712e9c175dd2d2488eb7fc93b6afb9ad2e08"
|
||||
sha256: "7b25c10de1fea883f3c4f9b8389506b54053cd00807beab69fd65c8653a2711f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.13+1"
|
||||
version: "0.6.14"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -481,18 +481,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: image_picker
|
||||
sha256: f98d76672d309c8b7030c323b3394669e122d52b307d2bbd8d06bd70f5b2aabe
|
||||
sha256: d39cc12402dab8365fe5b5370e64694ae0223d675c36b15ff0490b7cc3d32551
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.6+1"
|
||||
version: "0.8.6+2"
|
||||
image_picker_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_android
|
||||
sha256: b1cbfec0f5aef427a18eb573f5445af8c9c568626bf3388553e40c263d3f7368
|
||||
sha256: "385f12ee9c7288575572c7873a332016ec45ebd092e1c2f6bd421b4a9ad21f1d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.5+5"
|
||||
version: "0.8.5+6"
|
||||
image_picker_for_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -505,10 +505,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_ios
|
||||
sha256: "8ffb14b43713d7c43fb21299cc18181cc5b39bd3ea1cc427a085c6400fe5aa52"
|
||||
sha256: "884ed71165bc01ffe1b0b7813e6fa17e1e9442da974656f99b79a292371303d6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.6+7"
|
||||
version: "0.8.6+8"
|
||||
image_picker_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -585,10 +585,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: markdown
|
||||
sha256: c2b81e184067b41d0264d514f7cdaa2c02d38511e39d6521a1ccc238f6d7b3f2
|
||||
sha256: b3c60dee8c2af50ad0e6e90cceba98e47718a6ee0a7a6772c77846a0cc21f78b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.1"
|
||||
version: "7.0.1"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -745,10 +745,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
|
||||
sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.7"
|
||||
version: "2.1.8"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1062,33 +1062,33 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: tencent_cloud_chat_sdk
|
||||
sha256: "3b3349dec74f60cff9cd85cb865c41d60afb472b451f5124f2e8318df037cc7f"
|
||||
sha256: "32b7e40c5a1682b3ee85daa73504af3d0d4e60a93472b279591e769b15b4861c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.8"
|
||||
version: "5.0.9"
|
||||
tencent_cloud_chat_uikit:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: ".."
|
||||
relative: true
|
||||
source: path
|
||||
version: "1.6.2"
|
||||
version: "1.7.0"
|
||||
tencent_extended_text:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: tencent_extended_text
|
||||
sha256: "27a2f7ee58ada480e295102471f1733a7402178a239d0c80a7aa33a134c641ef"
|
||||
sha256: cf0d283c01a9e63f75666d8b5b1cabd463e18e51802bf1d093d7a65bd369b3d4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
version: "1.0.2+1"
|
||||
tencent_extended_text_field:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: tencent_extended_text_field
|
||||
sha256: d311c240983dbf78e31b58f91e425920a40d6564942813e692a3419bf5c9deb0
|
||||
sha256: daa10f3775bfac1cc841b34275c2746ced7764f3b77222a93edb4c13bad1209b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
version: "1.0.1+2"
|
||||
tencent_extended_text_library:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1101,26 +1101,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: tencent_im_base
|
||||
sha256: bbd2d70c82b018ce86c421f0b4eb02f650456d0bbd7ea5558110139c7b04c4b4
|
||||
sha256: b5917ff0bae7c31d52f54932349fc400d3752719a1c5a2f0209258f85c7a6c07
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.21"
|
||||
version: "1.0.26"
|
||||
tencent_im_sdk_plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: tencent_im_sdk_plugin_platform_interface
|
||||
sha256: "5dd3e957e7db00e3d785978b4b163e36376b9c5a481ed4f5d746876f1e408b62"
|
||||
sha256: "7aff6a8495eae3efc3aed1ed944bab7a0ce7eb1035d09b3f3d7974bcb3d8b137"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.11"
|
||||
version: "0.3.12"
|
||||
tencent_im_sdk_plugin_web:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: tencent_im_sdk_plugin_web
|
||||
sha256: "4bc10531473c83f1d5c644a8aee88149464b80908c965ea7c4f402a2e99336d6"
|
||||
sha256: d83a2370398948bccdc3fa4aae33840bcee62d78faa288823a02d9e0e4ab677f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.6"
|
||||
version: "0.3.7"
|
||||
tencent_keyboard_visibility:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1133,10 +1133,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: tencent_open_file
|
||||
sha256: d60878fe1e5a1317607851d81ad78f395b8411418587de16cf1cd48cb662aa18
|
||||
sha256: "98cbffe55e3245a308fbf76e18c9a0f808e534c624bc1a1cc0a00bd63a418290"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.9"
|
||||
version: "4.0.9+1"
|
||||
tencent_super_tooltip:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1149,10 +1149,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: tencent_wechat_camera_picker
|
||||
sha256: "8f95b435c7a12a9221f00fe4354fb9c0f9313d79cc09ddb5902b7b418185092d"
|
||||
sha256: "6a6fd12d61ad2ef17273a226a165fe0b5e3ef5c7e49779de38503e4f4b6e3ef1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.6.5+1"
|
||||
version: "3.6.5+2"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1173,18 +1173,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: tim_ui_kit_sticker_plugin
|
||||
sha256: "5f6ec1c713718b185f920629024a4d135eead61b3735287dc80950710e2daa33"
|
||||
sha256: cd5d6e2380deaf73e420602bbfe3da36c0f3253adc531f76e139efec80671175
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.2.0"
|
||||
transparent_image:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: transparent_image
|
||||
sha256: e566a616922a781489f4d91cc939b1b3203b6e4a093317805f2f82f0bb0f8dec
|
||||
sha256: e8991d955a2094e197ca24c645efec2faf4285772a4746126ca12875e54ca02f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
version: "2.0.1"
|
||||
tuple:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1205,18 +1205,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: universal_html
|
||||
sha256: "5ff50b7c14d201421cf5230ec389a0591c4deb5c817c9d7ccca3b26fe5f31e34"
|
||||
sha256: b5061c64c7c863c12e46279e032976f1c274f927fb3589b52b5928dcd2d52f7c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.8"
|
||||
version: "2.0.9"
|
||||
universal_io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: universal_io
|
||||
sha256: "79f78ddad839ee3aae3ec7c01eb4575faf0d5c860f8e5223bc9f9c17f7f03cef"
|
||||
sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.4"
|
||||
version: "2.2.0"
|
||||
url_launcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1413,10 +1413,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86
|
||||
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.0+3"
|
||||
version: "1.0.0"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -1,16 +1,11 @@
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'dart:math';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
// ignore: unnecessary_import
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/models/link_preview_content.dart';
|
||||
import 'package:tencent_im_base/tencent_im_base.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/chat_life_cycle.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_model_tools.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
|
||||
|
|
@ -20,9 +15,13 @@ import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.
|
|||
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
enum LoadDirection {
|
||||
previous,
|
||||
latest
|
||||
}
|
||||
|
||||
class TUIChatSeparateViewModel extends ChangeNotifier {
|
||||
final FriendshipServices _friendshipServices =
|
||||
serviceLocator<FriendshipServices>();
|
||||
|
|
@ -39,6 +38,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
String conversationID = "";
|
||||
ConvType? conversationType;
|
||||
bool haveMoreData = false;
|
||||
bool haveMoreLatestData = false;
|
||||
String _currentSelectedMsgId = "";
|
||||
String _editRevokedMsg = "";
|
||||
GroupReceiptAllowType? _groupType;
|
||||
|
|
@ -202,18 +202,76 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
_isInit = true;
|
||||
}
|
||||
|
||||
Future<bool> loadListForSpecificMessage({
|
||||
required int seq,
|
||||
}) async {
|
||||
List<V2TimMessage> msgList = [];
|
||||
haveMoreData = false;
|
||||
|
||||
final previousResponse = await _messageService.getHistoryMessageListWithComplete(
|
||||
count: 20,
|
||||
getType: HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG,
|
||||
userID: conversationType == ConvType.c2c ? conversationID : null,
|
||||
groupID: conversationType == ConvType.group ? conversationID : null,
|
||||
lastMsgSeq: max(seq, 0)
|
||||
);
|
||||
msgList = previousResponse?.messageList ?? [];
|
||||
haveMoreData = !(previousResponse?.isFinished ?? false);
|
||||
|
||||
// final latestResponse = await _messageService.getHistoryMessageListWithComplete(
|
||||
// count: 20,
|
||||
// getType: HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_NEWER_MSG,
|
||||
// userID: conversationType == ConvType.c2c ? conversationID : null,
|
||||
// groupID: conversationType == ConvType.group ? conversationID : null,
|
||||
// lastMsgSeq: max(seq - 1, 0)
|
||||
// );
|
||||
// msgList = [...(latestResponse?.messageList.reversed ?? []), ...msgList];
|
||||
haveMoreLatestData = true;
|
||||
globalModel.setMessageListPosition(conversationID, HistoryMessagePosition.notShowLatest);
|
||||
|
||||
msgList = await lifeCycle?.didGetHistoricalMessageList(msgList) ?? msgList;
|
||||
msgList.insert(0, V2TimMessage(
|
||||
userID: '',
|
||||
isSelf: false,
|
||||
elemType: 101,
|
||||
msgID: msgList[0].msgID,
|
||||
seq: msgList[0].seq,
|
||||
timestamp: 9999
|
||||
));
|
||||
globalModel.setMessageList(conversationID, msgList,
|
||||
needResetNewMessageCount: false);
|
||||
|
||||
if (chatConfig.isShowGroupReadingStatus &&
|
||||
conversationType == ConvType.group) {
|
||||
_getMsgReadReceipt(msgList);
|
||||
}
|
||||
if (chatConfig.isReportGroupReadingStatus &&
|
||||
conversationType == ConvType.group) {
|
||||
_setMsgReadReceipt(msgList);
|
||||
}
|
||||
|
||||
return haveMoreData;
|
||||
}
|
||||
|
||||
Future<bool> loadData({
|
||||
HistoryMsgGetTypeEnum getType =
|
||||
HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG,
|
||||
HistoryMsgGetTypeEnum? getType,
|
||||
int lastMsgSeq = -1,
|
||||
required int count,
|
||||
String? lastMsgID,
|
||||
LoadDirection direction = LoadDirection.previous,
|
||||
}) async {
|
||||
haveMoreData = false;
|
||||
// TODO: 这个函数写的也太复杂了,现在就先不动了,到时候2.0大版本得彻底改造下QAQ
|
||||
if(direction == LoadDirection.latest){
|
||||
haveMoreLatestData = false;
|
||||
}else{
|
||||
haveMoreData = false;
|
||||
}
|
||||
final currentHistoryMsgList = globalModel.messageListMap[conversationID];
|
||||
final response = await _messageService.getHistoryMessageListWithComplete(
|
||||
count: count,
|
||||
getType: getType,
|
||||
getType: getType ?? (direction == LoadDirection.previous
|
||||
? HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG
|
||||
: HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_NEWER_MSG),
|
||||
userID: conversationType == ConvType.c2c ? conversationID : null,
|
||||
groupID: conversationType == ConvType.group ? conversationID : null,
|
||||
lastMsgID: lastMsgID,
|
||||
|
|
@ -221,9 +279,19 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
if (response == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lastMsgID != null && currentHistoryMsgList != null) {
|
||||
final messageList = response.messageList;
|
||||
final newList = [...currentHistoryMsgList, ...messageList];
|
||||
List<V2TimMessage> messageList = response.messageList;
|
||||
List<V2TimMessage> newList = [];
|
||||
|
||||
if(direction == LoadDirection.latest){
|
||||
globalModel.receivedNewMessageCount = globalModel.receivedMessageListCount + messageList.length;
|
||||
messageList = messageList.reversed.toList();
|
||||
newList = [...messageList, ...currentHistoryMsgList];
|
||||
}else{
|
||||
newList = [...currentHistoryMsgList, ...messageList];
|
||||
}
|
||||
|
||||
final List<V2TimMessage> msgList =
|
||||
await lifeCycle?.didGetHistoricalMessageList(newList) ?? newList;
|
||||
globalModel.setMessageList(conversationID, msgList,
|
||||
|
|
@ -234,28 +302,26 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
response.messageList;
|
||||
if (globalModel.loadingMessage[conversationID] != null) {
|
||||
if (globalModel.loadingMessage[conversationID]!.isNotEmpty) {
|
||||
messageList = [
|
||||
...?globalModel.loadingMessage[conversationID],
|
||||
...messageList
|
||||
];
|
||||
if(direction == LoadDirection.previous){
|
||||
messageList = [
|
||||
...?globalModel.loadingMessage[conversationID],
|
||||
...messageList
|
||||
];
|
||||
}else{
|
||||
messageList = messageList.reversed.toList();
|
||||
messageList = [
|
||||
...messageList,
|
||||
...?globalModel.loadingMessage[conversationID],
|
||||
];
|
||||
}
|
||||
} else {
|
||||
globalModel.loadingMessage.remove(conversationID);
|
||||
}
|
||||
}
|
||||
globalModel.setMessageList(conversationID, messageList,
|
||||
needResetNewMessageCount: false);
|
||||
// The messages in first screen
|
||||
}
|
||||
haveMoreData = !response.isFinished;
|
||||
|
||||
// if (response.isEmpty ||
|
||||
// (!PlatformUtils().isWeb && response.length < count) ||
|
||||
// (PlatformUtils().isWeb && response.length < min(count, 20))) {
|
||||
// haveMoreData = false;
|
||||
// } else {
|
||||
// haveMoreData = true;
|
||||
// }
|
||||
// notifyListeners();
|
||||
if (chatConfig.isShowGroupReadingStatus &&
|
||||
conversationType == ConvType.group &&
|
||||
response.messageList.isNotEmpty) {
|
||||
|
|
@ -266,6 +332,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
response.messageList.isNotEmpty) {
|
||||
_setMsgReadReceipt(response.messageList);
|
||||
}
|
||||
|
||||
if(direction == LoadDirection.latest){
|
||||
haveMoreLatestData = !response.isFinished;
|
||||
if(!haveMoreLatestData){
|
||||
globalModel.setMessageListPosition(conversationID, HistoryMessagePosition.inTwoScreen);
|
||||
}
|
||||
}else{
|
||||
haveMoreData = !response.isFinished;
|
||||
}
|
||||
return haveMoreData;
|
||||
}
|
||||
|
||||
|
|
@ -322,6 +397,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
|
||||
markMessageAsRead() async {
|
||||
globalModel.unreadCountForConversation = 0;
|
||||
// globalModel.receivedNewMessageCount = 0;
|
||||
if (conversationType == ConvType.c2c) {
|
||||
return _messageService.markC2CMessageAsRead(userID: conversationID);
|
||||
}
|
||||
|
|
@ -455,7 +531,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
})
|
||||
: "",
|
||||
);
|
||||
if (isEditStatusMessage == false) {
|
||||
if (isEditStatusMessage == false && globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
globalModel.updateMessage(
|
||||
sendMsgRes, convID, id, convType, groupType, setInputField);
|
||||
}
|
||||
|
|
@ -493,13 +569,16 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
id: textATMessageInfo.id as String,
|
||||
|
|
@ -528,13 +607,16 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
id: textATMessageInfo.id as String,
|
||||
|
|
@ -564,12 +646,14 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
notifyListeners();
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
notifyListeners();
|
||||
}
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
id: textMessageInfo.id as String,
|
||||
|
|
@ -601,13 +685,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
notifyListeners();
|
||||
}
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
id: soundMessageInfo.id as String,
|
||||
|
|
@ -777,6 +863,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest){
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
|
|
@ -784,6 +871,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
messageInfo: lifeCycleMsg ?? messageInfoWithSender,
|
||||
|
|
@ -821,13 +909,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
notifyListeners();
|
||||
}
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
messageInfo: lifeCycleMsg ?? messageInfoWithSender,
|
||||
|
|
@ -864,13 +954,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
notifyListeners();
|
||||
}
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
messageInfo: lifeCycleMsg ?? messageInfoWithSender,
|
||||
|
|
@ -903,13 +995,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) {
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
notifyListeners();
|
||||
}
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
id: locationMessageInfo.id as String,
|
||||
|
|
@ -1109,13 +1203,17 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
|
||||
notifyListeners();
|
||||
if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest){
|
||||
currentHistoryMsgList = [
|
||||
lifeCycleMsg ?? messageInfoWithSender,
|
||||
...currentHistoryMsgList
|
||||
];
|
||||
globalModel.setMessageList(conversationID, currentHistoryMsgList);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
||||
return _sendMessage(
|
||||
convID: convID,
|
||||
id: textMessageInfo.id as String,
|
||||
|
|
@ -1279,16 +1377,9 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
}
|
||||
|
||||
showLatestUnread() {
|
||||
// List<V2TimMessage> currentMsgList = getOriginMessageList();
|
||||
// currentMsgList = [
|
||||
// ...?globalModel.tempMessageListMap[conversationID],
|
||||
// ...currentMsgList
|
||||
// ];
|
||||
markMessageAsRead();
|
||||
globalModel.setMessageListPosition(
|
||||
conversationID, HistoryMessagePosition.bottom);
|
||||
// globalModel.setTempMessageList(conversationID, []);
|
||||
// globalModel.setMessageList(conversationID, currentMsgList);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart';
|
|||
|
||||
enum ConvType { none, c2c, group }
|
||||
|
||||
enum HistoryMessagePosition { bottom, inTwoScreen, awayTwoScreen }
|
||||
enum HistoryMessagePosition { bottom, inTwoScreen, awayTwoScreen, notShowLatest }
|
||||
|
||||
class CurrentConversation {
|
||||
final String conversationID;
|
||||
|
|
@ -182,6 +182,10 @@ class TUIChatGlobalModel extends ChangeNotifier with TIMUIKitClass {
|
|||
return _receivedNewMessageCount;
|
||||
}
|
||||
|
||||
set receivedNewMessageCount(int value) {
|
||||
_receivedNewMessageCount = value;
|
||||
}
|
||||
|
||||
int get unreadCountForConversation => _unreadCountForConversation;
|
||||
|
||||
List<V2TimGroupApplication> get groupApplicationList =>
|
||||
|
|
@ -596,7 +600,11 @@ class TUIChatGlobalModel extends ChangeNotifier with TIMUIKitClass {
|
|||
_checkFromUserisActive(msgComing);
|
||||
final convID = newMsg.userID ?? newMsg.groupID;
|
||||
if (convID != null && convID == currentSelectedConv) {
|
||||
if (getMessageListPosition(convID) == HistoryMessagePosition.bottom &&
|
||||
final position = getMessageListPosition(convID);
|
||||
if(position == HistoryMessagePosition.notShowLatest){
|
||||
return;
|
||||
}
|
||||
if (position == HistoryMessagePosition.bottom &&
|
||||
unreadCountForConversation == 0) {
|
||||
markMessageAsRead(
|
||||
convID: convID,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
class TIMUIKitConfig {
|
||||
/// Control if show online status of friends or contacts.
|
||||
/// This only works with [Ultimate Edition].
|
||||
|
|
@ -13,8 +15,12 @@ class TIMUIKitConfig {
|
|||
/// The asset path of the default avatar image.
|
||||
final String? defaultAvatarAssetPath;
|
||||
|
||||
/// The configuration of border radius for all the avatar shows in TUIKit.
|
||||
final BorderRadius? defaultAvatarBorderRadius;
|
||||
|
||||
const TIMUIKitConfig({
|
||||
this.defaultAvatarAssetPath,
|
||||
this.defaultAvatarBorderRadius,
|
||||
this.isCheckDiskStorageSpace = true,
|
||||
this.isShowOnlineStatus = true,
|
||||
});
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -660,5 +660,7 @@
|
|||
"k_003nvk2": "消息",
|
||||
"k_03agld7": "群提示",
|
||||
"k_002wkr3": "翻译",
|
||||
"k_13g4hxv": "翻译完成"
|
||||
"k_13g4hxv": "翻译完成",
|
||||
"k_1qqgjra": "$option3条未读消息",
|
||||
"k_0uubyjr": "以下为未读消息"
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -25,6 +25,7 @@ class TIMUIKitChatController {
|
|||
int lastMsgSeq = -1,
|
||||
required int count,
|
||||
String? lastMsgID,
|
||||
LoadDirection direction = LoadDirection.previous
|
||||
}) async {
|
||||
return await model?.loadData(
|
||||
count: count,
|
||||
|
|
|
|||
|
|
@ -100,10 +100,10 @@ class MessageUtils {
|
|||
}
|
||||
}
|
||||
|
||||
static String? _getOpUserNick(V2TimGroupMemberInfo opUser) {
|
||||
return TencentUtils.checkString(opUser.friendRemark) ??
|
||||
TencentUtils.checkString(opUser.nickName) ??
|
||||
TencentUtils.checkString(opUser.userID);
|
||||
static String? _getOpUserNick(V2TimGroupMemberInfo? opUser) {
|
||||
return TencentUtils.checkString(opUser?.friendRemark) ??
|
||||
TencentUtils.checkString(opUser?.nickName) ??
|
||||
TencentUtils.checkString(opUser?.userID) ?? "";
|
||||
}
|
||||
|
||||
static String? _getMemberNickName(V2TimGroupMemberInfo e) {
|
||||
|
|
|
|||
|
|
@ -14,6 +14,19 @@ class OptimizeUtils {
|
|||
};
|
||||
}
|
||||
|
||||
static multiThrottle(Function func, int milliseconds) {
|
||||
bool enable = true;
|
||||
return (val1, val2) {
|
||||
if (enable == true) {
|
||||
enable = false;
|
||||
Future.delayed(Duration(milliseconds: milliseconds), () {
|
||||
enable = true;
|
||||
func(val1, val2);
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static debounce(
|
||||
Function func, [
|
||||
Duration delay = const Duration(milliseconds: 100),
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ enum MessageListTongueType {
|
|||
none,
|
||||
toLatest,
|
||||
showUnread,
|
||||
showPrevious,
|
||||
atMe,
|
||||
atAll,
|
||||
}
|
||||
|
|
@ -31,8 +32,11 @@ class TIMUIKitHistoryMessageListTongue extends TIMUIKitStatelessWidget {
|
|||
/// total amount of messages at me
|
||||
final String atNum;
|
||||
|
||||
final int previousCount;
|
||||
|
||||
TIMUIKitHistoryMessageListTongue({
|
||||
Key? key,
|
||||
required this.previousCount,
|
||||
required this.valueType,
|
||||
required this.onClick,
|
||||
required this.unreadCount,
|
||||
|
|
@ -51,6 +55,7 @@ class TIMUIKitHistoryMessageListTongue extends TIMUIKitStatelessWidget {
|
|||
unreadCount: unreadCount,
|
||||
valueType: valueType,
|
||||
atNum: atNum,
|
||||
previousCount: previousCount,
|
||||
);
|
||||
}
|
||||
return valueType != MessageListTongueType.none ? tongueItem : Container();
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:scroll_to_index/scroll_to_index.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
|
||||
import 'package:tencent_im_base/tencent_im_base.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';
|
||||
|
|
@ -17,15 +18,17 @@ class TIMUIKitHistoryMessageListTongueContainer extends StatefulWidget {
|
|||
final Function(String targetSeq) scrollToIndexBySeq;
|
||||
final AutoScrollController scrollController;
|
||||
final TUIChatSeparateViewModel model;
|
||||
final V2TimConversation conversation;
|
||||
|
||||
const TIMUIKitHistoryMessageListTongueContainer(
|
||||
{Key? key,
|
||||
this.tongueItemBuilder,
|
||||
this.groupAtInfoList,
|
||||
required this.scrollToIndexBySeq,
|
||||
required this.scrollController,
|
||||
required this.model})
|
||||
: super(key: key);
|
||||
const TIMUIKitHistoryMessageListTongueContainer({
|
||||
Key? key,
|
||||
this.tongueItemBuilder,
|
||||
this.groupAtInfoList,
|
||||
required this.conversation,
|
||||
required this.scrollToIndexBySeq,
|
||||
required this.scrollController,
|
||||
required this.model,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() =>
|
||||
|
|
@ -37,6 +40,7 @@ class _TIMUIKitHistoryMessageListTongueContainerState
|
|||
bool isFinishJumpToAt = false;
|
||||
List<V2TimGroupAtInfo?>? groupAtInfoList = [];
|
||||
final TUIChatGlobalModel globalModel = serviceLocator<TUIChatGlobalModel>();
|
||||
bool isClickShowPrevious = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
@ -55,29 +59,22 @@ class _TIMUIKitHistoryMessageListTongueContainerState
|
|||
|
||||
scrollHandler() {
|
||||
final screenHeight = MediaQuery.of(context).size.height;
|
||||
if (widget.scrollController.offset <= 0.0 &&
|
||||
widget.model.getConversationUnreadCount() != 0) {
|
||||
// final double originalHeight =
|
||||
// widget.scrollController.position.extentAfter;
|
||||
final offset = widget.scrollController.offset;
|
||||
final conversationUnreadCount = widget.model.getConversationUnreadCount();
|
||||
if (offset <= 0.0 &&
|
||||
conversationUnreadCount != 0) {
|
||||
widget.model.showLatestUnread();
|
||||
// Future.delayed(const Duration(milliseconds: 500), () {
|
||||
// if (widget.scrollController.position.maxScrollExtent > originalHeight) {
|
||||
// final animateToPosition =
|
||||
// widget.scrollController.position.maxScrollExtent - originalHeight;
|
||||
// widget.scrollController.jumpTo(animateToPosition);
|
||||
// }
|
||||
// });
|
||||
}
|
||||
if (widget.scrollController.offset <=
|
||||
widget.scrollController.position.minScrollExtent &&
|
||||
!widget.scrollController.position.outOfRange) {
|
||||
!widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) {
|
||||
changePositionState(HistoryMessagePosition.bottom);
|
||||
} else if (widget.scrollController.offset <= screenHeight * 1.6 &&
|
||||
widget.scrollController.offset > 0 &&
|
||||
!widget.scrollController.position.outOfRange) {
|
||||
!widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) {
|
||||
changePositionState(HistoryMessagePosition.inTwoScreen);
|
||||
} else if (widget.scrollController.offset > screenHeight * 1.6 &&
|
||||
!widget.scrollController.position.outOfRange) {
|
||||
!widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) {
|
||||
changePositionState(HistoryMessagePosition.awayTwoScreen);
|
||||
}
|
||||
}
|
||||
|
|
@ -88,6 +85,11 @@ class _TIMUIKitHistoryMessageListTongueContainerState
|
|||
|
||||
MessageListTongueType _getTongueValueType(
|
||||
List<V2TimGroupAtInfo?>? groupAtInfoList) {
|
||||
|
||||
if(globalModel.getMessageListPosition(widget.model.conversationID) ==
|
||||
HistoryMessagePosition.notShowLatest){
|
||||
return MessageListTongueType.none;
|
||||
}
|
||||
if (groupAtInfoList != null &&
|
||||
groupAtInfoList.isNotEmpty &&
|
||||
!isFinishJumpToAt) {
|
||||
|
|
@ -98,6 +100,10 @@ class _TIMUIKitHistoryMessageListTongueContainerState
|
|||
}
|
||||
}
|
||||
|
||||
if ((widget.conversation.unreadCount ?? 0) > 20 && !isClickShowPrevious) {
|
||||
return MessageListTongueType.showPrevious;
|
||||
}
|
||||
|
||||
if (globalModel.unreadCountForConversation > 0) {
|
||||
return MessageListTongueType.showUnread;
|
||||
}
|
||||
|
|
@ -121,12 +127,20 @@ class _TIMUIKitHistoryMessageListTongueContainerState
|
|||
return Selector<TUIChatGlobalModel, Tuple2<HistoryMessagePosition, int>>(
|
||||
builder: (context, value, child) {
|
||||
return Positioned(
|
||||
bottom: 16,
|
||||
bottom: _getTongueValueType(groupAtInfoList) !=
|
||||
MessageListTongueType.showPrevious
|
||||
? 16
|
||||
: null,
|
||||
top: _getTongueValueType(groupAtInfoList) ==
|
||||
MessageListTongueType.showPrevious
|
||||
? 16
|
||||
: null,
|
||||
right: 16,
|
||||
child: TIMUIKitHistoryMessageListTongue(
|
||||
previousCount: widget.conversation.unreadCount ?? 0,
|
||||
tongueItemBuilder: widget.tongueItemBuilder,
|
||||
unreadCount: globalModel.unreadCountForConversation,
|
||||
onClick: () {
|
||||
onClick: () async {
|
||||
if (groupAtInfoList != null && groupAtInfoList!.isNotEmpty) {
|
||||
if (groupAtInfoList?.length == 1) {
|
||||
widget.scrollToIndexBySeq(groupAtInfoList![0]!.seq);
|
||||
|
|
@ -138,8 +152,26 @@ class _TIMUIKitHistoryMessageListTongueContainerState
|
|||
} else {
|
||||
widget.scrollToIndexBySeq(groupAtInfoList!.removeAt(0)!.seq);
|
||||
}
|
||||
}
|
||||
if (value.item1 == HistoryMessagePosition.awayTwoScreen ||
|
||||
} else if ((widget.conversation.unreadCount ?? 0) > 20 && !isClickShowPrevious) {
|
||||
try{
|
||||
isClickShowPrevious = true;
|
||||
final String? lastSeqString =
|
||||
widget.conversation.lastMessage?.seq;
|
||||
final int? lastSeq =
|
||||
TencentUtils.checkString(lastSeqString) != null
|
||||
? int.parse(lastSeqString!)
|
||||
: null;
|
||||
final int? previousCount = widget.conversation.unreadCount;
|
||||
if (lastSeq != null && previousCount != null) {
|
||||
final targetSeq = lastSeq - previousCount;
|
||||
await widget.model.loadListForSpecificMessage(seq: targetSeq);
|
||||
// widget.scrollToIndexBySeq((targetSeq + 1).toString());
|
||||
}
|
||||
}catch(e){
|
||||
// TODO: 这里后续加个弹窗提示客户,找消息失败了
|
||||
}
|
||||
// widget.model.loadListForSpecificMessage(seq: count);
|
||||
} else if (value.item1 == HistoryMessagePosition.awayTwoScreen ||
|
||||
globalModel.unreadCountForConversation > 0) {
|
||||
widget.model.showLatestUnread();
|
||||
widget.scrollController.animateTo(
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
|
||||
|
||||
|
||||
|
||||
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
|
||||
import 'package:tencent_im_base/tencent_im_base.dart';
|
||||
|
||||
|
|
@ -21,10 +19,13 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget {
|
|||
/// total amount of messages at me
|
||||
final String atNum;
|
||||
|
||||
TIMUIKitTongueItem({
|
||||
final int previousCount;
|
||||
|
||||
TIMUIKitTongueItem( {
|
||||
Key? key,
|
||||
required this.onClick,
|
||||
required this.valueType,
|
||||
required this.previousCount,
|
||||
required this.unreadCount,
|
||||
required this.atNum,
|
||||
}) : super(key: key);
|
||||
|
|
@ -32,11 +33,14 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget {
|
|||
Map<MessageListTongueType, String> textType(BuildContext context) {
|
||||
final option1 = unreadCount.toString();
|
||||
final option2 = atNum.toString();
|
||||
final option3 = previousCount.toString();
|
||||
final String atMeString = option2 != ""
|
||||
? TIM_t_para("有{{option2}}条@我消息", "有$option2条@我消息")(option2: option2)
|
||||
: TIM_t("有人@我");
|
||||
|
||||
return {
|
||||
MessageListTongueType.showPrevious:
|
||||
TIM_t_para("{{option3}}条未读消息", "$option3条未读消息")(option3: option3),
|
||||
MessageListTongueType.toLatest: TIM_t("回到最新位置"),
|
||||
MessageListTongueType.showUnread:
|
||||
TIM_t_para("{{option1}}条新消息", "$option1条新消息")(option1: option1),
|
||||
|
|
@ -50,6 +54,7 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget {
|
|||
MessageListTongueType.showUnread: Icons.arrow_downward_outlined,
|
||||
MessageListTongueType.atMe: Icons.arrow_upward_outlined,
|
||||
MessageListTongueType.atAll: Icons.arrow_upward_outlined,
|
||||
MessageListTongueType.showPrevious: Icons.arrow_upward_outlined,
|
||||
};
|
||||
|
||||
@override
|
||||
|
|
@ -71,7 +76,7 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget {
|
|||
),
|
||||
padding: const EdgeInsets.all(10),
|
||||
// width: 112,
|
||||
height: 37,
|
||||
// height: 37,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ class TIMUIKitHistoryMessageList extends StatefulWidget {
|
|||
final V2TimMessage? initFindingMsg;
|
||||
|
||||
/// use for load more message
|
||||
final Future<void> Function(String?, [int?]) onLoadMore;
|
||||
final Future<void> Function(String?, LoadDirection direction, [int?]) onLoadMore;
|
||||
|
||||
/// configuration for list view
|
||||
final TIMUIKitHistoryMessageListConfig? mainHistoryListConfig;
|
||||
|
|
@ -85,6 +85,8 @@ class TIMUIKitHistoryMessageList extends StatefulWidget {
|
|||
|
||||
final bool isAllowScroll;
|
||||
|
||||
final V2TimConversation conversation;
|
||||
|
||||
const TIMUIKitHistoryMessageList(
|
||||
{Key? key,
|
||||
required this.model,
|
||||
|
|
@ -96,7 +98,8 @@ class TIMUIKitHistoryMessageList extends StatefulWidget {
|
|||
this.groupAtInfoList,
|
||||
this.initFindingMsg,
|
||||
this.isAllowScroll = true,
|
||||
this.mainHistoryListConfig})
|
||||
this.mainHistoryListConfig,
|
||||
required this.conversation})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
|
|
@ -123,7 +126,7 @@ class _TIMUIKitHistoryMessageListState
|
|||
|
||||
initFinding() async {
|
||||
if (widget.initFindingMsg != null) {
|
||||
await widget.onLoadMore(null);
|
||||
await widget.onLoadMore(null, LoadDirection.previous);
|
||||
setState(() {
|
||||
findingMsg = widget.initFindingMsg!;
|
||||
});
|
||||
|
|
@ -216,7 +219,7 @@ class _TIMUIKitHistoryMessageListState
|
|||
// if the target message not in current message list, load more
|
||||
findingMsg = targetMsg;
|
||||
final lastMsgId = _getMessageId(widget.messageList.length - 1);
|
||||
widget.onLoadMore(lastMsgId, singleLoadAmount);
|
||||
widget.onLoadMore(lastMsgId, LoadDirection.previous, singleLoadAmount);
|
||||
} else {
|
||||
showCantFindMsg();
|
||||
}
|
||||
|
|
@ -270,7 +273,7 @@ class _TIMUIKitHistoryMessageListState
|
|||
if (widget.model.haveMoreData) {
|
||||
findingSeq = targetSeq;
|
||||
widget.onLoadMore(
|
||||
_getMessageId(widget.messageList.length - 1), singleLoadAmount);
|
||||
_getMessageId(widget.messageList.length - 1), LoadDirection.previous, singleLoadAmount);
|
||||
} else {
|
||||
showCantFindMsg();
|
||||
}
|
||||
|
|
@ -336,12 +339,17 @@ class _TIMUIKitHistoryMessageListState
|
|||
.sublist(unreadMessageList.length, messageList.length)
|
||||
.toList();
|
||||
|
||||
final throteFunction = OptimizeUtils.throttle((index) async {
|
||||
final throteFunction = OptimizeUtils.multiThrottle((index, LoadDirection direction) async {
|
||||
final msgID =
|
||||
TIMUIKitChatUtils.getMessageIDWithinIndex(messageList, index);
|
||||
await widget.onLoadMore(msgID);
|
||||
TIMUIKitChatUtils.getMessageIDWithinIndex(readMessageList, index);
|
||||
await widget.onLoadMore(msgID, direction);
|
||||
}, 20);
|
||||
|
||||
final throteFunctionWithMsgID = OptimizeUtils.multiThrottle((msgID, LoadDirection direction) async {
|
||||
await widget.onLoadMore(msgID, direction);
|
||||
}, 200);
|
||||
|
||||
|
||||
if (findingMsg != null) {
|
||||
_onScrollToIndex(findingMsg!);
|
||||
} else if (findingSeq != "") {
|
||||
|
|
@ -349,7 +357,7 @@ class _TIMUIKitHistoryMessageListState
|
|||
}
|
||||
|
||||
String getMessageIdentifier(V2TimMessage? message, int index) {
|
||||
return "${message?.msgID} - ${message?.timestamp} - ${message?.seq}";
|
||||
return "${message?.msgID} - ${message?.timestamp} - ${message?.seq} -${message?.id}";
|
||||
}
|
||||
|
||||
return Container(
|
||||
|
|
@ -390,6 +398,9 @@ class _TIMUIKitHistoryMessageListState
|
|||
delegate: SliverChildBuilderDelegate(
|
||||
(BuildContext context, int index) {
|
||||
final messageItem = unreadMessageList[index];
|
||||
if(index == unreadMessageList.length - 1 && widget.model.haveMoreLatestData == true){
|
||||
throteFunctionWithMsgID(messageItem?.msgID ?? "", LoadDirection.latest);
|
||||
}
|
||||
return AutoScrollTag(
|
||||
controller: _autoScrollController,
|
||||
index: -index,
|
||||
|
|
@ -430,7 +441,7 @@ class _TIMUIKitHistoryMessageListState
|
|||
final messageItem = readMessageList[index];
|
||||
if (index == readMessageList.length - 1) {
|
||||
if (widget.model.haveMoreData) {
|
||||
throteFunction(index);
|
||||
throteFunction(index, LoadDirection.previous);
|
||||
return Column(
|
||||
children: [
|
||||
LoadingAnimationWidget.staggeredDotsWave(
|
||||
|
|
@ -458,6 +469,9 @@ class _TIMUIKitHistoryMessageListState
|
|||
);
|
||||
}
|
||||
}
|
||||
if(index == 0 && widget.model.haveMoreLatestData == true && globalModel.receivedMessageListCount < 10){
|
||||
throteFunction(index, LoadDirection.latest);
|
||||
}
|
||||
return AutoScrollTag(
|
||||
controller: _autoScrollController,
|
||||
index: -index,
|
||||
|
|
@ -484,11 +498,13 @@ class _TIMUIKitHistoryMessageListState
|
|||
(element) =>
|
||||
getMessageIdentifier(element, 0) == data);
|
||||
return index > -1 ? index : null;
|
||||
})),
|
||||
}
|
||||
)),
|
||||
),
|
||||
],
|
||||
),
|
||||
TIMUIKitHistoryMessageListTongueContainer(
|
||||
conversation: widget.conversation,
|
||||
model: widget.model,
|
||||
scrollController: _autoScrollController,
|
||||
scrollToIndexBySeq: _onScrollToIndexBySeq,
|
||||
|
|
|
|||
|
|
@ -597,6 +597,57 @@ class _TIMUIKItHistoryMessageListItemState
|
|||
);
|
||||
}
|
||||
|
||||
Widget _latestDividerBuilder(TUITheme theme) {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
margin: const EdgeInsets.symmetric(vertical: 20),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
margin: const EdgeInsets.only(right: 20),
|
||||
child: SizedBox(
|
||||
height: 1,
|
||||
width: 100,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(colors: [
|
||||
const Color(0x00C0E1FF),
|
||||
theme.primaryColor ?? CommonColor.lightPrimaryColor
|
||||
]),
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
TIM_t("以下为未读消息"),
|
||||
style: widget.themeData?.timelineTextStyle ??
|
||||
TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: theme.primaryColor,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(left: 20),
|
||||
child: SizedBox(
|
||||
height: 1,
|
||||
width: 100,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(colors: [
|
||||
theme.primaryColor ?? CommonColor.primaryColor,
|
||||
const Color(0x00C0E1FF),
|
||||
]),
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
bool isRevokable(int timestamp) =>
|
||||
(DateTime.now().millisecondsSinceEpoch / 1000).ceil() - timestamp < 120;
|
||||
|
||||
|
|
@ -820,6 +871,7 @@ class _TIMUIKItHistoryMessageListItemState
|
|||
msgType == MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS;
|
||||
final isRevokedMsg = msgStatus == 6;
|
||||
final isTimeDivider = msgType == 11;
|
||||
final isLatestDivider = msgType == 101;
|
||||
final isPeerRead = message.isPeerRead ?? false;
|
||||
final isGroupMessage = model.conversationType == ConvType.group;
|
||||
final bool isRevokeEditable =
|
||||
|
|
@ -831,6 +883,9 @@ class _TIMUIKItHistoryMessageListItemState
|
|||
if (isTimeDivider) {
|
||||
return _timeDividerBuilder(theme, message.timestamp ?? 0, model);
|
||||
}
|
||||
if(isLatestDivider){
|
||||
return _latestDividerBuilder(theme);
|
||||
}
|
||||
void clearJump() {
|
||||
Future.delayed(const Duration(milliseconds: 100), () {
|
||||
model.jumpMsgID = "";
|
||||
|
|
@ -941,8 +996,6 @@ class _TIMUIKItHistoryMessageListItemState
|
|||
width: 40,
|
||||
height: 40,
|
||||
child: Avatar(
|
||||
borderRadius:
|
||||
widget.themeData?.avatarBorderRadius,
|
||||
faceUrl: message.faceUrl ?? "",
|
||||
showName:
|
||||
MessageUtils.getDisplayName(message),
|
||||
|
|
@ -1146,8 +1199,6 @@ class _TIMUIKItHistoryMessageListItemState
|
|||
}
|
||||
},
|
||||
child: Avatar(
|
||||
borderRadius:
|
||||
widget.themeData?.avatarBorderRadius,
|
||||
faceUrl: message.faceUrl ?? "",
|
||||
showName:
|
||||
MessageUtils.getDisplayName(message)),
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget {
|
|||
|
||||
final bool isAllowScroll;
|
||||
|
||||
final V2TimConversation conversation;
|
||||
|
||||
const TIMUIKitHistoryMessageListContainer({
|
||||
Key? key,
|
||||
this.itemBuilder,
|
||||
|
|
@ -89,6 +91,7 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget {
|
|||
this.isUseDefaultEmoji = false,
|
||||
this.customEmojiStickerList = const [],
|
||||
this.textFieldController,
|
||||
required this.conversation,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
|
|
@ -102,10 +105,12 @@ class _TIMUIKitHistoryMessageListContainerState
|
|||
|
||||
List<V2TimMessage?> historyMessageList = [];
|
||||
|
||||
Future<void> requestForData(String? lastMsgID, TUIChatSeparateViewModel model,
|
||||
Future<void> requestForData(String? lastMsgID, LoadDirection direction, TUIChatSeparateViewModel model,
|
||||
[int? count]) async {
|
||||
if (model.haveMoreData) {
|
||||
print("requestForData $lastMsgID $direction");
|
||||
if ((direction == LoadDirection.previous && model.haveMoreData) || (direction == LoadDirection.latest && model.haveMoreLatestData)) {
|
||||
await model.loadData(
|
||||
direction: direction,
|
||||
count: count ?? (kIsWeb ? 15 : HistoryMessageDartConstant.getCount),
|
||||
lastMsgID: lastMsgID);
|
||||
}
|
||||
|
|
@ -139,6 +144,7 @@ class _TIMUIKitHistoryMessageListContainerState
|
|||
conversationID: model.conversationID,
|
||||
builder: (context, messageList, child) {
|
||||
return TIMUIKitHistoryMessageList(
|
||||
conversation: widget.conversation,
|
||||
model: model,
|
||||
isAllowScroll: widget.isAllowScroll,
|
||||
controller: _historyMessageListController,
|
||||
|
|
@ -172,8 +178,8 @@ class _TIMUIKitHistoryMessageListContainerState
|
|||
tongueItemBuilder: widget.tongueItemBuilder,
|
||||
initFindingMsg: widget.initFindingMsg,
|
||||
messageList: messageList,
|
||||
onLoadMore: (String? a, [int? b]) async {
|
||||
return await requestForData(a, model, b);
|
||||
onLoadMore: (String? a, LoadDirection direction, [int? b]) async {
|
||||
return await requestForData(a, direction, model, b);
|
||||
},
|
||||
);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -363,6 +363,7 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
|
|||
goDownBottom();
|
||||
}
|
||||
setSendButton();
|
||||
currentCursor = null;
|
||||
}
|
||||
|
||||
// index为emoji的index,data为baseurl+name
|
||||
|
|
@ -435,6 +436,9 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
|
|||
}
|
||||
|
||||
void goDownBottom() {
|
||||
if(globalModel.getMessageListPosition(widget.conversationID) == HistoryMessagePosition.notShowLatest){
|
||||
return;
|
||||
}
|
||||
Future.delayed(const Duration(milliseconds: 50), () {
|
||||
try {
|
||||
if (widget.scrollController != null) {
|
||||
|
|
|
|||
|
|
@ -30,21 +30,26 @@ class TIMUIKitChat extends StatefulWidget {
|
|||
/// You have to provide this before using it after tencent_cloud_chat_uikit 0.1.4.
|
||||
final TIMUIKitChatController? controller;
|
||||
|
||||
/// [Update] It is suggested to provide the `V2TimConversation` once directly, since tencent_cloud_chat_uikit 1.5.0.
|
||||
/// `conversationID` / `conversationType` / `groupAtInfoList` / `conversationShowName` are not necessary to be provided, unless you want to cover these fields manually.
|
||||
final V2TimConversation conversation;
|
||||
|
||||
/// The ID of the Group that the topic belongs to, only need for topic.
|
||||
final String? groupID;
|
||||
|
||||
/// Conversation id, use for get history message list.
|
||||
final String conversationID;
|
||||
/// Conversation id, use for load history message list.
|
||||
/// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually.
|
||||
final String? conversationID;
|
||||
|
||||
/// Conversation type.
|
||||
final ConvType conversationType;
|
||||
/// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually.
|
||||
final ConvType? conversationType;
|
||||
|
||||
/// use for customize avatar
|
||||
final Widget Function(BuildContext context, V2TimMessage message)?
|
||||
userAvatarBuilder;
|
||||
|
||||
/// Use for show conversation name.
|
||||
final String conversationShowName;
|
||||
/// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually.
|
||||
final String? conversationShowName;
|
||||
|
||||
/// Avatar and name in message reaction tap callback.
|
||||
final void Function(String userID)? onTapAvatar;
|
||||
|
|
@ -94,6 +99,7 @@ class TIMUIKitChat extends StatefulWidget {
|
|||
final TongueItemBuilder? tongueItemBuilder;
|
||||
|
||||
/// The `groupAtInfoList` from `V2TimConversation`.
|
||||
/// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually.
|
||||
final List<V2TimGroupAtInfo?>? groupAtInfoList;
|
||||
|
||||
/// The configuration for the whole `TIMUIKitChat` widget.
|
||||
|
|
@ -133,9 +139,9 @@ class TIMUIKitChat extends StatefulWidget {
|
|||
TIMUIKitChat(
|
||||
{Key? key,
|
||||
this.groupID,
|
||||
required this.conversationID,
|
||||
required this.conversationType,
|
||||
required this.conversationShowName,
|
||||
this.conversationID,
|
||||
this.conversationType,
|
||||
this.conversationShowName,
|
||||
this.abstractMessageBuilder,
|
||||
this.onTapAvatar,
|
||||
@Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
|
||||
|
|
@ -162,7 +168,8 @@ class TIMUIKitChat extends StatefulWidget {
|
|||
this.lifeCycle,
|
||||
this.topFixWidget = const SizedBox(),
|
||||
this.textFieldBuilder,
|
||||
this.customEmojiStickerList = const []})
|
||||
this.customEmojiStickerList = const [],
|
||||
required this.conversation})
|
||||
: super(key: key) {
|
||||
startTime = DateTime.now().millisecondsSinceEpoch;
|
||||
}
|
||||
|
|
@ -187,6 +194,24 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
axis: Axis.vertical,
|
||||
);
|
||||
|
||||
String _getTitle() {
|
||||
return TencentUtils.checkString(widget.conversationShowName) ??
|
||||
widget.conversation.showName ??
|
||||
"Chat";
|
||||
}
|
||||
|
||||
String _getConvID() {
|
||||
return TencentUtils.checkString(widget.conversationID) ??
|
||||
(widget.conversation.type == 1
|
||||
? widget.conversation.userID
|
||||
: widget.conversation.groupID) ??
|
||||
"";
|
||||
}
|
||||
|
||||
ConvType _getConvType() {
|
||||
return widget.conversation.type == 1 ? ConvType.c2c : ConvType.group;
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
|
@ -221,7 +246,7 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
child: GestureDetector(
|
||||
onTap: () {
|
||||
if (widget.onDealWithGroupApplication != null) {
|
||||
widget.onDealWithGroupApplication!(widget.conversationID);
|
||||
widget.onDealWithGroupApplication!(_getConvID());
|
||||
}
|
||||
},
|
||||
child: Row(
|
||||
|
|
@ -260,8 +285,8 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
model: model,
|
||||
groupID: widget.groupID,
|
||||
textFieldController: textFieldController,
|
||||
conversationID: widget.conversationID,
|
||||
conversationType: widget.conversationType,
|
||||
conversationID: _getConvID(),
|
||||
conversationType: _getConvType(),
|
||||
lifeCycle: widget.lifeCycle,
|
||||
config: widget.config,
|
||||
isBuild: isBuild,
|
||||
|
|
@ -274,11 +299,11 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
|
||||
widget.controller?.model = model;
|
||||
List<V2TimGroupApplication> filteredApplicationList = [];
|
||||
if (widget.conversationType == ConvType.group &&
|
||||
if (_getConvType() == ConvType.group &&
|
||||
widget.onDealWithGroupApplication != null) {
|
||||
filteredApplicationList =
|
||||
chatGlobalModel.groupApplicationList.where((item) {
|
||||
return (item.groupID == widget.conversationID) &&
|
||||
return (item.groupID == _getConvID()) &&
|
||||
item.handleStatus == 0;
|
||||
}).toList();
|
||||
}
|
||||
|
|
@ -287,15 +312,15 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
Provider.of<TUIGroupListenerModel>(context, listen: true);
|
||||
final NeedUpdate? needUpdate = groupListenerModel.needUpdate;
|
||||
if (needUpdate != null &&
|
||||
needUpdate.groupID == widget.conversationID) {
|
||||
needUpdate.groupID == _getConvID()) {
|
||||
groupListenerModel.needUpdate = null;
|
||||
switch (needUpdate.updateType) {
|
||||
case UpdateType.groupInfo:
|
||||
model.loadGroupInfo(widget.conversationID);
|
||||
model.loadGroupInfo(_getConvID());
|
||||
break;
|
||||
case UpdateType.memberList:
|
||||
model.loadGroupMemberList(groupID: widget.conversationID);
|
||||
model.loadGroupInfo(widget.conversationID);
|
||||
model.loadGroupMemberList(groupID: _getConvID());
|
||||
model.loadGroupInfo(_getConvID());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -319,8 +344,8 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
appBar: TIMUIKitAppBar(
|
||||
showTotalUnReadCount: widget.showTotalUnReadCount,
|
||||
config: widget.appBarConfig,
|
||||
conversationShowName: widget.conversationShowName,
|
||||
conversationID: widget.conversationID,
|
||||
conversationShowName: _getTitle(),
|
||||
conversationID: _getConvID(),
|
||||
showC2cMessageEditStaus:
|
||||
widget.config?.showC2cMessageEditStaus ?? true,
|
||||
),
|
||||
|
|
@ -337,6 +362,7 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
child: Listener(
|
||||
onPointerMove: closePanel,
|
||||
child: TIMUIKitHistoryMessageListContainer(
|
||||
conversation: widget.conversation,
|
||||
textFieldController: textFieldController,
|
||||
customEmojiStickerList:
|
||||
widget.customEmojiStickerList,
|
||||
|
|
@ -351,7 +377,7 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
tongueItemBuilder: widget.tongueItemBuilder,
|
||||
onLongPressForOthersHeadPortrait:
|
||||
(String? userId, String? nickName) {
|
||||
if (widget.conversationType != ConvType.c2c) {
|
||||
if (_getConvType() != ConvType.c2c) {
|
||||
textFieldController.longPressToAt(
|
||||
nickName, userId);
|
||||
}
|
||||
|
|
@ -362,20 +388,20 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
extraTipsActionItemBuilder:
|
||||
widget.extraTipsActionItemBuilder ??
|
||||
widget.exteraTipsActionItemBuilder,
|
||||
conversationType: widget.conversationType,
|
||||
conversationType: _getConvType(),
|
||||
scrollController: autoController,
|
||||
onTapAvatar: widget.onTapAvatar,
|
||||
// ignore: deprecated_member_use_from_same_package
|
||||
showNickName: widget.showNickName,
|
||||
messageItemBuilder: widget.messageItemBuilder,
|
||||
conversationID: widget.conversationID,
|
||||
conversationID: _getConvID(),
|
||||
),
|
||||
))),
|
||||
Selector<TUIChatSeparateViewModel, bool>(
|
||||
builder: (context, value, child) {
|
||||
return value
|
||||
? MultiSelectPanel(
|
||||
conversationType: widget.conversationType,
|
||||
conversationType: _getConvType(),
|
||||
)
|
||||
: (widget.textFieldBuilder != null
|
||||
? widget.textFieldBuilder!(context)
|
||||
|
|
@ -390,8 +416,8 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
|
|||
widget.customStickerPanel,
|
||||
morePanelConfig: widget.morePanelConfig,
|
||||
scrollController: autoController,
|
||||
conversationID: widget.conversationID,
|
||||
conversationType: widget.conversationType,
|
||||
conversationID: _getConvID(),
|
||||
conversationType: _getConvType(),
|
||||
initText: widget.draftText,
|
||||
hintText: widget.textFieldHintText,
|
||||
showMorePanel:
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ class Avatar extends TIMUIKitStatelessWidget {
|
|||
final String faceUrl;
|
||||
final String showName;
|
||||
final bool isFromLocalAsset;
|
||||
final CoreServicesImpl coreService = serviceLocator<CoreServicesImpl>();
|
||||
final BorderRadius? borderRadius;
|
||||
final CoreServicesImpl coreService = serviceLocator<CoreServicesImpl>();
|
||||
final V2TimUserStatus? onlineStatus;
|
||||
final int? type; // 1 c2c 2 group
|
||||
final bool isShowBigWhenClick;
|
||||
|
|
@ -25,10 +25,10 @@ class Avatar extends TIMUIKitStatelessWidget {
|
|||
{Key? key,
|
||||
required this.faceUrl,
|
||||
this.onlineStatus,
|
||||
required this.showName,
|
||||
this.borderRadius,
|
||||
required this.showName,
|
||||
this.isShowBigWhenClick = false,
|
||||
this.isFromLocalAsset = false,
|
||||
this.borderRadius,
|
||||
this.type = 1})
|
||||
: super(key: key);
|
||||
|
||||
|
|
@ -133,14 +133,14 @@ class Avatar extends TIMUIKitStatelessWidget {
|
|||
child: Hero(
|
||||
tag: faceUrl,
|
||||
child: ClipRRect(
|
||||
borderRadius: borderRadius ?? BorderRadius.circular(4.8),
|
||||
borderRadius: borderRadius ?? selfInfoViewModel.globalConfig?.defaultAvatarBorderRadius ?? BorderRadius.circular(4.8),
|
||||
child: getImageWidget(context, theme),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (!isShowBigWhenClick)
|
||||
ClipRRect(
|
||||
borderRadius: borderRadius ?? BorderRadius.circular(4.8),
|
||||
borderRadius: borderRadius ?? selfInfoViewModel.globalConfig?.defaultAvatarBorderRadius ?? BorderRadius.circular(4.8),
|
||||
child: getImageWidget(context, theme),
|
||||
),
|
||||
if (onlineStatus?.statusType != null && onlineStatus?.statusType != 0)
|
||||
|
|
|
|||
92
pubspec.lock
92
pubspec.lock
|
|
@ -5,10 +5,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201"
|
||||
sha256: "569ddca58d535e601dd1584afa117710abc999d036c0cd2c51777fb257df78e8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "52.0.0"
|
||||
version: "53.0.0"
|
||||
adaptive_action_sheet:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -21,18 +21,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4
|
||||
sha256: "10927c4b7c7c88b1adbca278c3d5531db92e2f4b4abf04e2919a800af965f3f5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.4.0"
|
||||
version: "5.5.0"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611"
|
||||
sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.4.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -77,10 +77,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: "7c35a3a7868626257d8aee47b51c26b9dba11eaddf3431117ed2744951416aab"
|
||||
sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
version: "2.2.0"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
|
@ -309,10 +309,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: extended_image
|
||||
sha256: "5854d0d05ee0c687d1852af9db05f15cfe058520fa56f417075705c5bce965d4"
|
||||
sha256: a6b738d9b8d5513be72c545cc3e9c5c451fbee77c8db3cbec7c32ae85b82fb93
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.4.0"
|
||||
version: "6.4.1"
|
||||
extended_image_library:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -423,10 +423,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_markdown
|
||||
sha256: "818cf6c28377ba2c91ed283c96fd712e9c175dd2d2488eb7fc93b6afb9ad2e08"
|
||||
sha256: "7b25c10de1fea883f3c4f9b8389506b54053cd00807beab69fd65c8653a2711f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.13+1"
|
||||
version: "0.6.14"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -564,18 +564,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: image_picker
|
||||
sha256: f98d76672d309c8b7030c323b3394669e122d52b307d2bbd8d06bd70f5b2aabe
|
||||
sha256: d39cc12402dab8365fe5b5370e64694ae0223d675c36b15ff0490b7cc3d32551
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.6+1"
|
||||
version: "0.8.6+2"
|
||||
image_picker_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_android
|
||||
sha256: b1cbfec0f5aef427a18eb573f5445af8c9c568626bf3388553e40c263d3f7368
|
||||
sha256: "385f12ee9c7288575572c7873a332016ec45ebd092e1c2f6bd421b4a9ad21f1d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.5+5"
|
||||
version: "0.8.5+6"
|
||||
image_picker_for_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -588,10 +588,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_ios
|
||||
sha256: "8ffb14b43713d7c43fb21299cc18181cc5b39bd3ea1cc427a085c6400fe5aa52"
|
||||
sha256: "884ed71165bc01ffe1b0b7813e6fa17e1e9442da974656f99b79a292371303d6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.6+7"
|
||||
version: "0.8.6+8"
|
||||
image_picker_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -676,10 +676,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: markdown
|
||||
sha256: c2b81e184067b41d0264d514f7cdaa2c02d38511e39d6521a1ccc238f6d7b3f2
|
||||
sha256: b3c60dee8c2af50ad0e6e90cceba98e47718a6ee0a7a6772c77846a0cc21f78b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.1"
|
||||
version: "7.0.1"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -836,10 +836,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
|
||||
sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.7"
|
||||
version: "2.1.8"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1177,26 +1177,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: tencent_cloud_chat_sdk
|
||||
sha256: "3b3349dec74f60cff9cd85cb865c41d60afb472b451f5124f2e8318df037cc7f"
|
||||
sha256: "32b7e40c5a1682b3ee85daa73504af3d0d4e60a93472b279591e769b15b4861c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.8"
|
||||
version: "5.0.9"
|
||||
tencent_extended_text:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: tencent_extended_text
|
||||
sha256: "27a2f7ee58ada480e295102471f1733a7402178a239d0c80a7aa33a134c641ef"
|
||||
sha256: cf0d283c01a9e63f75666d8b5b1cabd463e18e51802bf1d093d7a65bd369b3d4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
version: "1.0.2+1"
|
||||
tencent_extended_text_field:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: tencent_extended_text_field
|
||||
sha256: d311c240983dbf78e31b58f91e425920a40d6564942813e692a3419bf5c9deb0
|
||||
sha256: daa10f3775bfac1cc841b34275c2746ced7764f3b77222a93edb4c13bad1209b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
version: "1.0.1+2"
|
||||
tencent_extended_text_library:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1209,18 +1209,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: tencent_im_base
|
||||
sha256: bbd2d70c82b018ce86c421f0b4eb02f650456d0bbd7ea5558110139c7b04c4b4
|
||||
sha256: b5917ff0bae7c31d52f54932349fc400d3752719a1c5a2f0209258f85c7a6c07
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.21"
|
||||
version: "1.0.26"
|
||||
tencent_im_sdk_plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: tencent_im_sdk_plugin_platform_interface
|
||||
sha256: "5dd3e957e7db00e3d785978b4b163e36376b9c5a481ed4f5d746876f1e408b62"
|
||||
sha256: "7aff6a8495eae3efc3aed1ed944bab7a0ce7eb1035d09b3f3d7974bcb3d8b137"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.11"
|
||||
version: "0.3.12"
|
||||
tencent_keyboard_visibility:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -1233,10 +1233,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: tencent_open_file
|
||||
sha256: d60878fe1e5a1317607851d81ad78f395b8411418587de16cf1cd48cb662aa18
|
||||
sha256: "98cbffe55e3245a308fbf76e18c9a0f808e534c624bc1a1cc0a00bd63a418290"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.9"
|
||||
version: "4.0.9+1"
|
||||
tencent_super_tooltip:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -1249,10 +1249,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: tencent_wechat_camera_picker
|
||||
sha256: "8f95b435c7a12a9221f00fe4354fb9c0f9313d79cc09ddb5902b7b418185092d"
|
||||
sha256: "6a6fd12d61ad2ef17273a226a165fe0b5e3ef5c7e49779de38503e4f4b6e3ef1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.6.5+1"
|
||||
version: "3.6.5+2"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1265,10 +1265,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: tim_ui_kit_sticker_plugin
|
||||
sha256: "5f6ec1c713718b185f920629024a4d135eead61b3735287dc80950710e2daa33"
|
||||
sha256: cd5d6e2380deaf73e420602bbfe3da36c0f3253adc531f76e139efec80671175
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.2.0"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1281,10 +1281,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: transparent_image
|
||||
sha256: e566a616922a781489f4d91cc939b1b3203b6e4a093317805f2f82f0bb0f8dec
|
||||
sha256: e8991d955a2094e197ca24c645efec2faf4285772a4746126ca12875e54ca02f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
version: "2.0.1"
|
||||
tuple:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -1305,18 +1305,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: universal_html
|
||||
sha256: "5ff50b7c14d201421cf5230ec389a0591c4deb5c817c9d7ccca3b26fe5f31e34"
|
||||
sha256: b5061c64c7c863c12e46279e032976f1c274f927fb3589b52b5928dcd2d52f7c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.8"
|
||||
version: "2.0.9"
|
||||
universal_io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: universal_io
|
||||
sha256: "79f78ddad839ee3aae3ec7c01eb4575faf0d5c860f8e5223bc9f9c17f7f03cef"
|
||||
sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.4"
|
||||
version: "2.2.0"
|
||||
url_launcher:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -1521,10 +1521,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86
|
||||
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.0+3"
|
||||
version: "1.0.0"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
name: tencent_cloud_chat_uikit
|
||||
description: Chat UI components library and basic chat business logic for Tencent Cloud Chat, helping you build In-APP Chat module easily.
|
||||
version: 1.6.2
|
||||
version: 1.7.0
|
||||
homepage: https://www.tencentcloud.com/products/im?from=pub
|
||||
repository: https://github.com/TencentCloud/chat-uikit-flutter
|
||||
documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html
|
||||
|
|
@ -60,7 +60,7 @@ dependencies:
|
|||
url_launcher: ^6.1.4
|
||||
universal_html: ^2.0.8
|
||||
link_preview_generator: ^1.2.0
|
||||
tencent_im_base: ^1.0.21
|
||||
tencent_im_base: ^1.0.26
|
||||
disk_space: ^0.2.1
|
||||
http: ^0.13.5
|
||||
crypto: ^3.0.2
|
||||
|
|
@ -69,7 +69,7 @@ dependencies:
|
|||
uuid: ^3.0.6
|
||||
tencent_open_file: ^4.0.9
|
||||
tencent_keyboard_visibility: ^1.0.1
|
||||
tim_ui_kit_sticker_plugin: ^1.1.1
|
||||
tim_ui_kit_sticker_plugin: ^1.2.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_lints: ^1.0.0
|
||||
|
|
|
|||
Loading…
Reference in New Issue