TIMUIKitChat

功能介绍

聊天组件

参数详解

参数名称 参数类型 是否必填 平台 描述
conversation V2TimConversation 是 全部 当前聊天的对话。建议直接提供此参数 V2TimConversation 在 tencent_cloud_chat_uikit 1.5.0版本后。除非您想手动覆盖这些字段,否则不需要提供ConversationID/ConversationType/groupAtInfoList/ConversationShowName。
conversationID String 否 全部 聊天的会话id。除非您想手动覆盖此字段,否则不需要提供此字段,如果提供了conversation,则不必填。
groupID String 否 全部 当且仅当当前会话是Topic,此处传入该 Topic 所属的 Community 的 Group ID。
conversationType ConvType 否 全部 聊天的会话类型。除非您想手动覆盖此字段,否则不需要提供此字段,如果提供了conversation,则不必填。
conversationShowName String 否 全部 聊天页面的页面展示名。除非您想手动覆盖此字段,否则不需要提供此字段,如果提供了conversation,则不必填。
controller TIMUIKitChatController 否 全部 聊天模块控制器,如需在您的代码中使用,请在实例化后,传入本参数,用法请参考
onTapAvatar void Function(String userID, TapDownDetails tapDetails) 否 全部 点击头像的回调函数
onSecondaryTapAvatar void Function(String userID, TapDownDetails tapDetails) 否 桌面端 右键点击头像的回调函数
messageItemBuilder MessageItemBuilder 否 全部 用于自定义不同种类消息样式的构造器
showTotalUnReadCount bool 否 全部 是否展示当前未读消息总数
extraTipsActionItemBuilder Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key]) 否 全部 新增的长按弹出消息操作功能的自定义选项的构造器
draftText String 否 全部 会话的草稿文本。您可以传入 V2TimConversation 的 draftText 字段,以展示默认的草稿文本。
initFindingMsg V2TimMessage 否 全部 进入页面需要默认跳转到的消息
textFieldHintText String 否 全部 提示文本显示在输入字段中。
appBarConfig AppBar 否 移动端 上方 appBar 的配置。
mainHistoryListConfig TIMUIKitHistoryMessageListConfig 否 全部 历史消息列表的ListView配置
morePanelConfig MorePanelConfig 否 移动端 更多操作选项设置
tongueItemBuilder Widget Function( VoidCallback onClick, MessageListTongueType valueType, int unreadCount) 否 全部 小舌头构造器(右下角按钮提示框样式构造器)
groupAtInfoList List< V2TimGroupAtInfo? > 否 全部 群组消息@信息列表。除非您想手动覆盖此字段,否则不需要提供此字段,如果提供了conversation,则不必填。
config TIMUIKitChatConfig 否 全部 消息页面设置
onDealWithGroupApplication ValueChanged< String > 否 全部 点击处理加群申请后的回调函数
abstractMessageBuilder String Function(V2TimMessage message) 否 全部 针对不同类型消息概述构造器
toolTipsConfig ToolTipsConfig 否 全部 长按消息显示的消息操作选项设置
lifeCycle ChatLifeCycle 否 全部 聊天消息操作时的钩子函数
topFixWidget Widget 否 全部 聊天页面上方自定义widget
customStickerPanel Widget Function( {void Function() sendTextMessage, void Function(int index, String data) sendFaceMessage, void Function() deleteText, void Function(int unicode) addText}) 否 全部 自定义表情的选择框

代码示例

abstractMessageBuilder的案例

abstractMessageBuilder为针对不同类型消息概述构造器.

代码示例为使用abstractMessageBuilder做到自定义文本消息的概述。

/// @title:"abstractMessageBuilder为针对不同类型消息概述构造器."
/// @title:"代码示例为使用abstractMessageBuilder做到自定义文本消息的概述。"
/// @picture:"https://tuikit-1251787278.cos.ap-guangzhou.myqcloud.com/abstractMessageBuilder.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      abstractMessageBuilder: (message) {
        if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) {
          return 'customAbstract';
        }
        return "";
      },
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

appBarConfig的案例

appBarConfig为上方抬头栏设置.

代码示例为使用appBarConfig自定义添加分享功能。

/// @title:"appBarConfig为上方抬头栏设置."
/// @title:"代码示例为使用appBarConfig自定义添加分享功能。"
/// @picture:"https://tuikit-1251787278.cos.ap-guangzhou.myqcloud.com/appBarConfig.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      appBarConfig: AppBar(
        actions: [
          if (IMDemoConfig.openShareFeature)
            IconButton(
                onPressed: () async {
                  showModalBottomSheet(
                      backgroundColor: Colors.transparent,
                      context: context,
                      builder: (BuildContext context) {
                        return ShareWidget(
                          ShareInfo('腾讯云IM',
                              'https://comm.qq.com/im_demo_download/#/discuss-share',
                              img: WeChatImage.network(
                                  "https://imgcache.qq.com/operation/dianshi/other/logo.ac7337705ff26825bf66a8e074460759465c48d7.png"),
                              describe:
                                  "即时通信 IM (Instant Messaging)基于 QQ 底层 IM 能力开发,仅需植入 SDK 即可轻松集成聊天、会话、群组、资料管理和直播弹幕能力,也支持通过信令消息与白板等其他产品打通,全面覆盖您的业务场景,支持各大平台小程序接入使用,全面满足通信需要"),
                          list: [
                            ShareOpt(
                                title: '微信好友',
                                img: Image.asset(
                                  'assets/icon_wechat.png',
                                  width: 25.0,
                                  height: 25.0,
                                  fit: BoxFit.fill,
                                ),
                                shareType: ShareType.SESSION,
                                doAction: (shareType, shareInfo) async {
                                  if (!_installedWechat) {
                                    Toast.showToast(
                                        ToastType.fail, "未检测到微信安装", context);
                                    return;
                                  }
                                  var model =
                                      _getShareModel(shareType, shareInfo);
                                  shareToWeChat(model);
                                }),
                            ShareOpt(
                                title: '朋友圈',
                                img: Image.asset(
                                  'assets/icon_wechat_moments.jpg',
                                  width: 25.0,
                                  height: 25.0,
                                  fit: BoxFit.fill,
                                ),
                                shareType: ShareType.TIMELINE,
                                doAction: (shareType, shareInfo) {
                                  if (!_installedWechat) {
                                    Toast.showToast(
                                        ToastType.fail, "未检测到微信安装", context);
                                    return;
                                  }
                                  var model =
                                      _getShareModel(shareType, shareInfo);
                                  shareToWeChat(model);
                                }),
                          ],
                        );
                      });
                },
                icon: const Icon(Icons.share)),
          IconButton(
              padding: const EdgeInsets.only(left: 8, right: 16),
              onPressed: () async {
                final conversationType = widget.selectedConversation.type;

                if (conversationType == 1) {
                  final userID = widget.selectedConversation.userID;
                  // if had remark modifed its will back new remark
                  String? newRemark = await Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => UserProfile(userID: userID!),
                      ));
                  setState(() {
                    backRemark = newRemark;
                  });
                } else {
                  final groupID = widget.selectedConversation.groupID;
                  if (groupID != null) {
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => GroupProfilePage(
                            groupID: groupID,
                          ),
                        ));
                  }
                }
              },
              icon: Image.asset(
                'images/more.png',
                package: 'tim_ui_kit',
                height: 34,
                width: 34,
              ))
        ],
      ),
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

config的案例

config为消息页面设置.

代码示例为使用config中的做到不允许使用表情面板。

/// @title:"config为消息页面设置."
/// @title:"代码示例为使用config中的做到不允许使用表情面板。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/021dfda59e6f036bafb4c9c97633d3d1.png"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/d3f05e9b6f0ffcf323341f53d0722aae.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      config: TIMUIKitChatConfig(isAllowEmojiPanel: false),
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

conversationShowName的案例

conversationShowName为聊天页面的聊天对象名称。.

代码示例为使用自定义conversationShowName做到展示自定义聊天对象名称。

/// @title:"conversationShowName为聊天页面的聊天对象名称。."
/// @title:"代码示例为使用自定义conversationShowName做到展示自定义聊天对象名称。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/cac1f6fa9ed47a71920546eba15e3be1.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: "customData   " + _getTitle());
}

customStickerPanel的案例

customStickerPanel为自定义表情的选择框.

代码示例为使用customStickerPanel做到自定义表情的选择框。

customStickerPackageList为自定义表情列表。

/// @title:"customStickerPanel为自定义表情的选择框."
/// @title:"代码示例为使用customStickerPanel做到自定义表情的选择框。"
/// @title:"[customStickerPackageList](https://cloud.tencent.com/document/product/269/72486)为自定义表情列表。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/69cec4830cef562b7a354517f0296740.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  Widget renderCustomStickerPanel(
      {sendTextMessage, sendFaceMessage, deleteText, addText}) {
    final theme = Provider.of<DefaultThemeData>(context).theme;
    final customStickerPackageList =
        Provider.of<CustomStickerPackageData>(context).customStickerPackageList;
    return StickerPanel(
        sendTextMsg: sendTextMessage,
        sendFaceMsg: sendFaceMessage,
        deleteText: deleteText,
        addText: addText,
        customStickerPackageList: customStickerPackageList,
        backgroundColor: theme.weakBackgroundColor,
        lightPrimaryColor: theme.lightPrimaryColor);
  }

  return TIMUIKitChat(
      customStickerPanel: renderCustomStickerPanel,
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

draftText的案例

draftText为会话的草稿文本.

代码示例为使用draftText做到自定义会话的草稿文本。

/// @title:"draftText为会话的草稿文本."
/// @title:"代码示例为使用draftText做到自定义会话的草稿文本。"
/// @picture:"https://tuikit-1251787278.cos.ap-guangzhou.myqcloud.com/draftText.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  String? _getDraftText() {
    return widget.selectedConversation.draftText;
  }

  return TIMUIKitChat(
      draftText: 'customDraftText',
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

extraTipsActionItemBuilder的案例

extraTipsActionItemBuilder为新增的长按弹出消息操作功能的自定义选项的构造器.

代码示例为使用extraTipsActionItemBuilder做到在长按显示面板做后增加自定义操作。

/// @title:"extraTipsActionItemBuilder为新增的长按弹出消息操作功能的自定义选项的构造器."
/// @title:"代码示例为使用extraTipsActionItemBuilder做到在长按显示面板做后增加自定义操作。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/3d613a2003dfbf96b38ecafce4adbcd4.png"
@override
Widget build(BuildContext context) {
  Widget ItemInkWell({
    Widget? child,
    GestureTapCallback? onTap,
  }) {
    return SizedBox(
      width: 50,
      child: InkWell(
        onTap: onTap,
        child: Container(
          decoration: const BoxDecoration(
            color: Colors.white,
          ),
          child: child,
        ),
      ),
    );
  }

  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      extraTipsActionItemBuilder: (message, closeTooltip, [key]) {
        return Material(
          child: ItemInkWell(
              onTap: () {
                closeTooltip();
              },
              child: Column(children: [
                const Icon(
                  Icons.add_business,
                  size: 20,
                ),
                const SizedBox(
                  height: 4,
                ),
                Text(
                  'custom',
                  style: TextStyle(
                    decoration: TextDecoration.none,
                    fontSize: 10,
                  ),
                ),
              ])),
        );
      },
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

groupAtInfoList的案例

groupAtInfoList为群组消息@信息列表.

代码示例为使用groupAtInfoList获取群组消息@信息列表。

/// @title:"groupAtInfoList为群组消息@信息列表."
/// @title:"代码示例为使用groupAtInfoList获取群组消息@信息列表。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/7ba5256b260c838372eef63c4ecf23b7.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      groupAtInfoList: widget.selectedConversation.groupAtInfoList,
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

initFindingMsg的案例

initFindingMsg为进入页面需要查询的消息.

代码示例为使用initFindingMsg做到进入聊天页面并查询此会话最后一条消息。

/// @title:"initFindingMsg为进入页面需要查询的消息."
/// @title:"代码示例为使用initFindingMsg做到进入聊天页面并查询此会话最后一条消息。"
/// @picture:"https://tuikit-1251787278.cos.ap-guangzhou.myqcloud.com/initFindingMsg.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      initFindingMsg: widget.selectedConversation.lastMessage,
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

lifeCycle的案例

lifeCycle为聊天消息操作时的钩子函数.

代码示例为使用messageWillSend做到在发送消息前弹出弹窗的案例。

/// @title:"lifeCycle为聊天消息操作时的钩子函数."
/// @title:"代码示例为使用messageWillSend做到在发送消息前弹出弹窗的案例。"
/// @picture:"https://tuikit-1251787278.cos.ap-guangzhou.myqcloud.com/lifeCycle.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  ChatLifeCycle lifeCycle = ChatLifeCycle(
    messageWillSend: (V2TimMessage message) async {
      // 发送消息前的逻辑
      // 弹出对话框
      Future<bool?> messageWillSendDialog() {
        return showDialog<bool>(
          context: context,
          builder: (context) {
            return AlertDialog(
              title: const Text("提示"),
              content: const Text("您确定要发送消息吗?"),
              actions: <Widget>[
                TextButton(
                  child: const Text("取消"),
                  onPressed: () => Navigator.of(context).pop(), // 关闭对话框
                ),
                TextButton(
                  child: const Text("确定"),
                  onPressed: () {
                    //关闭对话框并返回true
                    Navigator.of(context).pop(true);
                  },
                ),
              ],
            );
          },
        );
      }

      bool isSend = await messageWillSendDialog() ?? false;
      return isSend ? message : null;
    },
  );
  return TIMUIKitChat(
      lifeCycle: lifeCycle,
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

mainHistoryListConfig的案例

mainHistoryListConfig为历史消息列表的ListView配置.

代码示例为使用mainHistoryListConfig做到历史消息列表中聊天对象头像右移。

/// @title:"mainHistoryListConfig为历史消息列表的ListView配置."
/// @title:"代码示例为使用mainHistoryListConfig做到历史消息列表中聊天对象头像右移。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/ca3e6dd92688cf5596bde55a21e3244c.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      mainHistoryListConfig: TIMUIKitHistoryMessageListConfig(
        padding: const EdgeInsets.only(left: 28),
      ),
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

messageItemBuilder的案例

messageItemBuilder为用于自定义不同种类消息样式的构造器.

代码示例为使用messageItemBuilder结合UIKit中的TIMUIKitTextElem构造自定义消息样式的案例。

/// @title:"messageItemBuilder为用于自定义不同种类消息样式的构造器."
/// @title:"代码示例为使用messageItemBuilder结合UIKit中的TIMUIKitTextElem构造自定义消息样式的案例。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/d6d6187f3a7b5f306e4348cb36e39572.png"
@override
Widget build(BuildContext context) {
  final TUIChatViewModel model = serviceLocator<TUIChatViewModel>();
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      messageItemBuilder: MessageItemBuilder(
          textMessageItemBuilder: ((message, isShowJump, clearJump) {
        if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) {
          message.textElem!.text = 'customData';
        }
        return TIMUIKitTextElem(
          chatModel: model,
          message: message,
          isFromSelf: message.isSelf ?? false,
          clearJump: () => model.jumpMsgID = "",
          isShowJump: isShowJump,
        );
      })),
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

morePanelConfig的案例

morePanelConfig为更多操作选项设置.

代码示例为使用morePanelConfig做到在更多操作中添加语音与视频操作。

/// @title:"morePanelConfig为更多操作选项设置."
/// @title:"代码示例为使用morePanelConfig做到在更多操作中添加语音与视频操作。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/eaa7b76216751a201a2810b322eec626.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  _goToVideoUI() async {
    final hasCameraPermission =
        await Permissions.checkPermission(context, Permission.camera.value);
    final hasMicphonePermission =
        await Permissions.checkPermission(context, Permission.microphone.value);
    if (!hasCameraPermission || !hasMicphonePermission) {
      return;
    }
    final isGroup = widget.selectedConversation.type == 2;
    tuiChatField.currentState.textFieldController.hideAllPanel();
    if (isGroup) {
      List<V2TimGroupMemberFullInfo>? selectedMember = await Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => SelectCallInviter(
            groupID: widget.selectedConversation.groupID,
          ),
        ),
      );
      if (selectedMember != null) {
        final inviteMember = selectedMember.map((e) => e.userID).toList();
        _calling?.groupCall(inviteMember, CallingScenes.Video,
            widget.selectedConversation.groupID);
      }
    } else {
      final user = await sdkInstance.getLoginUser();
      final myId = user.data;
      OfflinePushInfo offlinePush = OfflinePushInfo(
        title: "",
        desc: imt("邀请你视频通话"),
        ext: "{\"conversationID\": \"c2c_$myId\"}",
        disablePush: false,
        androidOPPOChannelID: PushConfig.OPPOChannelID,
        ignoreIOSBadge: false,
      );

      _calling?.call(widget.selectedConversation.userID!, CallingScenes.Video,
          offlinePush);
    }
  }

  _goToVoiceUI() async {
    final hasMicphonePermission =
        await Permissions.checkPermission(context, Permission.microphone.value);
    if (!hasMicphonePermission) {
      return;
    }
    final isGroup = widget.selectedConversation.type == 2;
    tuiChatField.currentState.textFieldController.hideAllPanel();
    if (isGroup) {
      List<V2TimGroupMemberFullInfo>? selectedMember = await Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => SelectCallInviter(
            groupID: widget.selectedConversation.groupID,
          ),
        ),
      );
      if (selectedMember != null) {
        final inviteMember = selectedMember.map((e) => e.userID).toList();
        _calling?.groupCall(inviteMember, CallingScenes.Audio,
            widget.selectedConversation.groupID);
      }
    } else {
      final user = await sdkInstance.getLoginUser();
      final myId = user.data;
      OfflinePushInfo offlinePush = OfflinePushInfo(
        title: "",
        desc: imt("邀请你语音通话"),
        ext: "{\"conversationID\": \"c2c_$myId\"}",
        disablePush: false,
        ignoreIOSBadge: false,
        androidOPPOChannelID: PushConfig.OPPOChannelID,
      );

      _calling?.call(widget.selectedConversation.userID!, CallingScenes.Audio,
          offlinePush);
    }
  }

  return TIMUIKitChat(
      morePanelConfig: MorePanelConfig(
        extraAction: [
          MorePanelItem(
              id: "voiceCall",
              title: imt("语音通话"),
              onTap: (c) {
                _goToVoiceUI();
              },
              icon: Container(
                height: 64,
                width: 64,
                margin: const EdgeInsets.only(bottom: 4),
                decoration: const BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.all(Radius.circular(5))),
                child: SvgPicture.asset(
                  "images/voice-call.svg",
                  package: 'tim_ui_kit',
                  height: 64,
                  width: 64,
                ),
              )),
          MorePanelItem(
              id: "videoCall",
              title: imt("视频通话"),
              onTap: (c) {
                _goToVideoUI();
              },
              icon: Container(
                height: 64,
                width: 64,
                margin: const EdgeInsets.only(bottom: 4),
                decoration: const BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.all(Radius.circular(5))),
                child: SvgPicture.asset(
                  "images/video-call.svg",
                  package: 'tim_ui_kit',
                  height: 64,
                  width: 64,
                ),
              ))
        ],
      ),
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

onDealWithGroupApplication的案例

onDealWithGroupApplication为点击处理加群申请后的回调函数.

代码示例为使用onDealWithGroupApplication做到在点击处理加群申请后跳转到群申请页面。

/// @title:"onDealWithGroupApplication为点击处理加群申请后的回调函数."
/// @title:"代码示例为使用onDealWithGroupApplication做到在点击处理加群申请后跳转到群申请页面。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/69e09c9798e7da68297b1706abb2ab47.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      onDealWithGroupApplication: (String groupId) {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => GroupApplicationList(
              groupID: groupId,
            ),
          ),
        );
      },
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

onTapAvatar的案例

onTapAvatar为点击头像的回调函数.

代码示例为使用自定义onTapAvatar做到点击用户头像进入用户信息页面

使用此属性时config的isAllowClickAvatar不能为false

/// @title:"onTapAvatar为点击头像的回调函数."
/// @title:"代码示例为使用自定义onTapAvatar做到点击用户头像进入用户信息页面"
/// @title:"使用此属性时config的isAllowClickAvatar不能为false"
/// @picture:"https://tuikit-1251787278.cos.ap-guangzhou.myqcloud.com/onTapAvatar.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  _onTapAvatar(String userID) {
    Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => UserProfile(userID: userID),
        ));
  }

  return TIMUIKitChat(
      onTapAvatar: _onTapAvatar,
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

showTotalUnReadCount的案例

showTotalUnReadCount为是否展示当前未读消息总数的设置.

代码示例为使用showTotalUnReadCount做到展示当前未读消息总数。

/// @title:"showTotalUnReadCount为是否展示当前未读消息总数的设置."
/// @title:"代码示例为使用showTotalUnReadCount做到展示当前未读消息总数。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/e2657057244fab56fc7cc56b82dac7d5.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      showTotalUnReadCount: true,
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

textFieldHintText的案例

textFieldHintText为输入框默认提示语.

代码示例为使用textFieldHintText做到自定义输入框默认提示语。

/// @title:"textFieldHintText为输入框默认提示语."
/// @title:"代码示例为使用textFieldHintText做到自定义输入框默认提示语。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/86a85582eb4593e5613293bf62dbb157.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      textFieldHintText: 'customHintText',
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

tongueItemBuilder的案例

tongueItemBuilder为小舌头构造器(右下角按钮提示框样式构造器).

代码示例为使用tongueItemBuilder自定义跳转到底部的小舌头。

/// @title:"tongueItemBuilder为小舌头构造器(右下角按钮提示框样式构造器)."
/// @title:"代码示例为使用tongueItemBuilder自定义跳转到底部的小舌头。"
/// @picture:"https://tuikit-1251787278.cos.ap-guangzhou.myqcloud.com/tongueItemBuilder.gif"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      tongueItemBuilder: (onClick, valueType, unreadCount) {
        if (valueType == MessageListTongueType.toLatest) {
          return GestureDetector(
            child: Container(
              child: Text('jumptodown'),
              decoration: BoxDecoration(color: Colors.white),
            ),
            onTap: () {
              onClick();
            },
          );
        }
        return Container();
      },
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

