From c5b1140d1a692f7d7e5a33aac8aea62acabdca06 Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Mon, 19 Jun 2023 18:20:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=81=8A=E5=A4=A9UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/assets/images/msg/emoji.png | Bin 0 -> 2538 bytes circle_app/assets/images/msg/photo.png | Bin 0 -> 7334 bytes circle_app/assets/images/msg/send.png | Bin 0 -> 4550 bytes circle_app/assets/images/msg/take_photo.png | Bin 0 -> 10086 bytes circle_app/assets/images/msg/voice.png | Bin 0 -> 9143 bytes circle_app/ios/Podfile.lock | 12 + circle_app/ios/Runner/Info.plist | 2 +- .../tim_uikit_send_sound_message.dart | 11 +- .../tim_uikit_text_field.dart | 34 +- .../tim_uikit_text_field_layout/narrow.dart | 618 +++++++++++------- .../app/chat/TIMUIKitChat/tim_uikit_chat.dart | 7 +- circle_app/lib/app/chat/view.dart | 4 +- circle_app/lib/app/circle/view.dart | 2 + circle_app/lib/app/home/view.dart | 1 + circle_app/lib/app/msg/view.dart | 19 +- circle_app/lib/main.dart | 55 +- circle_app/pubspec.yaml | 6 +- 17 files changed, 479 insertions(+), 292 deletions(-) create mode 100644 circle_app/assets/images/msg/emoji.png create mode 100644 circle_app/assets/images/msg/photo.png create mode 100644 circle_app/assets/images/msg/send.png create mode 100644 circle_app/assets/images/msg/take_photo.png create mode 100644 circle_app/assets/images/msg/voice.png diff --git a/circle_app/assets/images/msg/emoji.png b/circle_app/assets/images/msg/emoji.png new file mode 100644 index 0000000000000000000000000000000000000000..740fe9c3c439773fe21847bf267bbab3dc16c4e4 GIT binary patch literal 2538 zcmVPx;q)9|URCr$PoOi4>RTah8vMaXOu>uwZtdXWDAQ*}!5=>Oon1~t$1VquOpdu*f zABduYLI|RXSpFbLV!^0E#D)^1u~TeVz>10ub(vo{lbmmu`=;FcT5@;t^1i$~=ggip z`|PvN+UtJS(pE&kOMF&FUBR+*J4+&hrr7@^{YBCrC7omY?NcThGiFr)O2WKE$B~lW zIL4uo*RuRhlk@>ezqFl^<9jb(I6z4rAnDbTURd%dO&NPPNq6s? zK+>-zeGs5*vm_U03k4|2bITjOe~*V3N&2Fs&q?}oNyaQ6elYwZf!|uvJtgfb=|z(E z>Y4W!l3r%};zc2}5P*`f3mqrv%`+VPtEAsbI>Giw=W#yCVUk`dX$MKrS z-&{5~KxIjtE$QhUp8QSHMM_mlK> zNe}7p06<Tm z!X(sDKalkB*4UG5pD<>=Q2-?&5q`FH1HyM#+t-h|@oHb2gysJQNe^q?>k!)?AA0}6 z03~^#q_4E{4&i#RZMM`6XGth5@$HV4b5z~D&_VfV5J2T@^;Sv8w@^6IHoM1$wImdc z?H!fBy=KVSZ74v5>(?aJM~I7UAFyGOsT@o4jdEOR{`&ipGq3COe<(nwP`bA!+urt1 z`fjihK2Jg(`nDvfmc~xD-ODr#1&EV2=dH%5HIB0V-;Dr3pAThMd!MA2x31mF_TN_; z-wRL@B8LcSj0vA%`;tD#Hqz%wb}75sT`Iqh>m%KU0Ccsa?W#$yu)Xt`hfhL1@>FOI z+aDS;w!SvWT_rucFp?MAhPNJUNk|EGZFH6GcCEC6z8VXGl8QcEe_FG0)6sNP<(JlJt~n#G$s& z8{~R-a*dB77ZMdYt)_U{xxUI)f8A<4{yt|smYZ{-&gDt5G}I z<`6j8l8_^6kQvJxW9bgIBqtYIw;pqz?L!Aoa`Q`rs;!@a#Qj9uw30>vMAghel#?+A z@$^XBz13%Zmn3v1=yDuYx}`km`D0K1h4(%NQeG0#%{*t@ZaN`@a7wbZq@PxG9lZ6n zwmGAX0*J`DrWyfQJKLsA-?WzG9+JM=;)}Mk4QQhPqSaDwf8Q#ESl6z!X#h(?$wHA! z>$@>{>&~XaN;!zUQP&ud^ZVPLwVP}TkV@%6-)#5F;XQ4Cd29qN0V*BL&NrW=y~MsF zX>Z#k>rHEA)A&63blxS_PSWtsPnxwIZWhFn+)EPqwC?3iO44leWcH?%hhAkn{LN+o zqsz}E_m%Xcs-K4jX`3nAJli3M!$(v%8dcVBL?DwO-uiy!8$qy(?LUl7(iCI#lAc@* zJjV9v8}Y%1`jiBf2vV8G*uCJlMjtg$fzk7RMK#$)whtQW%tpK}2{lm7B%BM=IIFT> zRk{O!N=F0*21^#2V=#X+BZt5*?NRaws*%o9_^g++FuJ2W9HL7^PB3|mJ%5bGCkfy* zd<$|I`uC7l7ubfa?6pF=zoe)|P{X2(#pub=1|MWaTLhop7$pm&+e}etFZq=O2C(i< zUTM2d+$%bl1U8Yk-epwfBurQXBr3?~INZ{G;83}fq?UulTSujsY4*S_AF!^d=teeqRr-oHG)q1aTIcYDpEdpq(OPBb}9)efs;UO z@37r&hK`S*0ua^b_asrKH+H#glK5mR=b{Hmf_^3WBB{e5!2pM7xpv<3UlJ54wM388 z!0tn|Oub920K|19LzuzZ-etS}x5vIj**Ah)z(#d*9NOd@pz$a1?~Z3gyy3F zDj=QMAsDAt;vl=`UsvjiqSDhNXSQ{Ur`bNXFY@ZorvOB_Qv9`rlnwpw8_^N$=x{}xGFDaJb-#rGR7DfzJYS9KT5|RMVf9d& zQK!HKqjluW)o6EMGx=f1q!YRyqN|o{rR#aU8_w_{0jxBByR-gBul=;3#Zd( zBvF3o`8RbGiI$T#%eStAXU)af5A$uud6!iC1`7wMfW*8ULZKHBaSwUOJ|Jg(&bbOI zn+a literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/photo.png b/circle_app/assets/images/msg/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f07f66727519ab880036e570a7230d36ea9150 GIT binary patch literal 7334 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

