update flutter uikit to 1.7.0

This commit is contained in:
anonymous 2023-02-23 16:40:16 +08:00
parent 8cab9d05cd
commit b6ed4adc9c
24 changed files with 660 additions and 393 deletions

View File

@ -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

View File

@ -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)。

View File

@ -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(

View File

@ -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:

View File

@ -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.0QAQ
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

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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) {

View File

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

View File

@ -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();

View File

@ -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(

View File

@ -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,

View File

@ -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,

View File

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

View File

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

View File

@ -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) {

View File

@ -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:

View File

@ -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)

View File

@ -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:

View File

@ -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