toolTipsConfig的案例

toolTipsConfig为长按消息显示的消息操作选项设置.

代码示例为使用toolTipsConfig做到只显示多选和删除操作。

/// @title:"toolTipsConfig为长按消息显示的消息操作选项设置."
/// @title:"代码示例为使用toolTipsConfig做到只显示多选和删除操作。"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/6813a2c4b012314bd64748289115c19f.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      toolTipsConfig: ToolTipsConfig(
          showCopyMessage: false,
          showForwardMessage: false,
          showRecallMessage: false,
          showReplyMessage: false),
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

topFixWidget的案例

topFixWidget为聊天页面上方自定义widget.

代码示例为使用topFixWidget做到在聊天页面上方显示自定义widget

/// @title:"topFixWidget为聊天页面上方自定义widget."
/// @title:"代码示例为使用topFixWidget做到在聊天页面上方显示自定义widget"
/// @picture:"https://qcloudimg.tencent-cloud.cn/raw/9f2d4ac07cb2f6026bc44a272cfccc90.png"
@override
Widget build(BuildContext context) {
  String? _getConvID() {
    return widget.selectedConversation.type == 1
        ? widget.selectedConversation.userID
        : widget.selectedConversation.groupID;
  }

  String _getTitle() {
    return backRemark ?? widget.selectedConversation.showName ?? "";
  }

  return TIMUIKitChat(
      topFixWidget: Row(
        children: [
          Expanded(
            child: Stack(
              children: [
                Container(
                  padding: const EdgeInsets.all(16),
                  height: 86,
                  color: const Color.fromRGBO(255, 149, 1, 0.1),
                  child: Text(
                    imt("【安全提示】本APP仅用于体验腾讯云即时通信 IM 产品功能,不可用于业务洽谈与拓展。请勿轻信汇款、中奖等涉及钱款等信息,勿轻易拨打陌生电话,谨防上当受骗。"),
                    style: TextStyle(
                      color: hexToColor("FF8C39"),
                      fontSize: 12,
                    ),
                  ),
                ),
                Positioned(
                  bottom: 16,
                  right: 16,
                  child: GestureDetector(
                    onTap: _openTSWebview,
                    child: Text(
                      imt("点此投诉"),
                      style: TextStyle(
                        color: hexToColor("006EFF"),
                        fontSize: 12,
                      ),
                    ),
                  ),
                )
              ],
            ),
          )
        ],
      ),
      key: tuiChatField,
      conversationID: _getConvID() ?? '',
      conversationType:
          widget.selectedConversation.type ?? ConversationType.V2TIM_C2C,
      conversationShowName: _getTitle());
}

results matching ""

    No results matching ""