m9zDX2{s8G&=m_`v$%>hGFwWc(IB(5vjkGnESV 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/take_photo.png b/circle_app/assets/images/msg/take_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..1a91a8f93f200275102ebc5b6efd9ca2311b8846 GIT binary patch literal 10086 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 C1EBx_ literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/voice.png b/circle_app/assets/images/msg/voice.png new file mode 100644 index 0000000000000000000000000000000000000000..6cca7c98a45d2f6105f035b9ca74363b2a160722 GIT binary patch literal 9143 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 BnEC(! literal 0 HcmV?d00001 diff --git a/circle_app/ios/Podfile.lock b/circle_app/ios/Podfile.lock index 43764b2..fcd0b25 100644 --- a/circle_app/ios/Podfile.lock +++ b/circle_app/ios/Podfile.lock @@ -3,6 +3,8 @@ PODS: - Flutter - camera_avfoundation (0.0.1): - Flutter + - device_info (0.0.1): + - Flutter - device_info_plus (0.0.1): - Flutter - disk_space (0.0.1): @@ -129,10 +131,13 @@ PODS: - Flutter - wakelock (0.0.1): - Flutter + - webview_flutter_wkwebview (0.0.1): + - Flutter DEPENDENCIES: - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) + - device_info (from `.symlinks/plugins/device_info/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - disk_space (from `.symlinks/plugins/disk_space/ios`) - fc_native_video_thumbnail_for_us (from `.symlinks/plugins/fc_native_video_thumbnail_for_us/ios`) @@ -156,6 +161,7 @@ DEPENDENCIES: - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) SPEC REPOS: trunk: @@ -178,6 +184,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/audioplayers_darwin/ios" camera_avfoundation: :path: ".symlinks/plugins/camera_avfoundation/ios" + device_info: + :path: ".symlinks/plugins/device_info/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" disk_space: @@ -224,10 +232,13 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/video_player_avfoundation/ios" wakelock: :path: ".symlinks/plugins/wakelock/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" SPEC CHECKSUMS: audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb + device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed disk_space: e94d34bbdf77954adfb39e60bde9cc5c7233eda6 DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac @@ -264,6 +275,7 @@ SPEC CHECKSUMS: url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126 wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f + webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a PODFILE CHECKSUM: 9f3fe3e871b4a811f0f2f55cc60906d65b3d629e diff --git a/circle_app/ios/Runner/Info.plist b/circle_app/ios/Runner/Info.plist index fc10eaf..1a0eee6 100644 --- a/circle_app/ios/Runner/Info.plist +++ b/circle_app/ios/Runner/Info.plist @@ -2,7 +2,7 @@ - Microphone Usage Description + NSMicrophoneUsageDescription 应用想要访问您的麦克风,用于发送语音 NSCameraUsageDescription 应用想要访问您的相机,用于设置头像/动态发布 diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart index bcd1a2e..1ef8dfa 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart @@ -16,7 +16,7 @@ import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/sound_record.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; -class SendSoundMessage extends StatefulWidget { +class TIMSendSoundMessage extends StatefulWidget { /// conversation ID final String conversationID; @@ -26,7 +26,7 @@ class SendSoundMessage extends StatefulWidget { /// the conversation type final ConvType conversationType; - const SendSoundMessage( + const TIMSendSoundMessage( {required this.conversationID, required this.conversationType, Key? key, @@ -34,10 +34,10 @@ class SendSoundMessage extends StatefulWidget { : super(key: key); @override - State createState() => _SendSoundMessageState(); + State createState() => _TIMSendSoundMessageState(); } -class _SendSoundMessageState extends TIMUIKitState { +class _TIMSendSoundMessageState extends TIMUIKitState { final TUIChatGlobalModel model = serviceLocator(); String soundTipsText = ""; bool isRecording = false; @@ -68,7 +68,8 @@ class _SendSoundMessageState extends TIMUIKitState { width: 160, height: 160, decoration: const BoxDecoration( - color: Color(0xff77797A), + color: Colors.transparent, + // color: Color(0xff77797A), borderRadius: BorderRadius.all(Radius.circular(20.0)), ), child: Column( diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart index 5c5d473..a0834c5 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart @@ -1,5 +1,7 @@ import 'dart:async'; import 'dart:math'; +import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart'; +import 'package:circle_app/util/util.dart'; import 'package:diff_match_patch/diff_match_patch.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_setting_model.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart'; @@ -23,24 +25,10 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField enum MuteStatus { none, me, all } -typedef CustomStickerPanel = Widget Function({ - void Function() sendTextMessage, - void Function(int index, String data) sendFaceMessage, - void Function() deleteText, - void Function(int unicode) addText, - void Function(String singleEmojiName) addCustomEmojiText, - List defaultCustomEmojiStickerList, - /// If non-null, requires the child to have exactly this width. - double? width, +GlobalKey<_InputTextFieldState> myInputTextFieldState = GlobalKey(); - /// If non-null, requires the child to have exactly this height. - double? height, -}); - -GlobalKey<_InputTextFieldState> inputTextFieldState = GlobalKey(); - -class TIMUIKitInputTextField extends StatefulWidget { +class TIMInputTextField extends StatefulWidget { /// conversation id final String conversationID; @@ -95,7 +83,7 @@ class TIMUIKitInputTextField extends StatefulWidget { final String? groupType; - const TIMUIKitInputTextField( + const TIMInputTextField( {Key? key, required this.conversationID, required this.conversationType, @@ -122,7 +110,7 @@ class TIMUIKitInputTextField extends StatefulWidget { State createState() => _InputTextFieldState(); } -class _InputTextFieldState extends TIMUIKitState { +class _InputTextFieldState extends TIMUIKitState { final TUIChatGlobalModel globalModel = serviceLocator(); final TUISettingModel settingModel = serviceLocator(); final RegExp atTextReg = RegExp(r'@([^@\s]*)'); @@ -297,8 +285,10 @@ class _InputTextFieldState extends TIMUIKitState { goDownBottom(); _handleSendEditStatus("", false); + } else { + showToast('请输入消息内容'); } - } +} void goDownBottom() { if (globalModel.getMessageListPosition(widget.conversationID) == @@ -647,7 +637,7 @@ class _InputTextFieldState extends TIMUIKitState { } @override - void didUpdateWidget(TIMUIKitInputTextField oldWidget) { + void didUpdateWidget(TIMInputTextField oldWidget) { super.didUpdateWidget(oldWidget); if (widget.conversationID != oldWidget.conversationID) { handleSetDraftText(oldWidget.conversationID, oldWidget.conversationType); @@ -763,7 +753,7 @@ class _InputTextFieldState extends TIMUIKitState { builder: (BuildContext context, BoxConstraints constraints) { inputWidth = constraints.maxWidth; return TUIKitScreenUtils.getDeviceWidget( - defaultWidget: TIMUIKitTextFieldLayoutNarrow( + defaultWidget: TIMTextFieldLayoutNarrow( onEmojiSubmitted: onEmojiSubmitted, onCustomEmojiFaceSubmitted: onCustomEmojiFaceSubmitted, backSpaceText: backSpaceText, @@ -793,7 +783,7 @@ class _InputTextFieldState extends TIMUIKitState { handleSoftKeyBoardDelete: _handleSoftKeyBoardDelete, onSubmitted: onSubmitted, goDownBottom: goDownBottom, - showSendAudio: widget.showSendAudio, + showSendAudio: false, showSendEmoji: widget.showSendEmoji, showMorePanel: widget.showMorePanel, customEmojiStickerList: widget.customEmojiStickerList), diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart index 40679d4..00fc3e4 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart @@ -1,8 +1,14 @@ import 'dart:async'; import 'dart:math'; +import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart'; +import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_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'; @@ -20,9 +26,9 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField import 'package:tencent_extended_text_field/extended_text_field.dart'; import 'package:tencent_keyboard_visibility/tencent_keyboard_visibility.dart'; -GlobalKey<_TIMUIKitTextFieldLayoutNarrowState> narrowTextFieldKey = GlobalKey(); +GlobalKey<_TIMTextFieldLayoutNarrowState> TIMnarrowTextFieldKey = GlobalKey(); -class TIMUIKitTextFieldLayoutNarrow extends StatefulWidget { +class TIMTextFieldLayoutNarrow extends StatefulWidget { /// sticker panel customization final CustomStickerPanel? customStickerPanel; @@ -93,7 +99,7 @@ class TIMUIKitTextFieldLayoutNarrow extends StatefulWidget { final List customEmojiStickerList; - const TIMUIKitTextFieldLayoutNarrow( + const TIMTextFieldLayoutNarrow( {Key? key, this.customStickerPanel, required this.onEmojiSubmitted, @@ -129,13 +135,14 @@ class TIMUIKitTextFieldLayoutNarrow extends StatefulWidget { : super(key: key); @override - State createState() => - _TIMUIKitTextFieldLayoutNarrowState(); + State createState() => + _TIMTextFieldLayoutNarrowState(); } -class _TIMUIKitTextFieldLayoutNarrowState - extends TIMUIKitState { +class _TIMTextFieldLayoutNarrowState + extends TIMUIKitState { final TUISettingModel settingModel = serviceLocator(); + final ImagePicker _picker = ImagePicker(); bool showMore = false; bool showMoreButton = true; @@ -189,34 +196,34 @@ class _TIMUIKitTextFieldLayoutNarrowState if (showEmojiPanel) { return widget.customStickerPanel != null ? widget.customStickerPanel!( - sendTextMessage: () { - widget.onEmojiSubmitted(); - setSendButton(); - }, - sendFaceMessage: widget.onCustomEmojiFaceSubmitted, - deleteText: () { - widget.backSpaceText(); - setSendButton(); - }, - addText: (int unicode) { - final newText = String.fromCharCode(unicode); - widget.addStickerToText(newText); - // handleSetDraftText(); - }, - addCustomEmojiText: ((String singleEmojiName) { - String? emojiName = singleEmojiName.split('.png')[0]; - if (widget.isUseDefaultEmoji && - widget.languageType == 'zh' && - ConstData.emojiMapList[emojiName] != null && - ConstData.emojiMapList[emojiName] != '') { - emojiName = ConstData.emojiMapList[emojiName]; - } - final newText = '[$emojiName]'; - widget.addStickerToText(newText); - setSendButton(); - }), - defaultCustomEmojiStickerList: - widget.isUseDefaultEmoji ? ConstData.emojiList : []) + sendTextMessage: () { + widget.onEmojiSubmitted(); + setSendButton(); + }, + sendFaceMessage: widget.onCustomEmojiFaceSubmitted, + deleteText: () { + widget.backSpaceText(); + setSendButton(); + }, + addText: (int unicode) { + final newText = String.fromCharCode(unicode); + widget.addStickerToText(newText); + // handleSetDraftText(); + }, + addCustomEmojiText: ((String singleEmojiName) { + String? emojiName = singleEmojiName.split('.png')[0]; + if (widget.isUseDefaultEmoji && + widget.languageType == 'zh' && + ConstData.emojiMapList[emojiName] != null && + ConstData.emojiMapList[emojiName] != '') { + emojiName = ConstData.emojiMapList[emojiName]; + } + final newText = '[$emojiName]'; + widget.addStickerToText(newText); + setSendButton(); + }), + defaultCustomEmojiStickerList: + widget.isUseDefaultEmoji ? ConstData.emojiList : []) : EmojiPanel(onTapEmoji: (unicode) { final newText = String.fromCharCode(unicode); widget.addStickerToText(newText); @@ -256,7 +263,7 @@ class _TIMUIKitTextFieldLayoutNarrowState final height = originHeight != 0 ? originHeight : currentKeyboardHeight; return height; } else if (showMore || showEmojiPanel) { - return 248.0 + (bottomPadding ?? 0.0); + return 268.0 + (bottomPadding ?? 0.0); } else if (widget.textEditingController.text.length >= 46 && showKeyboard == false) { return 25 + (bottomPadding ?? 0.0); @@ -388,190 +395,208 @@ class _TIMUIKitTextFieldLayoutNarrowState return Column( children: [ _buildRepliedMessage(widget.repliedMessage), - Container( - color: widget.backgroundColor ?? hexToColor("f5f5f6"), - child: Column( - children: [ - Container( - padding: - const EdgeInsets.symmetric(vertical: 8, horizontal: 16), - constraints: const BoxConstraints(minHeight: 50), - child: Row( - children: [ - if (widget.forbiddenText != null) - Expanded( - child: Container( - height: 35, - color: theme.weakBackgroundColor, - alignment: Alignment.center, - child: Text( - TIM_t(widget.forbiddenText!), - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 16, - color: theme.weakTextColor, + Stack( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular( + 16.sp, + ), + topRight: Radius.circular(16.sp)), + color: Color(0xFF423055), + // color: Colors.yellow, + ), + child: Column( + children: [ + Container( + padding: + EdgeInsets.symmetric(vertical: 8, horizontal: 12.sp), + constraints: const BoxConstraints(minHeight: 30), + child: Row( + children: [ + if (widget.forbiddenText != null) + Expanded( + child: Container( + height: 35, + color: theme.weakBackgroundColor, + alignment: Alignment.center, + child: Text( + TIM_t(widget.forbiddenText!), + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: theme.weakTextColor, + ), + ), + )), + if (PlatformUtils().isMobile && + widget.showSendAudio && + widget.forbiddenText == null) + InkWell( + onTap: () async { + showKeyboard = showSendSoundText; + if (showSendSoundText) { + widget.focusNode.requestFocus(); + } + if (await Permissions.checkPermission( + context, + Permission.microphone.value, + theme, + )) { + setState(() { + showEmojiPanel = false; + showMore = false; + showSendSoundText = !showSendSoundText; + }); + } + }, + child: SvgPicture.asset( + showSendSoundText + ? 'images/keyboard.svg' + : 'images/voice.svg', + package: 'tencent_cloud_chat_uikit', + color: const Color.fromRGBO(68, 68, 68, 1), + height: 28, + width: 28, + ), ), - ), - )), - if (PlatformUtils().isMobile && - widget.showSendAudio && - widget.forbiddenText == null) - InkWell( - onTap: () async { - showKeyboard = showSendSoundText; - if (showSendSoundText) { - widget.focusNode.requestFocus(); - } - if (await Permissions.checkPermission( - context, - Permission.microphone.value, - theme, - )) { - setState(() { - showEmojiPanel = false; - showMore = false; - showSendSoundText = !showSendSoundText; - }); - } - }, - child: SvgPicture.asset( - showSendSoundText - ? 'images/keyboard.svg' - : 'images/voice.svg', - package: 'tencent_cloud_chat_uikit', - color: const Color.fromRGBO(68, 68, 68, 1), - height: 28, - width: 28, - ), - ), - if (widget.forbiddenText == null) - const SizedBox( - width: 10, - ), - if (widget.forbiddenText == null) - Expanded( - child: showSendSoundText - ? SendSoundMessage( - onDownBottom: widget.goDownBottom, - conversationID: widget.conversationID, - conversationType: widget.conversationType) - : KeyboardVisibility( - child: ExtendedTextField( - maxLines: 4, - minLines: 1, - focusNode: widget.focusNode, - onChanged: debounceFunc, - onTap: () { - showKeyboard = true; - widget.goDownBottom(); - setState(() { - showEmojiPanel = false; - showMore = false; - }); - }, - keyboardType: TextInputType.multiline, - textInputAction: PlatformUtils().isAndroid - ? TextInputAction.newline - : TextInputAction.send, - onEditingComplete: () { - widget.onSubmitted(); - if (showKeyboard) { - widget.focusNode.requestFocus(); - } - setState(() { - if (widget.textEditingController.text - .isEmpty) { - showMoreButton = true; - } - }); - }, - textAlignVertical: TextAlignVertical.top, - decoration: InputDecoration( - border: InputBorder.none, - hintStyle: const TextStyle( - // fontSize: 10, - color: Color(0xffAEA4A3), + if (widget.forbiddenText == null) + const SizedBox( + width: 10, + ), + Stack( + children: [ + Container( + width: 296.sp, + padding: EdgeInsets.symmetric( + vertical: 8, horizontal: 12.sp), + constraints: + const BoxConstraints(minHeight: 30), + decoration: BoxDecoration( + color: Color(0x1AFFFFFF), + borderRadius: BorderRadius.circular(26.sp), + ), + child: Row( + children: [ + if (widget.forbiddenText == null) + Expanded( + child: showSendSoundText + ? TIMSendSoundMessage( + onDownBottom: + widget.goDownBottom, + conversationID: + widget.conversationID, + conversationType: + widget.conversationType) + : KeyboardVisibility( + child: ExtendedTextField( + style: TextStyle( + color: Colors.white, + fontSize: 14.sp), + maxLines: 4, + minLines: 1, + focusNode: widget.focusNode, + onChanged: debounceFunc, + onTap: () { + showKeyboard = true; + widget.goDownBottom(); + setState(() { + showEmojiPanel = false; + showMore = false; + }); + }, + keyboardType: + TextInputType.multiline, + textInputAction: + PlatformUtils() + .isAndroid + ? TextInputAction + .newline + : TextInputAction + .send, + onEditingComplete: () { + widget.onSubmitted(); + if (showKeyboard) { + widget.focusNode + .requestFocus(); + } + setState(() { + if (widget + .textEditingController + .text + .isEmpty) { + showMoreButton = true; + } + }); + }, + textAlignVertical: + TextAlignVertical.top, + decoration: InputDecoration( + border: InputBorder.none, + hintStyle: TextStyle( + fontSize: 14.sp, + color: + Color(0xB3FFFFFF), + ), + hintText: widget.hintText, + fillColor: + Colors.transparent, + filled: true, + isDense: true, + ), + controller: widget + .textEditingController, + specialTextSpanBuilder: + PlatformUtils().isWeb + ? null + : DefaultSpecialTextSpanBuilder( + isUseDefaultEmoji: + widget + .isUseDefaultEmoji, + customEmojiStickerList: + widget + .customEmojiStickerList, + showAtBackground: + true, + )), + onChanged: (bool visibility) { + if (showKeyboard != + visibility) { + setState(() { + showKeyboard = visibility; + }); + } + }), + ), + if (widget.forbiddenText == null) + const SizedBox( + width: 10, + ), + if (widget.showSendEmoji && + widget.forbiddenText == null) + InkWell( + onTap: () { + _openEmojiPanel(); + widget.goDownBottom(); + }, + child: Image.asset( + getMsgImage('emoji'), + height: 24.sp, + width: 24.sp, ), - fillColor: Colors.white, - filled: true, - isDense: true, - hintText: widget.hintText ?? ''), - controller: widget.textEditingController, - specialTextSpanBuilder: PlatformUtils() - .isWeb - ? null - : DefaultSpecialTextSpanBuilder( - isUseDefaultEmoji: - widget.isUseDefaultEmoji, - customEmojiStickerList: - widget.customEmojiStickerList, - showAtBackground: true, - )), - onChanged: (bool visibility) { - if (showKeyboard != visibility) { - setState(() { - showKeyboard = visibility; - }); - } - }), - ), - if (widget.forbiddenText == null) - const SizedBox( - width: 10, - ), - if (widget.showSendEmoji && widget.forbiddenText == null) - InkWell( - onTap: () { - _openEmojiPanel(); - widget.goDownBottom(); - }, - child: PlatformUtils().isWeb - ? Icon( - showEmojiPanel - ? Icons.keyboard_alt_outlined - : Icons.mood_outlined, - color: hexToColor("5c6168"), - size: 32) - : SvgPicture.asset( - showEmojiPanel - ? 'images/keyboard.svg' - : 'images/face.svg', - package: 'tencent_cloud_chat_uikit', - color: const Color.fromRGBO(68, 68, 68, 1), - height: 28, - width: 28, - ), - ), - if (widget.forbiddenText == null) - const SizedBox( - width: 10, - ), - if (widget.showMorePanel && - widget.forbiddenText == null && - showMoreButton) - InkWell( - onTap: () { - // model.sendCustomMessage(data: "a", convID: model.currentSelectedConv, convType: model.currentSelectedConvType == 1 ? ConvType.c2c : ConvType.group); - _openMore(); - widget.goDownBottom(); - }, - child: PlatformUtils().isWeb - ? Icon(Icons.add_circle_outline_outlined, - color: hexToColor("5c6168"), size: 32) - : SvgPicture.asset( - 'images/add.svg', - package: 'tencent_cloud_chat_uikit', - color: const Color.fromRGBO(68, 68, 68, 1), - height: 28, - width: 28, - ), - ), - if ((isAndroidDevice() || isWebDevice()) && !showMoreButton) - SizedBox( - height: 32.0, - child: ElevatedButton( - onPressed: () { + ), + ], + )) + ], + ), + if (widget.forbiddenText == null) + const SizedBox( + width: 10, + ), + InkWell( + onTap: () { widget.onSubmitted(); if (showKeyboard) { widget.focusNode.requestFocus(); @@ -582,30 +607,167 @@ class _TIMUIKitTextFieldLayoutNarrowState } }); }, - child: Text(TIM_t("发送")), + child: Image.asset( + getMsgImage('send'), + height: 24.sp, + width: 24.sp, + ), ), - ), - ], - ), + ], + ), + ), + Container( + height: 40.sp, + width: Get.width, + // color: Colors.red, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + GestureDetector( + onTap: () async { + showKeyboard = showSendSoundText; + if (showSendSoundText) { + widget.focusNode.requestFocus(); + } + try { + var data = await Permission.microphone.status; + if (data.isGranted) { + setState(() { + showEmojiPanel = false; + showMore = false; + showSendSoundText = !showSendSoundText; + }); + } else { + var data = await Permission.microphone.request(); + if (data.isGranted) { + setState(() { + showEmojiPanel = false; + showMore = false; + showSendSoundText = !showSendSoundText; + }); + } else { + Permissions.showPermissionConfirmDialog(context, Permission.microphone.value); + } + } + } catch (e) { + print(e); + } + }, + child: Image.asset( + getMsgImage('voice'), + width: 40.sp, + ), + ), + GestureDetector( + onTap: () { + getImageFile(); + }, + child: + Image.asset(getMsgImage('photo'), width: 40.sp), + ), + GestureDetector( + onTap: () { + getTakeImageFile(); + }, + child: Image.asset(getMsgImage('take_photo'), + width: 40.sp), + ), + ], + ), + ), + AnimatedContainer( + duration: Duration( + milliseconds: + (showKeyboard && PlatformUtils().isAndroid) + ? 200 + : 340), + curve: Curves.fastOutSlowIn, + height: max(_getBottomHeight(), 0.0), + // child: ListView( + // physics: const NeverScrollableScrollPhysics(), + // children: [_getBottomContainer()], + // ), + ), + ], ), - AnimatedContainer( + ), + Positioned( + bottom: MediaQuery.of(context).padding.bottom + 20, + child: AnimatedContainer( duration: Duration( milliseconds: (showKeyboard && PlatformUtils().isAndroid) ? 200 : 340), curve: Curves.fastOutSlowIn, + width: Get.width, height: max(_getBottomHeight(), 0.0), child: ListView( physics: const NeverScrollableScrollPhysics(), - children: [ - _getBottomContainer() - ], + children: [_getBottomContainer()], ), ), - ], - ), + ) + ], ) ], ); } + + Future getImageFile() async { + try { + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.gallery, + ); + await widget.model.sendImageMessage( + imagePath: pickedFile!.path, + convID: widget.conversationID, + convType: widget.conversationType, + inputElement: context); + } catch (e) { + print(e); + // setState(() { + // _pickImageError = e; + // }); + } + } + + Future getTakeImageFile() async { + try { + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.camera, + ); + widget.model.sendImageMessage( + imagePath: pickedFile!.path, + convID: widget.conversationID, + convType: widget.conversationType, + inputElement: context); + } catch (e) {} + } + + _handleCameraAndMic() async { + // // 请求权限 + // Map permissions = await PermissionHandler().requestPermissions( + // [PermissionGroup.camera, PermissionGroup.microphone], + // ); + // + // //校验权限 + // if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { + // print("无照相权限"); + // return false; + // } + // if (permissions[PermissionGroup.microphone] != PermissionStatus.granted) { + // print("无麦克风权限"); + // return false; + // } + // return true; + // } + // + // void _onVoiceCall() async { + // // await for camera and mic permissions before pushing video page + // if (await _handleCameraAndMic()) { + // navigatePushPage(this.context, + // new PageAVChatCallerStatefulWidget(Int64(this.sessionInfo.sessionId), this.sessionInfo.sessionName)); + // } + // } + } } diff --git a/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart b/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart index 3ac18ed..2a1f164 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart @@ -27,6 +27,8 @@ import 'TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; import 'TIMUIKItMessageList/tim_uikit_history_message_list_container.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'TIMUIKitTextField/tim_uikit_text_field.dart'; + class TIMChat extends StatefulWidget { int startTime = 0; int endTime = 0; @@ -465,7 +467,7 @@ class _TUIChatState extends TIMUIKitState { ) : (widget.textFieldBuilder != null ? widget.textFieldBuilder!(context) - : TIMUIKitInputTextField( + : TIMInputTextField( key: inputTextFieldState, atMemberPanelScroll: atMemberPanelScroll, @@ -486,8 +488,7 @@ class _TUIChatState extends TIMUIKitState { scrollController: autoController, conversationID: _getConvID(), conversationType: _getConvType(), - initText: widget.draftText, - hintText: widget.textFieldHintText, + hintText: '最近心情怎么样?', showMorePanel: widget.config ?.isAllowShowMorePanel ?? true, diff --git a/circle_app/lib/app/chat/view.dart b/circle_app/lib/app/chat/view.dart index 1157560..6a6f205 100644 --- a/circle_app/lib/app/chat/view.dart +++ b/circle_app/lib/app/chat/view.dart @@ -44,6 +44,8 @@ class ChatPage extends StatelessWidget { )); }).toList(); return StickerPanel( + backgroundColor:Colors.transparent, + showBottomContainer: false, sendTextMsg: sendTextMessage, sendFaceMsg: (index, data) => sendFaceMessage(index + 1, (data.split("/")[3]).split("@")[0]), @@ -69,7 +71,7 @@ class ChatPage extends StatelessWidget { // 仅供演示,非全部配置项,实际使用中,可只传和默认项不同的参数,无需传入所有开关 isAllowClickAvatar: true, isUseDefaultEmoji: true, - isAllowLongPressMessage: true, + isAllowLongPressMessage: false, isShowReadingStatus: true, isShowGroupReadingStatus: true, notificationTitle: "", diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index 919e329..3cf6a3c 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -17,9 +17,11 @@ class CirclePage extends StatelessWidget { @override Widget build(BuildContext context) { return Container( + width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, decoration: BoxDecoration( + color: Color(0xFF423055), image: DecorationImage( fit: BoxFit.fill, image: AssetImage(getBaseImage('home_back')))), diff --git a/circle_app/lib/app/home/view.dart b/circle_app/lib/app/home/view.dart index 6000545..e5c99fd 100644 --- a/circle_app/lib/app/home/view.dart +++ b/circle_app/lib/app/home/view.dart @@ -39,6 +39,7 @@ class HomePage extends StatelessWidget { // color: Colors.red, padding: EdgeInsets.only(left: 50.sp, right: 50.sp, top: 8.sp), decoration: BoxDecoration( + color: Color(0xFF423055), image: DecorationImage( fit: BoxFit.fill, image: AssetImage( diff --git a/circle_app/lib/app/msg/view.dart b/circle_app/lib/app/msg/view.dart index cb036e8..a07366a 100644 --- a/circle_app/lib/app/msg/view.dart +++ b/circle_app/lib/app/msg/view.dart @@ -21,19 +21,18 @@ class MsgPage extends StatelessWidget { fit: BoxFit.fill, image: AssetImage(getBaseImage('home_back')))), child: Scaffold( + resizeToAvoidBottomInset:false, backgroundColor: Colors.transparent, body: SafeArea( child: GetBuilder(builder: (MsgLogic controller) { - return Container( - child: Column( - children: [ - navigatorItem(), - tipWidget(), - reconmandWidget(), - Text(controller.state.msg), - Expanded(child: msgWdiget(context)) - ], - ), + return Column( + children: [ + navigatorItem(), + tipWidget(), + reconmandWidget(), + Text(controller.state.msg), + Expanded(child: msgWdiget(context)) + ], ); }), ), diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index 7307b9b..df8479f 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -24,56 +24,71 @@ class MyApp extends StatefulWidget { class _MyAppState extends State { // This widget is the root of your application. + final List _guideList = ['bg', 'home_back']; + final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); @override void initState() { initIM(); + loadBgImage(); super.initState(); } initIM() { _coreInstance.init( - sdkAppID: 1400793496, // Replace 0 with the SDKAppID of your IM application when integrating + sdkAppID: + 1400793496, // Replace 0 with the SDKAppID of your IM application when integrating // language: LanguageEnum.en, // 界面语言配置,若不配置,则跟随系统语言 loglevel: LogLevelEnum.V2TIM_LOG_DEBUG, - onTUIKitCallbackListener: (TIMCallback callbackValue){ - switch(callbackValue.type) { + onTUIKitCallbackListener: (TIMCallback callbackValue) { + switch (callbackValue.type) { case TIMCallbackType.INFO: - // Shows the recommend text for info callback directly + // Shows the recommend text for info callback directly showToast(callbackValue.infoRecommendText!); break; case TIMCallbackType.API_ERROR: - //Prints the API error to console, and shows the error message. - print("Error from TUIKit: ${callbackValue.errorMsg}, Code: ${callbackValue.errorCode}"); - if (callbackValue.errorCode == 10004 && callbackValue.errorMsg!.contains("not support @all")) { + //Prints the API error to console, and shows the error message. + print( + "Error from TUIKit: ${callbackValue.errorMsg}, Code: ${callbackValue.errorCode}"); + if (callbackValue.errorCode == 10004 && + callbackValue.errorMsg!.contains("not support @all")) { showToast("当前群组不支持@全体成员"); - }else{ - showToast(callbackValue.errorMsg ?? callbackValue.errorCode.toString()); + } else { + showToast(callbackValue.errorMsg ?? + callbackValue.errorCode.toString()); } break; case TIMCallbackType.FLUTTER_ERROR: default: - // prints the stack trace to console or shows the catch error - if(callbackValue.catchError != null){ + // prints the stack trace to console or shows the catch error + if (callbackValue.catchError != null) { showToast(callbackValue.catchError.toString()); - - }else{ + } else { print(callbackValue.stackTrace); // loginIM(); } } }, // [建议配置,详见此部分](https://cloud.tencent.com/document/product/269/70746#callback) - listener: V2TimSDKListener( - onConnectSuccess: () { - loginIM(); - } - )); + listener: V2TimSDKListener(onConnectSuccess: () { + loginIM(); + })); + } + + loadBgImage() async { + await precacheImage(precacheImages(_guideList.first),context); + await precacheImage(precacheImages(_guideList.last),context); + } + + precacheImages(String image) { + return AssetImage(getBaseImage(image)); } loginIM() async { - var info = await _coreInstance.login(userID: '123456', userSig: 'eJwtzEELgjAYxvHvsmshc25rCl40OlRIYaVX0RUvrTFsDFn03TP1*Pwe*H-Q5VgGTvYoQSTAaD1t6KS2cIeJQxJRxpfn3T0bY6BDSUgx3sQRjfn8yMFAL0dnjBGM8awWXn-jggtBY0qXCjzGcJ7tT4eVrHa6aG9FWfsms*rqK3cW2hulHKkHtzU2L9sUfX-YTTG5'); + var info = await _coreInstance.login( + userID: '123456', + userSig: + 'eJwtzEELgjAYxvHvsmshc25rCl40OlRIYaVX0RUvrTFsDFn03TP1*Pwe*H-Q5VgGTvYoQSTAaD1t6KS2cIeJQxJRxpfn3T0bY6BDSUgx3sQRjfn8yMFAL0dnjBGM8awWXn-jggtBY0qXCjzGcJ7tT4eVrHa6aG9FWfsms*rqK3cW2hulHKkHtzU2L9sUfX-YTTG5'); print(info); - } @override diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index 9e346e1..0d7f0d6 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -60,10 +60,12 @@ dependencies: dio: ^5.0.0 #获取设备信息 device_info: ^2.0.3 - + #本地数据缓存 shared_preferences: ^2.1.2 - + #集成腾讯IM包含UIKIT库 tencent_cloud_chat_uikit: ^2.0.0 + #权限申请 + permission_handler: ^10.3.0 dev_dependencies: flutter_test: