From 9860ad3ce14eff487b6cace62c7d6c09238e9b08 Mon Sep 17 00:00:00 2001 From: yangyuhao <291808500@qq.com> Date: Fri, 1 Sep 2023 11:53:44 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=8A=A2=E5=8D=A0=E9=94=81=E5=B1=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 ++-- circle_app/android/app/src/main/AndroidManifest.xml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index 27abffa..46635c0 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -65,8 +65,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 6 - versionName "1.0.5" + versionCode 7 + versionName "1.0.6" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/android/app/src/main/AndroidManifest.xml b/circle_app/android/app/src/main/AndroidManifest.xml index 8cda5a1..f7243ff 100644 --- a/circle_app/android/app/src/main/AndroidManifest.xml +++ b/circle_app/android/app/src/main/AndroidManifest.xml @@ -71,7 +71,6 @@ android:hardwareAccelerated="true" android:usesCleartextTraffic="true" android:screenOrientation="portrait" - android:showWhenLocked="true" android:turnScreenOn="true" android:networkSecurityConfig="@xml/network_security_config" android:windowSoftInputMode="adjustResize"> From a2b8a959fab08364d68216eefd965e2d4d9a869c Mon Sep 17 00:00:00 2001 From: yangyuhao <291808500@qq.com> Date: Mon, 4 Sep 2023 10:39:15 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E6=84=8F=E5=8D=8F=E8=AE=AE=E9=80=80=E5=87=BA=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 ++-- .../src/main/res/drawable/launch_background.xml | 2 +- .../main/res/mipmap-xxhdpi/launch_image.webp | Bin 20986 -> 0 bytes circle_app/assets/images/base/launch_back.webp | Bin 0 -> 35656 bytes circle_app/assets/images/base/launch_image.webp | Bin 19500 -> 0 bytes .../lib/app/dialog/YesAgreementDialog.dart | 15 ++++++++------- circle_app/lib/app/splash/view.dart | 2 +- circle_app/lib/network/api.dart | 4 ++-- 8 files changed, 14 insertions(+), 13 deletions(-) delete mode 100644 circle_app/android/app/src/main/res/mipmap-xxhdpi/launch_image.webp create mode 100644 circle_app/assets/images/base/launch_back.webp delete mode 100644 circle_app/assets/images/base/launch_image.webp diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index 46635c0..cf84743 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -65,8 +65,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 7 - versionName "1.0.6" + versionCode 8 + versionName "1.0.7" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/android/app/src/main/res/drawable/launch_background.xml b/circle_app/android/app/src/main/res/drawable/launch_background.xml index 6ce8efd..a97dc18 100644 --- a/circle_app/android/app/src/main/res/drawable/launch_background.xml +++ b/circle_app/android/app/src/main/res/drawable/launch_background.xml @@ -7,7 +7,7 @@ + android:src="@mipmap/launch_back" /> y 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 yuzCn*7qJ2smRQ_C0Q<%0Apkh!0E3xsr~pw~7>ob_0000A1AqVk000000000wG-x0I diff --git a/circle_app/assets/images/base/launch_back.webp b/circle_app/assets/images/base/launch_back.webp new file mode 100644 index 0000000000000000000000000000000000000000..60810aa3e582ce3cb61072529286156a49afdc05 GIT binary patch literal 35656 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/base/launch_image.webp b/circle_app/assets/images/base/launch_image.webp deleted file mode 100644 index 5e1f52002a2b3230634d3ced7fd867806d07e00d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19500 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 @5%4&U7&J& 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 { children: [ TextSpan( text: "《用户协议》", - style: TextStyle( + style: const TextStyle( color: Color(0xFF21BEAB), ), recognizer: TapGestureRecognizer() @@ -94,7 +94,7 @@ class _CustomDialogState extends State { navigateToUserAgreement(); }, ), - TextSpan( + const TextSpan( text: "和", style: TextStyle( color: Colors.white, @@ -102,7 +102,7 @@ class _CustomDialogState extends State { ), TextSpan( text: "《隐私政策》", - style: TextStyle( + style: const TextStyle( color: Color(0xFF21BEAB), ), recognizer: TapGestureRecognizer() @@ -133,12 +133,12 @@ class _CustomDialogState extends State { }, child: Container( width: 240.sp, - padding: EdgeInsets.symmetric( + padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 44, ), decoration: BoxDecoration( - gradient: LinearGradient( + gradient: const LinearGradient( colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], begin: Alignment.centerLeft, end: Alignment.centerRight, @@ -159,7 +159,8 @@ class _CustomDialogState extends State { TextButton( onPressed: () { // 点击不同意按钮的操作 - exit(1); + // exit(1); + SystemNavigator.pop(); }, child: Text( "不同意并退出应用", diff --git a/circle_app/lib/app/splash/view.dart b/circle_app/lib/app/splash/view.dart index d4cb354..2277145 100644 --- a/circle_app/lib/app/splash/view.dart +++ b/circle_app/lib/app/splash/view.dart @@ -15,7 +15,7 @@ class SplashPage extends StatelessWidget { return Container( decoration: const BoxDecoration( image: DecorationImage( - image: AssetImage('assets/images/base/launch_image.webp'), + image: AssetImage('assets/images/base/launch_back.webp'), fit: BoxFit.cover, ), ), diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index f4ec783..cbeac92 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -1,9 +1,9 @@ class Api { - static const baseUrl = 'https://leyuan666.com/zuul-service/'; + static const baseUrl = 'https://leyuan666.com/zuul-service/'; - // static const baseUrl = 'http://192.168.3.55:2000/' ; + // static const baseUrl = 'http://192.168.3.55:2000/' ; // 获取验证码 From 4a86537491019da318ea18fc7dedcfaee26de580 Mon Sep 17 00:00:00 2001 From: yangyuhao <291808500@qq.com> Date: Thu, 7 Sep 2023 12:04:21 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=90=84=E7=A7=8D=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E6=94=B9=E6=88=90=E4=BB=8E=E6=9C=8D=E5=8A=A1=E7=AB=AF=E6=8B=89?= =?UTF-8?q?=E5=8F=96=20=20=E8=81=8A=E5=A4=A9=E7=95=8C=E9=9D=A2=E5=8F=91?= =?UTF-8?q?=E8=A7=86=E9=A2=91=20=20=E8=BF=98=E6=9C=89=E4=BA=9B=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=B8=8A=E7=9A=84=E5=B0=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +- circle_app/assets/images/msg/icon_video.png | Bin 0 -> 10016 bytes .../assets/images/msg/icon_video_camera.png | Bin 0 -> 9831 bytes circle_app/lib/app/aboutapp/logic.dart | 2 + circle_app/lib/app/aboutapp/view.dart | 2 +- .../tim_uikit_text_field_layout/narrow.dart | 143 ++++- circle_app/lib/app/chat/view.dart | 3 +- circle_app/lib/app/circle/state.dart | 5 + circle_app/lib/app/circle/view.dart | 61 ++- .../app/circle/widgets/info_list_view.dart | 487 ++++++++++-------- circle_app/lib/app/dialog/UpdateDialog.dart | 4 +- .../lib/app/dialog/YesAgreementDialog.dart | 4 +- circle_app/lib/app/home/logic.dart | 1 - .../tim_uikit_conversation.dart | 13 +- circle_app/lib/app/splash/logic.dart | 40 +- circle_app/lib/app/userinfo/view.dart | 33 +- circle_app/lib/network/dio_manager.dart | 2 +- circle_app/lib/util/util.dart | 112 ++-- 18 files changed, 558 insertions(+), 358 deletions(-) create mode 100644 circle_app/assets/images/msg/icon_video.png create mode 100644 circle_app/assets/images/msg/icon_video_camera.png diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index cf84743..bbb3fee 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -65,8 +65,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 8 - versionName "1.0.7" + versionCode 10 + versionName "1.0.9" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/assets/images/msg/icon_video.png b/circle_app/assets/images/msg/icon_video.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd31c2508ada7872d111186bccd249e22c88d38 GIT binary patch literal 10016 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�vpG)~57y3pI2Ib=CyM3-Wkalo(JG?|Nqj{V`M)>JEf z->2H&eZz@D?t~o76MugAAHM*gKW=ofyEaH<8>E`!C{1voVXn49U7J;rRJVkOy09n1 zmMw5WT$0X2!E)yKRGyCpWVeftF*=IG;N-&a&y+pjIw$$K1VhWJ^eQ(AyBaUj%_G$#MZ9-aD2ls6!g``+rtB zY2CL~nBF_y+}xlg2(V`Cu2*YN_b7muvx^i|M8+!%k7ii95HVqDZBgP6$dY;LWv1gQ ziuH1Ni@z_#fXli#&K|sliDz!st_|mSH(SNvIeF#sJ zpWs)+9L(#uP2bU3s=+Ow^?N~4IV1h(IfGB4<>@u2yC&9mc3kp{-N8Gb8}&L<2Ju7W z&?iiXQ8ve^48v8F*XDL4YPhN~HYG{ZdTnnT62^VQ9*qWy5rtxy$hHlk;?9cXT zkT52VU>A;6dx+RESrqaREwT%`p+7cozI0w>qo%X54W{0%-lrqlz@5qCTSvg`d~jLGdB@DC19SuNty_rKG;vm%uNJO37DsE zk|u(u5B5_sa}&W+0_N$Pq>13^gZ-4u+(ht{fO+~RX(D*~U_T`@|33_VhqP)-Ov3;G N002ovPDHLkV1k#FydeMp literal 0 HcmV?d00001 diff --git a/circle_app/lib/app/aboutapp/logic.dart b/circle_app/lib/app/aboutapp/logic.dart index 839941e..9d86586 100644 --- a/circle_app/lib/app/aboutapp/logic.dart +++ b/circle_app/lib/app/aboutapp/logic.dart @@ -50,6 +50,8 @@ class AboutappLogic extends GetxController { getUpVersion() async { if(isUpdate){ showReportDialog(Get.context!, _updateInfo!.constraint == 0, _updateInfo!); + }else { + showOKToast("暂无新版本"); } } diff --git a/circle_app/lib/app/aboutapp/view.dart b/circle_app/lib/app/aboutapp/view.dart index d6f2509..d1d906b 100644 --- a/circle_app/lib/app/aboutapp/view.dart +++ b/circle_app/lib/app/aboutapp/view.dart @@ -177,7 +177,7 @@ class AboutappPage extends StatelessWidget { ), ):Container(), Text( - logic.version, + "", style: TextStyle( color: const Color(0xFFB7BECC), fontSize: 12.sp, 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 c3e1afb..89fa94b 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,5 +1,7 @@ import 'dart:async'; +import 'dart:io'; import 'dart:math'; +import 'dart:typed_data'; import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart'; import 'package:circle_app/app/minefragment/logic.dart'; @@ -30,8 +32,11 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart'; import 'package:tencent_extended_text_field/extended_text_field.dart'; import 'package:tencent_keyboard_visibility/tencent_keyboard_visibility.dart'; +import 'package:video_player/video_player.dart'; +import 'package:video_thumbnail/video_thumbnail.dart'; import '../../../../../util/eventBus.dart'; +import '../../../../call_out/logic.dart'; GlobalKey<_TIMTextFieldLayoutNarrowState> TIMnarrowTextFieldKey = GlobalKey(); @@ -79,7 +84,7 @@ class TIMTextFieldLayoutNarrow extends StatefulWidget { /// hint text for textField widget final String? hintText; - final String? userId; + final String? userId; final int? currentCursor; @@ -139,7 +144,7 @@ class TIMTextFieldLayoutNarrow extends StatefulWidget { required this.showSendEmoji, required this.showMorePanel, this.hintText, - this.userId, + this.userId, required this.customEmojiStickerList, this.controller}) : super(key: key); @@ -174,9 +179,10 @@ class _TIMTextFieldLayoutNarrowState } }); } - if(null==commentBlackEvent){ - commentBlackEvent = EventBusManager.on().listen((event) { - if(event.userId == widget.userId){ + if (null == commentBlackEvent) { + commentBlackEvent = + EventBusManager.on().listen((event) { + if (event.userId == widget.userId) { isBlack = event.isBlack; } }); @@ -184,15 +190,16 @@ class _TIMTextFieldLayoutNarrowState getBlack(); } - StreamSubscription? commentBlackEvent =null; + + StreamSubscription? commentBlackEvent = null; + @override void dispose() { print("TIMTextFieldLayoutNarrow解绑"); - if(null!=commentBlackEvent){ + if (null != commentBlackEvent) { EventBusManager.cancelSubscription(commentBlackEvent!); } - super.dispose(); } @@ -200,7 +207,7 @@ class _TIMTextFieldLayoutNarrowState getBlack() async { final FriendshipServices _friendshipServices = - serviceLocator(); + serviceLocator(); List? blacklist = await _friendshipServices.getBlackList(); if (blacklist != null) { isBlack = false; @@ -213,7 +220,6 @@ class _TIMTextFieldLayoutNarrowState } } - void setSendButton() { final value = widget.textEditingController.text; if (isWebDevice() || isAndroidDevice()) { @@ -411,7 +417,7 @@ class _TIMTextFieldLayoutNarrowState setKeyboardHeight ??= OptimizeUtils.debounce((height) { settingModel.keyboardHeight = height; }, const Duration(seconds: 1)); - // + // final debounceFunc = _debounce((value) { if (isWebDevice() || isAndroidDevice()) { if (value.isEmpty && showMoreButton != true) { @@ -518,7 +524,7 @@ class _TIMTextFieldLayoutNarrowState Stack( children: [ Container( - width: Get.width - 80.sp, + width: Get.width - 80.sp, // width: 296.sp, padding: EdgeInsets.symmetric( vertical: 8, horizontal: 12.sp), @@ -667,7 +673,7 @@ class _TIMTextFieldLayoutNarrowState ), ), Container( - height: 40.sp, + height: 64.sp, width: Get.width, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -691,7 +697,8 @@ class _TIMTextFieldLayoutNarrowState showSendSoundText = !showSendSoundText; }); } else { - var data = await Permission.microphone.request(); + var data = + await Permission.microphone.request(); if (data.isGranted) { setState(() { showEmojiPanel = false; @@ -699,7 +706,8 @@ class _TIMTextFieldLayoutNarrowState showSendSoundText = !showSendSoundText; }); } else { - Permissions.showPermissionConfirmDialog(context, Permission.microphone.value); + Permissions.showPermissionConfirmDialog( + context, Permission.microphone.value); } } } catch (e) { @@ -733,6 +741,28 @@ class _TIMTextFieldLayoutNarrowState child: Image.asset(getMsgImage('take_photo'), width: 40.sp), ), + GestureDetector( + onTap: () { + if (isBlack) { + showOKToast("您已将对方拉黑,请移除黑名单后在发送消息~"); + return; + } + getVideoFile(ImageSource.gallery); + }, + child: Image.asset(getMsgImage('icon_video'), + width: 40.sp), + ), + GestureDetector( + onTap: () { + if (isBlack) { + showOKToast("您已将对方拉黑,请移除黑名单后在发送消息~"); + return; + } + getVideoFile(ImageSource.camera); + }, + child: Image.asset(getMsgImage('icon_video_camera'), + width: 40.sp), + ), ], ), ), @@ -783,7 +813,6 @@ class _TIMTextFieldLayoutNarrowState User userInfoBean = bean.data.user!; isVip = userInfoBean.vip > 0; } - } if (!isVip) { showOKToast('开通会员之后才能发送图片'); @@ -801,6 +830,81 @@ class _TIMTextFieldLayoutNarrowState return isVip; } + VideoPlayerController? videoPlayerController; + + Future getVideoFile(ImageSource imageSource) async { + bool isOK = await checkVipStatus(); + if (!isOK) { + return; + } + + XFile? pickedFile; + String? thumbnailPath; // 声明 thumbnailPath 变量 + + try { + pickedFile = await _picker.pickVideo( + source: imageSource, + ); + if (pickedFile == null) { + return; + } + + videoPlayerController = VideoPlayerController.file( + File(pickedFile.path), + videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), + ); + await videoPlayerController?.initialize().then((_) async { + thumbnailPath = await VideoThumbnail.thumbnailFile( + video: pickedFile!.path, + imageFormat: ImageFormat.JPEG, + maxWidth: 100, + quality: 50, + ); + }); + + final Duration videoDuration = videoPlayerController!.value.duration; + final double durationInSeconds = videoDuration.inSeconds.toDouble(); + + await widget.model.sendVideoMessage( + videoPath: pickedFile.path, + snapshotPath: thumbnailPath, + // 在此处可用 + convID: widget.conversationID, + convType: widget.conversationType, + duration: durationInSeconds.toInt(), + inputElement: context, + ); + } catch (e) { + print(e); + // setState(() { + // _pickImageError = e; + // }); + } + } + + Future getFirstPic(url) async { + Uint8List? bytes = await VideoThumbnail.thumbnailData(video: url); + final Completer completer = Completer(); + if (bytes != null) { + int _imageDataSize = bytes.length; + print("image size: $_imageDataSize"); + + final _image = Image.memory(bytes); + _image.image + .resolve(ImageConfiguration()) + .addListener(ImageStreamListener((ImageInfo info, bool _) { + completer.complete(ThumbnailResult( + image: _image, + dataSize: _imageDataSize, + height: info.image.height, + width: info.image.width, + )); + })); + } + + return completer.future; + } + Future getImageFile() async { bool isOK = await checkVipStatus(); if (!isOK) { @@ -825,10 +929,9 @@ class _TIMTextFieldLayoutNarrowState Future getTakeImageFile() async { bool isOK = await checkVipStatus(); - if (!isOK) { - return; - } - + if (!isOK) { + return; + } try { final XFile? pickedFile = await _picker.pickImage( diff --git a/circle_app/lib/app/chat/view.dart b/circle_app/lib/app/chat/view.dart index b1cf689..0da79e0 100644 --- a/circle_app/lib/app/chat/view.dart +++ b/circle_app/lib/app/chat/view.dart @@ -14,7 +14,6 @@ import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_chat_controller.dart'; import '../../util/eventBus.dart'; -import 'logic.dart'; class ChatPage extends StatefulWidget { @@ -111,6 +110,7 @@ class _ChatPageState extends State { Widget build(BuildContext context) { V2TimConversation con = Get.arguments; return TIMChat( + conversation: Get.arguments, customStickerPanel: renderCustomStickerPanel, onTapAvatar :(String userId,TapDownDetails tapDownDetails)async{ @@ -121,6 +121,7 @@ class _ChatPageState extends State { }, controller : _timuiKitChatController, config: TIMUIKitChatConfig( + // 仅供演示,非全部配置项,实际使用中,可只传和默认项不同的参数,无需传入所有开关 isAllowClickAvatar: true, isUseDefaultEmoji: true, diff --git a/circle_app/lib/app/circle/state.dart b/circle_app/lib/app/circle/state.dart index 2a79e75..a87fd99 100644 --- a/circle_app/lib/app/circle/state.dart +++ b/circle_app/lib/app/circle/state.dart @@ -1,3 +1,7 @@ +import 'package:get/get_rx/src/rx_types/rx_types.dart'; + +import 'logic.dart'; + class CircleState { String msg = ''; int index = 0; @@ -79,6 +83,7 @@ class Chat { int? count; List? users; + Chat({this.accountId, this.count, this.users}); Chat.fromJson(Map json) { diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index d6f087a..07844d9 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -21,7 +21,6 @@ class CirclePage extends StatefulWidget { class _CirclePageState extends State with AutomaticKeepAliveClientMixin { - @override bool get wantKeepAlive => true; @@ -31,24 +30,20 @@ class _CirclePageState extends State final state = Get.find().state; var getContext; - @override - void dispose() { - // TODO: implement dispose - super.dispose(); - } @override Widget build(BuildContext context) { + super.build(context); getContext = context; return GetBuilder(builder: (logic) { return Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, decoration: const BoxDecoration( - color: const Color(0xFF423055), - image: bgWidget), + color: const Color(0xFF423055), image: bgWidget), child: Scaffold( + resizeToAvoidBottomInset: false, backgroundColor: Colors.transparent, body: SafeArea( child: GetBuilder(builder: (CircleLogic controller) { @@ -66,25 +61,24 @@ class _CirclePageState extends State Expanded( child: Swiper( itemBuilder: (BuildContext context, int index) { + var bean = logic.circle.lists[index]; - // final GlobalKey infoListViewKey = GlobalKey(); + // final GlobalKey infoListViewKey = GlobalKey(); return InfoListView(index, bean, logic); }, onIndexChanged: (index) { controller.state.index = index; if (index == logic.circle.lists.length - 1) { logic.loadMore(); - } print(index.toString()); - }, index: controller.state.index, itemCount: logic.circle.lists.length, viewportFraction: 0.93, // scale: 0.9, - loop: false, - key: UniqueKey(), + loop: false, + key: UniqueKey(), // pagination: new SwiperPagination(),//如果不填则不显示指示点 // control: new SwiperControl(),//如果不填则不显示左右按钮 )) @@ -100,8 +94,8 @@ class _CirclePageState extends State logic.getCircleIndex().id.toString(), logic.getCircleIndex().title!, false)); - var data = await Get.toNamed(AppRoutes.Call_out, arguments: {'numbers': numbers}); - + var data = await Get.toNamed(AppRoutes.Call_out, + arguments: {'numbers': numbers}); }, child: Image.asset( getCircleImage('send_msg'), @@ -122,11 +116,11 @@ class _CirclePageState extends State infoList = statistics.lastVisitUsers; if (infoList.isNotEmpty) { for (var element in infoList) { - if(element["avatar"]!=null&&element["avatar"].contains("http")){ - urlList.add(element["avatar"]); - } + if (element["avatar"] != null && element["avatar"].contains("http")) { + urlList.add(element["avatar"]); + } - // urlList.add(element["avatar"]); + // urlList.add(element["avatar"]); } } } @@ -179,7 +173,7 @@ class _CirclePageState extends State ).createShader(Offset.zero & bounds.size); }, child: GestureDetector( - onTap: (){ + onTap: () { EventBusManager.fire(ScrollToTop()); }, child: Text( @@ -188,7 +182,9 @@ class _CirclePageState extends State fontSize: 18.sp, fontWeight: FontWeight.w600, color: Colors.white, - shadows: const [Shadow(color: Color(0xffF657FF), offset: Offset(0.0, -1))], + shadows: const [ + Shadow(color: Color(0xffF657FF), offset: Offset(0.0, -1)) + ], ), ), ), @@ -219,20 +215,23 @@ class _CirclePageState extends State getCircleImage('avatar_bg'), width: width.sp, ), - url.contains("http") ? ClipOval( - child: Image.network( - url, - width: (width - 1).sp, - height: (width - 1).sp, - fit: BoxFit.cover, - ), - ) : Text(url,style: TextStyle(color: Color(0xffF756FF),fontSize: 12.sp),) + url.contains("http") + ? ClipOval( + child: Image.network( + url, + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.cover, + ), + ) + : Text( + url, + style: TextStyle(color: Color(0xffF756FF), fontSize: 12.sp), + ) ], )); } - - void _showTextContentDialog(BuildContext context, String msg) { showDialog( context: context, diff --git a/circle_app/lib/app/circle/widgets/info_list_view.dart b/circle_app/lib/app/circle/widgets/info_list_view.dart index 959c59c..c8a42da 100644 --- a/circle_app/lib/app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/app/circle/widgets/info_list_view.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:cached_network_image/cached_network_image.dart'; @@ -27,22 +26,23 @@ class InfoListView extends StatefulWidget { var logic; Circle bean; int index; + // Function updateBeanCall; - InfoListView(this.index, this.bean, this.logic,{super.key}); - - + InfoListView(this.index, this.bean, this.logic, {super.key}); @override State createState() => InfoListViewState(); } + typedef void MyListViewback(State result); -class InfoListViewState extends State with AutomaticKeepAliveClientMixin { + +class InfoListViewState extends State + with AutomaticKeepAliveClientMixin { @override bool get wantKeepAlive => true; final ScrollController scrollController = ScrollController(); - ListLogic? listsLg; int callOutPage = 1; @@ -52,30 +52,29 @@ class InfoListViewState extends State with AutomaticKeepAliveClien var circleId = ''; List lists = []; - @override void dispose() { // TODO: implement dispose - if(null!=callRefreshCicle){ + if (null != callRefreshCicle) { EventBusManager.cancelSubscription(callRefreshCicle!); } - if(null!=scroToTop){ + if (null != scroToTop) { EventBusManager.cancelSubscription(scroToTop!); - } scrollController.dispose(); super.dispose(); - - } - StreamSubscription? callRefreshCicle =null; - StreamSubscription? scroToTop =null; + StreamSubscription? callRefreshCicle = null; + StreamSubscription? scroToTop = null; @override void initState() { // TODO: implement initState super.initState(); + + + scrollController.addListener(() { try { if (scrollController.position.pixels == @@ -86,14 +85,13 @@ class InfoListViewState extends State with AutomaticKeepAliveClien }); circleId = widget.bean.id.toString(); loadCallOutListData(); - callRefreshCicle = EventBusManager.on().listen((event) { - if(widget.bean.id.toString() == event.circleId){ + callRefreshCicle = EventBusManager.on().listen((event) { + if (widget.bean.id.toString() == event.circleId) { loadCallOutListData(); } }); - - scroToTop = EventBusManager.on().listen((event) { + scroToTop = EventBusManager.on().listen((event) { scrollController.animateTo( 0.0, duration: Duration(milliseconds: 300), @@ -101,12 +99,9 @@ class InfoListViewState extends State with AutomaticKeepAliveClien ); }); - // widget.back(widget.createState()); + // widget.back(widget.createState()); } - - - loadCallOutListData() async { var data = await DioManager.instance.get( url: "/up-service/interest/$circleId/callouts", @@ -175,10 +170,6 @@ class InfoListViewState extends State with AutomaticKeepAliveClien } }); - - - - // if (bean.isQueen) { // showJoinCiclePiker(cicleId); // } else { @@ -191,9 +182,9 @@ class InfoListViewState extends State with AutomaticKeepAliveClien } void pushMsgPage(Lists bean, String cicleId) async { - - if (widget.bean.is_limit&&widget.bean.amount>0) { - showJoinCiclePiker(cicleId,widget.bean.amount.toString(),widget.bean.oldAmount.toString(),2,(payResult){ + if (widget.bean.is_limit && widget.bean.amount > 0) { + showJoinCiclePiker(cicleId, widget.bean.amount.toString(), + widget.bean.oldAmount.toString(), 2, (payResult) { widget.bean.is_limit = false; if (Get.isRegistered()) { var logic = Get.find(); @@ -206,7 +197,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien logic.update(); } Get.back(); - },widget.bean.ios_item); + }, widget.bean.ios_item); return; } @@ -217,44 +208,47 @@ class InfoListViewState extends State with AutomaticKeepAliveClien return; } // if () - var data = await DioManager.instance.get( - url: "/up-service/callout/${bean.id}/chat",); + url: "/up-service/callout/${bean.id}/chat", + ); if (data["code"] == 200) { - pushChatPage(data['data']['account_id'].toString().split("_").last,data['data']['account_id'], bean.user!.nickname!); - await Future.delayed(Duration(seconds: 1)); - SharedPreferences sharedPreferences =await SharedPreferences.getInstance(); - // SharedPreferencesHelper.getInstance().then((sharedPreferences) { - int userId = sharedPreferences.getInt(SharedPreferencesHelper.USERID)??0; - String avatar = sharedPreferences.getString(SharedPreferencesHelper.AVATAR)??""; - String name = sharedPreferences.getString(SharedPreferencesHelper.NAME)??""; - bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name)); - widget.logic.update(); + pushChatPage(data['data']['account_id'].toString().split("_").last, + data['data']['account_id'], bean.user!.nickname!); + // await Future.delayed(Duration(seconds: 1)); + SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); + // SharedPreferencesHelper.getInstance().then((sharedPreferences) { + int userId = sharedPreferences.getInt(SharedPreferencesHelper.USERID) ?? 0; + String avatar = sharedPreferences.getString(SharedPreferencesHelper.AVATAR) ?? ""; + String name = sharedPreferences.getString(SharedPreferencesHelper.NAME) ?? ""; + bean.chat!.users!.add(Users(avatar: avatar, id: userId, nickname: name)); + // widget.logic.update(); // }); - } } @override Widget build(BuildContext context) { + super.build(context); List urlList = widget.bean.lastJoinUsers; List widgets = []; int i = 0; - // print(urlList); - if(null!=urlList){ + // print(urlList); + if (null != urlList) { urlList.forEach((element) { - if(widgets.length>2){ + if (widgets.length > 2) { return; } widgets.add(Positioned( left: 15.sp * i, - child: circleWidget(element.avatar??"https://qiniuyun.leyuan666.com/quanzi/avatar/default.png",element.id.toString()), + child: circleWidget( + element.avatar ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + element.id.toString()), )); i++; }); } - return ClipRRect( borderRadius: BorderRadius.circular(10.sp), child: Container( @@ -282,12 +276,12 @@ class InfoListViewState extends State with AutomaticKeepAliveClien refreshCircleData(); }, child: - // lists.isEmpty - // ? !callOutMore - // ? noResultWidget() - // : loaddingWidget(true) - // : - ListView.builder( + // lists.isEmpty + // ? !callOutMore + // ? noResultWidget() + // : loaddingWidget(true) + // : + ListView.builder( physics: const AlwaysScrollableScrollPhysics(), scrollDirection: Axis.vertical, controller: scrollController, @@ -304,59 +298,76 @@ class InfoListViewState extends State with AutomaticKeepAliveClien image: AssetImage( getCircleImage('circle_desc')))), child: Container( - margin: EdgeInsets.only(top: 10.sp,bottom: 10.sp), + margin: EdgeInsets.only( + top: 10.sp, bottom: 10.sp), child: Column( children: [ Container( - margin: EdgeInsets.only(bottom: 7.sp), - width: Get.width, - // height: 50.sp, - child: HideText(text: widget.bean.intro,additionText: '查看更多',maxLines: 3,style: TextStyle(color: Colors.white, fontSize: 14.sp),additionStyle: TextStyle(color: const Color(0xFFFF4DF6), fontSize: 14.sp),onTap: () { - _showTextContentDialog( - context, widget.bean.intro,widget.bean.title); - }, - )), - + margin: + EdgeInsets.only(bottom: 7.sp), + width: Get.width, + // height: 50.sp, + child: HideText( + text: widget.bean.intro, + additionText: '查看更多', + maxLines: 3, + style: TextStyle( + color: Colors.white, + fontSize: 14.sp), + additionStyle: TextStyle( + color: + const Color(0xFFFF4DF6), + fontSize: 14.sp), + onTap: () { + _showTextContentDialog( + context, + widget.bean.intro, + widget.bean.title); + }, + )), GestureDetector( - behavior:HitTestBehavior.opaque, - onTap: (){ + behavior: HitTestBehavior.opaque, + onTap: () { // showToast("点个鸡毛,星哥还没做"); // Get.toNamed(AppRoutes.FriendsActivity,arguments: '3'); }, - child:urlList.length==0?Container(): Row( - children: [ - Row( - children: [ - SizedBox( - height: 30.sp, - width: 30.0.sp + - 15.sp * - (widgets.length - - 1.sp), - child: Stack( - children: widgets, - ), - ), - SizedBox( - width: 8.sp, - ), - Text( - '${convertToTenThousand(widget.bean.joinTotal)}圈友加入', - style: TextStyle( - color: Colors.white, - fontSize: 12.sp), - ), - SizedBox( - width: 8.sp, - ), - // Image.asset( - // getCircleImage('play'), - // width: 20.sp, - // ) - ], - ) - ], - ), + child: urlList.length == 0 + ? Container() + : Row( + children: [ + Row( + children: [ + SizedBox( + height: 30.sp, + width: 30.0.sp + + 15.sp * + (widgets.length - + 1.sp), + child: Stack( + children: widgets, + ), + ), + SizedBox( + width: 8.sp, + ), + Text( + '${convertToTenThousand(widget.bean.joinTotal)}圈友加入', + style: TextStyle( + color: + Colors.white, + fontSize: 12.sp), + ), + SizedBox( + width: 8.sp, + ), + // Image.asset( + // getCircleImage('play'), + // width: 20.sp, + // ) + ], + ) + ], + ), ), ], ), @@ -411,29 +422,27 @@ class InfoListViewState extends State with AutomaticKeepAliveClien padding: EdgeInsets.all(1.sp), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), - child: Image.network( - widget.bean.image, - width: 40.sp, - height: 40.sp, - fit:BoxFit.cover - ), + child: Image.network(widget.bean.image, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover), ), ), Expanded( child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: (){ - scrollController.animateTo( - 0.0, // Scroll to the top - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - ); - }, - child: Container( - padding: EdgeInsets.only(left: 8.sp, top: 12.sp), - // alignment: Alignment., - height: 72.sp, - child: Column( + behavior: HitTestBehavior.opaque, + onTap: () { + scrollController.animateTo( + 0.0, // Scroll to the top + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + }, + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( @@ -455,10 +464,11 @@ class InfoListViewState extends State with AutomaticKeepAliveClien ), ), ], + ), ), - ), - )), - GestureDetector(//加入圈子 + )), + GestureDetector( + //加入圈子 onTap: () async { if (widget.bean.isJoin) { _showOutCircleDialog( @@ -497,7 +507,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien ))); } - void _showTextContentDialog(BuildContext context, String msg,String title) { + void _showTextContentDialog(BuildContext context, String msg, String title) { showDialog( context: context, builder: (BuildContext context) { @@ -508,7 +518,6 @@ class InfoListViewState extends State with AutomaticKeepAliveClien padding: const EdgeInsets.all(1.0), child: Stack( children: [ - Container( decoration: BoxDecoration( shape: BoxShape.rectangle, @@ -536,33 +545,39 @@ class InfoListViewState extends State with AutomaticKeepAliveClien top: 15, left: 0, right: 0, - child: Center(child: Text(title, style: TextStyle( - color: const Color(0xFFF7FAFA), fontSize: 16.sp)),)), + child: Center( + child: Text(title, + style: TextStyle( + color: const Color(0xFFF7FAFA), fontSize: 16.sp)), + )), Container( - margin: EdgeInsets.only(top: 24.sp,bottom: 24.sp), + margin: EdgeInsets.only(top: 24.sp, bottom: 24.sp), child: Container( - margin: EdgeInsets.only( - top: 12.sp, left: 14.sp, right: 14.sp), + margin: + EdgeInsets.only(top: 12.sp, left: 14.sp, right: 14.sp), alignment: Alignment.center, - child: SingleChildScrollView(child: Text( - msg, - textAlign: TextAlign.center, - style: TextStyle( - color: const Color(0xCCF7FAFA), fontSize: 16.sp), - ),), + child: SingleChildScrollView( + child: Text( + msg, + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), ), ), Positioned( - top:8.sp, + top: 8.sp, right: 10.sp, child: GestureDetector( onTap: () { Get.back(); }, child: Icon( - Icons.close,color: Colors.white, - size: 20.sp, - ), + Icons.close, + color: Colors.white, + size: 20.sp, + ), )), ], ), @@ -590,7 +605,8 @@ class InfoListViewState extends State with AutomaticKeepAliveClien onTap: () { // pushOtherPeopleHomePage(element.id.toString()); }, - child: circleWidget(element.avatar!,element.id.toString(), width: 24), + child: + circleWidget(element.avatar!, element.id.toString(), width: 24), ), )); index++; @@ -606,7 +622,6 @@ class InfoListViewState extends State with AutomaticKeepAliveClien double picHeight = 0.0; - if (lists.album != null) { if (lists.album!.isNotEmpty) { Album info = lists.album!.first; @@ -672,16 +687,22 @@ class InfoListViewState extends State with AutomaticKeepAliveClien // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( - onTap: ()async { - var sp = await SharedPreferencesHelper.getInstance(); + onTap: () async { + var sp = + await SharedPreferencesHelper.getInstance(); String myUserId = sp.getMyUserId(); - if(lists.user?.id!.toString() == myUserId){ + if (lists.user?.id!.toString() == myUserId) { Get.toNamed(AppRoutes.UserInfoActivity); return; } - if (widget.bean.is_limit&&widget.bean.amount>0) { - showJoinCiclePiker(widget.bean.id.toString(),widget.bean.amount.toString(),widget.bean.oldAmount.toString(),1,(payResult){ + if (widget.bean.is_limit && + widget.bean.amount > 0) { + showJoinCiclePiker( + widget.bean.id.toString(), + widget.bean.amount.toString(), + widget.bean.oldAmount.toString(), + 1, (payResult) { widget.bean.is_limit = false; if (Get.isRegistered()) { var logic = Get.find(); @@ -694,28 +715,28 @@ class InfoListViewState extends State with AutomaticKeepAliveClien logic.update(); } Get.back(); - },widget.bean.ios_item); + }, widget.bean.ios_item); return; } pushHomePage(lists, lists.id.toString()); }, child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('avatar_bg'), - width: 42.sp, - ), - ClipOval( - child: Image.network( - lists.user!.avatar_thumb!, - width: 40.sp, - height: 40.sp, - fit: BoxFit.cover, - ), - ) - ], - )), + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: 42.sp, + ), + ClipOval( + child: Image.network( + lists.user!.avatar_thumb!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover, + ), + ) + ], + )), Expanded( child: Container( padding: EdgeInsets.only(left: 8.sp, top: 12.sp), @@ -738,7 +759,9 @@ class InfoListViewState extends State with AutomaticKeepAliveClien lists.user?.vip != null && lists.user!.vip == 0 ? Container() : Image.asset( - getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), + getCircleImage(lists.user!.vip == 1 + ? 'vip' + : 'year_vip'), width: 36.sp, ) ], @@ -763,9 +786,12 @@ class InfoListViewState extends State with AutomaticKeepAliveClien Color(0xffB5D3FF) ])), child: Text( - getAgeCOntent(lists.user!.gender??0, lists.user!.age??0, - lists.user!.role??0, lists.user!.orientation??0), - // '${genderList[lists.user!.gender!]}.${lists.user!.age}.${roleList[lists.user!.role!]}.${orientationList[lists.user!.orientation!]}', + getAgeCOntent( + lists.user!.gender ?? 0, + lists.user!.age ?? 0, + lists.user!.role ?? 0, + lists.user!.orientation ?? 0), + // '${genderList[lists.user!.gender!]}.${lists.user!.age}.${roleList[lists.user!.role!]}.${orientationList[lists.user!.orientation!]}', style: TextStyle( color: Colors.black, fontSize: 12.sp, @@ -873,7 +899,10 @@ class InfoListViewState extends State with AutomaticKeepAliveClien )), GestureDetector( onTap: () { - pushMsgPage(lists, widget.bean.id.toString(),); + pushMsgPage( + lists, + widget.bean.id.toString(), + ); // pushHomePage( // lists, widget.bean.id.toString()); }, @@ -922,9 +951,9 @@ class InfoListViewState extends State with AutomaticKeepAliveClien widgets.add(Positioned( left: 12.sp * index, child: GestureDetector( - onTap: () { - }, - child: circleWidget(element.avatar!,element.id.toString(), width: 24), + onTap: () {}, + child: + circleWidget(element.avatar!, element.id.toString(), width: 24), ), )); index++; @@ -979,15 +1008,21 @@ class InfoListViewState extends State with AutomaticKeepAliveClien // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( - onTap: ()async { - var sp = await SharedPreferencesHelper.getInstance(); + onTap: () async { + var sp = + await SharedPreferencesHelper.getInstance(); String myUserId = sp.getMyUserId(); - if(lists.user?.id!.toString() == myUserId){ + if (lists.user?.id!.toString() == myUserId) { Get.toNamed(AppRoutes.UserInfoActivity); return; } - if (widget.bean.is_limit&&widget.bean.amount > 0) { - showJoinCiclePiker(widget.bean.id.toString(),widget.bean.amount.toString(),widget.bean.oldAmount.toString(),1,(payResult){ + if (widget.bean.is_limit && + widget.bean.amount > 0) { + showJoinCiclePiker( + widget.bean.id.toString(), + widget.bean.amount.toString(), + widget.bean.oldAmount.toString(), + 1, (payResult) { widget.bean.is_limit = false; if (Get.isRegistered()) { var logic = Get.find(); @@ -1000,28 +1035,28 @@ class InfoListViewState extends State with AutomaticKeepAliveClien logic.update(); } Get.back(); - },widget.bean.ios_item); + }, widget.bean.ios_item); return; } pushHomePage(lists, lists.id.toString()); }, child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('avatar_bg'), - width: 42.sp, - ), - ClipOval( - child: Image.network( - lists.user!.avatar!, - width: 40.sp, - height: 40.sp, - fit: BoxFit.cover, - ), - ) - ], - )), + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: 42.sp, + ), + ClipOval( + child: Image.network( + lists.user!.avatar!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover, + ), + ) + ], + )), Expanded( child: Container( padding: EdgeInsets.only(left: 8.sp, top: 12.sp), @@ -1041,10 +1076,13 @@ class InfoListViewState extends State with AutomaticKeepAliveClien SizedBox( width: 8.sp, ), - lists.user?.vip != null && lists.user!.vip == 0 + lists.user?.vip != null && + lists.user!.vip == 0 ? Container() : Image.asset( - getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), + getCircleImage(lists.user!.vip == 1 + ? 'vip' + : 'year_vip'), width: 36.sp, ) ], @@ -1070,8 +1108,11 @@ class InfoListViewState extends State with AutomaticKeepAliveClien Color(0xffB5D3FF) ])), child: Text( - getAgeCOntent(lists.user!.gender??0, lists.user!.age??0, - lists.user!.role??0, lists.user!.orientation??0), + getAgeCOntent( + lists.user!.gender ?? 0, + lists.user!.age ?? 0, + lists.user!.role ?? 0, + lists.user!.orientation ?? 0), style: TextStyle( color: Colors.black, fontSize: 12.sp, @@ -1188,9 +1229,8 @@ class InfoListViewState extends State with AutomaticKeepAliveClien color: Colors.white, fontSize: 12.sp), )), GestureDetector( - onTap: () async{ + onTap: () async { pushMsgPage(lists, widget.bean.id.toString()); - }, child: Image.asset( getCircleImage('chat'), @@ -1206,32 +1246,32 @@ class InfoListViewState extends State with AutomaticKeepAliveClien )); } - circleWidget(String url, String userId,{double width = 30}) { + circleWidget(String url, String userId, {double width = 30}) { return GestureDetector( - onTap: (){ - Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); - }, + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); + }, child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('avatar_bg'), - width: width.sp, - ), - ClipOval( - child: Image.network( - url??"https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", - width: (width - 1).sp, - height: (width - 1).sp, - fit: BoxFit.cover, - ), - ) - ], - )); + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + ClipOval( + child: Image.network( + url ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.cover, + ), + ) + ], + )); } - void _showOutCircleDialog( - BuildContext context, var controller, Circle bean) { + void _showOutCircleDialog(BuildContext context, var controller, Circle bean) { showDialog( context: context, builder: (BuildContext context) { @@ -1384,13 +1424,10 @@ class InfoListViewState extends State with AutomaticKeepAliveClien if (data['code'] == 200) { widget.bean = Circle.fromJson(data['data']); widget.logic.updateCircleInfo(widget.bean); - setState(() { - - }); + setState(() {}); // final logic = Get.put(CircleLogic()); // logic.update(); - - }else if(data['code'] == 404){ + } else if (data['code'] == 404) { var logic = Get.put(CircleLogic()); logic.circle.lists.removeAt(logic.state.index); logic.update(); diff --git a/circle_app/lib/app/dialog/UpdateDialog.dart b/circle_app/lib/app/dialog/UpdateDialog.dart index 7e0e503..bf7555b 100644 --- a/circle_app/lib/app/dialog/UpdateDialog.dart +++ b/circle_app/lib/app/dialog/UpdateDialog.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -// import 'package:flutter_install_app/flutter_install_app.dart'; + import 'package:flutter_install_app/flutter_install_app.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -218,7 +218,7 @@ class _CustomDialogState extends State { // SmartDialog.dismiss(); print(error); }); - // await AppInstaller.installApk(filePath, actionRequired: false); + await AppInstaller.installApk(filePath, actionRequired: false); } } diff --git a/circle_app/lib/app/dialog/YesAgreementDialog.dart b/circle_app/lib/app/dialog/YesAgreementDialog.dart index 60cebe8..e4005aa 100644 --- a/circle_app/lib/app/dialog/YesAgreementDialog.dart +++ b/circle_app/lib/app/dialog/YesAgreementDialog.dart @@ -78,7 +78,7 @@ class _CustomDialogState extends State { margin: EdgeInsets.only(left: 10.sp, right: 10.sp), child: RichText( text: TextSpan( - text: "感谢您信任并使用跨友APP,在你使用跨友的服务之前,请认真阅读", + text: "感谢您信任并使用微乐园APP,在你使用微乐园的服务之前,请认真阅读", style: TextStyle( color: Colors.white, fontSize: 14.sp, @@ -112,7 +112,7 @@ class _CustomDialogState extends State { ), TextSpan( text: - "的全部内容,以了解用户权力义务和个人信息处理规则。跨友仅会将您的信息用于提供服务和改善体验,我们将权力保障您的信息安全,请同意后使用,若您不同意本隐私政策,很遗憾,我们将无法为您提供完整的产品和服务。", + "的全部内容,以了解用户权力义务和个人信息处理规则。微乐园仅会将您的信息用于提供服务和改善体验,我们将权力保障您的信息安全,请同意后使用,若您不同意本隐私政策,很遗憾,我们将无法为您提供完整的产品和服务。", style: TextStyle( color: Colors.white, fontSize: 14.sp, diff --git a/circle_app/lib/app/home/logic.dart b/circle_app/lib/app/home/logic.dart index 06bace7..1da61b9 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:io'; -import 'dart:ffi'; import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/minefragment/logic.dart'; diff --git a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart index 44c646c..978fb0c 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -22,6 +22,7 @@ import 'package:tencent_cloud_chat_uikit/ui/widgets/customize_ball_pulse_header. import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_cloud_chat_uikit/ui/widgets/wide_popup.dart'; +import '../../../util/eventBus.dart'; import 'tim_uikit_conversation_item.dart'; typedef TIMConversationItemBuilder = Widget Function( @@ -190,9 +191,11 @@ class _TIMConversationState extends TIMUIKitState { model.setSelectedConversation(conversation); } - _clearHistory(V2TimConversation conversationItem) { - _timuiKitConversationController.clearHistoryMessage( + _clearHistory(V2TimConversation conversationItem) async{ + await _timuiKitConversationController.clearHistoryMessage( conversation: conversationItem); + await Future.delayed(Duration(seconds: 1)); + EventBusManager.fire(RefreshUnread()); } _pinConversation(V2TimConversation conversation) { @@ -201,9 +204,11 @@ class _TIMConversationState extends TIMUIKitState { isPinned: !conversation.isPinned!); } - _deleteConversation(V2TimConversation conversation) { - _timuiKitConversationController.deleteConversation( + _deleteConversation(V2TimConversation conversation) async{ + await _timuiKitConversationController.deleteConversation( conversationID: conversation.conversationID); + await Future.delayed(Duration(seconds: 1)); + EventBusManager.fire(RefreshUnread()); } List getFilteredConversation() { diff --git a/circle_app/lib/app/splash/logic.dart b/circle_app/lib/app/splash/logic.dart index b85781f..3a5e162 100644 --- a/circle_app/lib/app/splash/logic.dart +++ b/circle_app/lib/app/splash/logic.dart @@ -8,6 +8,7 @@ import 'package:get/get.dart'; import '../../router/app_routers.dart'; import '../../util/SharedPreferencesHelper.dart'; import '../dialog/YesAgreementDialog.dart'; +import '../select_circle/logic.dart'; import 'state.dart'; import '../../network/api.dart'; @@ -23,28 +24,44 @@ class SplashLogic extends GetxController { void onReady() async { // TODO: implement onReady super.onReady(); - - } @override void onInit() async { super.onInit(); - // await Future.delayed(Duration(seconds: 30)); + // await Future.delayed(Duration(seconds: 30)); + + var data1 = + await DioManager.instance.get(url: Api.getCircleList, params: {}); + var bean1 = BaseResponse.fromJson( + data1, (data1) => ConfigBean.fromJson(data1)); + if (bean1.code == 200) { + configBean = bean1.data!; + + configBean.genderMap.forEach((key, value) { + genderList.add(value); + }); + + configBean.orientationMap.forEach((key, value) { + orientationList.add(value); + }); + configBean.roleMap.forEach((key, value) { + roleList.add(value); + }); + } + + if ((await getAuthorization()).isEmpty) { - if(Platform.isIOS){ + if (Platform.isIOS) { pushLoginPage(); return; } bool isAgreemement = await getAgreemement(); - if(!isAgreemement){ + if (!isAgreemement) { showReportDialog(); - }else{ + } else { pushLoginPage(); } - - - } else { var data = await DioManager.instance.put(url: Api.refreshToken, params: {}); @@ -65,7 +82,8 @@ class SplashLogic extends GetxController { }); return; - } else if(bean.code == 5000||bean.code == 5001||bean.code == 5002||bean.code == 5003){ + } else if (bean.code == 5000 || bean.code == 5001 || bean.code == 5002 || + bean.code == 5003) { pushLoginPage(); return; } @@ -73,7 +91,7 @@ class SplashLogic extends GetxController { if (bean.code == 500) { await Future.delayed(Duration(seconds: 5)); onInit(); - }else { + } else { pushLoginPage(); } diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index 18d1ef6..0ac4ebc 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -9,6 +9,7 @@ import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import '../../components/my_app_bar.dart'; import '../../router/app_routers.dart'; import '../../util/util.dart'; +import '../select_circle/logic.dart'; import 'logic.dart'; class UserinfoPage extends StatefulWidget { @@ -413,6 +414,11 @@ class MyTabbedScreenState extends State ), logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): GestureDetector( onTap: () { + if(!logic.isShowAlbum){ + List numbers = []; + var data = Get.toNamed(AppRoutes.Call_out, arguments: {'numbers': numbers}); + return ; + } if (controller.isMe) { controller.isEdit = !controller.isEdit; controller.update(); @@ -421,7 +427,7 @@ class MyTabbedScreenState extends State } }, child: Visibility( - visible: logic.isShowAlbum, + // visible: logic.isShowAlbum, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(17), @@ -439,13 +445,14 @@ class MyTabbedScreenState extends State horizontal: 12.sp, ), child: Text( + logic.isShowAlbum? controller.isMe ? controller.isEdit ? "完成" : "管理" : controller.isUrgeStatus ? "已催更" - : "催更", + : "催更":"发布喊话", style: const TextStyle( color: Colors.white, fontSize: 12, @@ -477,7 +484,7 @@ class MyTabbedScreenState extends State style: const TextStyle(color: Colors.white30), ), ), - controller.state.imaglist.isEmpty && !controller.isEdit + controller.state.imaglist.isEmpty && !controller.isMe ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.start, @@ -510,19 +517,21 @@ class MyTabbedScreenState extends State crossAxisCount: 3, ), itemCount: controller.isMe - ? controller.isEdit - ? controller.state.imaglist.length < 15 - ? controller.state.imaglist.length + 1 - : controller.state.imaglist.length - : controller.state.imaglist.length - : controller.state.imaglist.length, + // ? controller.isEdit + // ? controller.state.imaglist.length < 15 + // ? controller.state.imaglist.length + ? controller.state.imaglist.length+1 + : controller.state.imaglist.length , itemBuilder: (BuildContext context, int index) { - if (controller.isMe && - controller.isEdit && - controller.state.imaglist.length < 15) { + print("123123123123"); + if (controller.isMe ) { if (index == 0) { return GestureDetector( onTap: () { + if(controller.state.imaglist.length >= 15){ + showOKToast("最大只可上传15张图片哦~"); + return ; + } controller.getImageFile(); }, child: Container( diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index 22686a8..f07a137 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -255,7 +255,7 @@ class DioManager { // String? errorMsg = isNetworkConnected // ? e.requestOptions.extra["errorMsg"] // : "网络连接断开,请检查网络设置"; - return {'code': 500, 'msg': '加载中'}; + return {'code': 500, 'msg': '加载中${e.message}'}; } catch (e) { // 其他一些意外的报错 return {'code': 500, 'msg': '加载中...'}; diff --git a/circle_app/lib/util/util.dart b/circle_app/lib/util/util.dart index 3db5075..93d6920 100644 --- a/circle_app/lib/util/util.dart +++ b/circle_app/lib/util/util.dart @@ -12,6 +12,7 @@ import 'package:oktoast/oktoast.dart'; import 'package:path_provider/path_provider.dart'; import 'package:video_compress/video_compress.dart'; +import '../app/select_circle/logic.dart'; import 'SharedPreferencesHelper.dart'; class Util {} @@ -177,60 +178,81 @@ String getAgeCOntent(int gender, int age, int role, int orientation) { return "${getGenderContent(gender)}·${age}·${getRoleContent(role)}·${getOrientationContent(orientation)}"; } +late ConfigBean configBean; +List numbers = []; + +List genderList = []; + +List orientationList = []; + +List roleList = []; + String getGenderContent(int number) { - switch (number) { - case 1: - return "男"; - case 2: - return "女"; - case 3: - return "MTF"; - case 4: - return "FTM"; - case 5: - return "CD"; - case 6: - return "酷儿"; - default: - return ""; + if(genderList.length!=0){ + return genderList[number-1]; + }else { + switch (number) { + case 1: + return "男"; + case 2: + return "女"; + case 3: + return "MTF"; + case 4: + return "FTM"; + case 5: + return "CD"; + case 6: + return "酷儿"; + default: + return ""; + } } } String getOrientationContent(int number) { - switch (number) { - case 1: - return "异性恋"; - case 2: - return "同性恋"; - case 3: - return "双性恋"; - case 4: - return "泛性恋"; - case 5: - return "无性恋"; - case 6: - return "智性恋"; - case 7: - return "性单恋"; - default: - return ""; + if(orientationList.length!=0){ + return orientationList[number-1]; + }else { + switch (number) { + case 1: + return "异性恋"; + case 2: + return "同性恋"; + case 3: + return "双性恋"; + case 4: + return "泛性恋"; + case 5: + return "无性恋"; + case 6: + return "智性恋"; + case 7: + return "性单恋"; + default: + return ""; + } } } String getRoleContent(int number) { - switch (number) { - case 1: - return "Sado"; - case 2: - return "Maso"; - case 3: - return "Dom"; - case 4: - return "Sub"; - case 5: - return "Switch"; - default: - return ""; + if(roleList.length!=0){ + return roleList[number-1]; + }else { + switch (number) { + case 1: + return "Sado"; + case 2: + return "Maso"; + case 3: + return "Dom"; + case 4: + return "Sub"; + case 5: + return "Switch"; + default: + return ""; + } } } From 8f6e0c5aaba84d9ec093c5872c773ed6b7a07781 Mon Sep 17 00:00:00 2001 From: yangyuhao <291808500@qq.com> Date: Thu, 7 Sep 2023 16:19:59 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=20=E5=8F=91=E9=80=81=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=92=8C=E8=A7=86=E9=A2=91=E6=8B=8D=E6=91=84=20=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=90=8C=E6=84=8F=E9=9A=90=E7=A7=81=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +-- .../tim_uikit_text_field_layout/narrow.dart | 31 +++++++++++------- .../lib/app/dialog/YesAgreementDialog.dart | 32 ++++++++++++++----- circle_app/lib/app/splash/logic.dart | 16 +++++++--- circle_app/lib/app/webview/view.dart | 7 +--- circle_app/lib/network/api.dart | 13 ++++++-- 6 files changed, 68 insertions(+), 35 deletions(-) diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index bbb3fee..eed052d 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -65,8 +65,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 10 - versionName "1.0.9" + versionCode 11 + versionName "1.1.0" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", 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 89fa94b..7dc7e82 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,4 +1,5 @@ import 'dart:async'; +import 'dart:ffi'; import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; @@ -804,16 +805,14 @@ class _TIMTextFieldLayoutNarrowState ); } - Future checkVipStatus() async { - if (!isVip) { - var data = await DioManager.instance.get(url: Api.getUserMine); - var bean = BaseResponse.fromJson( - data, (data) => MineResponseBean.fromJson(data)); - if (bean.isSuccess()) { - User userInfoBean = bean.data.user!; - isVip = userInfoBean.vip > 0; - } + Future checkVipStatus(int plate) async { + var data = + await DioManager.instance.get(url: Api.getIsVips + plate.toString()); + + if (data['code'] == 200) { + isVip = !data['data']; } + if (!isVip) { showOKToast('开通会员之后才能发送图片'); Get.bottomSheet( @@ -833,7 +832,8 @@ class _TIMTextFieldLayoutNarrowState VideoPlayerController? videoPlayerController; Future getVideoFile(ImageSource imageSource) async { - bool isOK = await checkVipStatus(); + bool isOK = await checkVipStatus(imageSource == ImageSource.camera ? 2 : 4); + if (!isOK) { return; } @@ -874,6 +874,11 @@ class _TIMTextFieldLayoutNarrowState duration: durationInSeconds.toInt(), inputElement: context, ); + if (imageSource == ImageSource.camera) { + DioManager.instance.get(url: Api.getAddTrialCount + "2"); + } else { + DioManager.instance.get(url: Api.getAddTrialCount + "4"); + } } catch (e) { print(e); // setState(() { @@ -906,7 +911,7 @@ class _TIMTextFieldLayoutNarrowState } Future getImageFile() async { - bool isOK = await checkVipStatus(); + bool isOK = await checkVipStatus(3); if (!isOK) { return; } @@ -919,6 +924,7 @@ class _TIMTextFieldLayoutNarrowState convID: widget.conversationID, convType: widget.conversationType, inputElement: context); + var data = await DioManager.instance.get(url: Api.getAddTrialCount + "3"); } catch (e) { print(e); // setState(() { @@ -928,7 +934,7 @@ class _TIMTextFieldLayoutNarrowState } Future getTakeImageFile() async { - bool isOK = await checkVipStatus(); + bool isOK = await checkVipStatus(1); if (!isOK) { return; } @@ -942,6 +948,7 @@ class _TIMTextFieldLayoutNarrowState convID: widget.conversationID, convType: widget.conversationType, inputElement: context); + var data = await DioManager.instance.get(url: Api.getAddTrialCount + "1"); } catch (e) {} } diff --git a/circle_app/lib/app/dialog/YesAgreementDialog.dart b/circle_app/lib/app/dialog/YesAgreementDialog.dart index e4005aa..0e5dcc7 100644 --- a/circle_app/lib/app/dialog/YesAgreementDialog.dart +++ b/circle_app/lib/app/dialog/YesAgreementDialog.dart @@ -1,10 +1,13 @@ +import 'dart:ffi'; import 'dart:io'; +import 'package:connectivity/connectivity.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:tencent_chat_push_for_china/tencent_chat_push_for_china.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; @@ -36,7 +39,6 @@ class _CustomDialogState extends State { Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { - print(getAgreemement()); return false; }, @@ -126,10 +128,23 @@ class _CustomDialogState extends State { GestureDetector( onTap: () async { // 点击操作 - var sp = await SharedPreferencesHelper.getInstance(); - sp.setBool(SharedPreferencesHelper.AGREEMENT, true); + SmartDialog.showLoading(); + var connectivityResult = + await Connectivity().checkConnectivity(); + + if (connectivityResult == ConnectivityResult.none) { + showOKToast("请检查网络连接是否正常"); + print('没网'); + return; + } + + try { + var sp = await SharedPreferencesHelper.getInstance(); + sp.setBool(SharedPreferencesHelper.AGREEMENT, true); + } catch (e) {} + await uploadBuzIDAndToken(); + SmartDialog.dismiss(); pushLoginPage(); - uploadBuzIDAndToken(); }, child: Container( width: 240.sp, @@ -159,8 +174,8 @@ class _CustomDialogState extends State { TextButton( onPressed: () { // 点击不同意按钮的操作 - // exit(1); - SystemNavigator.pop(); + // exit(1); + SystemNavigator.pop(); }, child: Text( "不同意并退出应用", @@ -179,8 +194,7 @@ class _CustomDialogState extends State { ); } - - void uploadBuzIDAndToken() async { + Future uploadBuzIDAndToken() async { if (Platform.isAndroid) { initWxApi(); } @@ -199,5 +213,7 @@ class _CustomDialogState extends State { print("token=" + res.code.toString()); } + + return true; } } diff --git a/circle_app/lib/app/splash/logic.dart b/circle_app/lib/app/splash/logic.dart index 3a5e162..5c2ce7f 100644 --- a/circle_app/lib/app/splash/logic.dart +++ b/circle_app/lib/app/splash/logic.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:connectivity/connectivity.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; @@ -26,13 +27,18 @@ class SplashLogic extends GetxController { super.onReady(); } + @override void onInit() async { super.onInit(); // await Future.delayed(Duration(seconds: 30)); + // 启动网络连接监听 + + + var data1 = - await DioManager.instance.get(url: Api.getCircleList, params: {}); + await DioManager.instance.get(url: Api.getCircleList, params: {}); var bean1 = BaseResponse.fromJson( data1, (data1) => ConfigBean.fromJson(data1)); if (bean1.code == 200) { @@ -50,7 +56,6 @@ class SplashLogic extends GetxController { }); } - if ((await getAuthorization()).isEmpty) { if (Platform.isIOS) { pushLoginPage(); @@ -64,7 +69,7 @@ class SplashLogic extends GetxController { } } else { var data = - await DioManager.instance.put(url: Api.refreshToken, params: {}); + await DioManager.instance.put(url: Api.refreshToken, params: {}); var bean = BaseResponse.fromJson( data, (data) => LoginData.fromJson(data)); if (bean.code == 200) { @@ -82,7 +87,9 @@ class SplashLogic extends GetxController { }); return; - } else if (bean.code == 5000 || bean.code == 5001 || bean.code == 5002 || + } else if (bean.code == 5000 || + bean.code == 5001 || + bean.code == 5002 || bean.code == 5003) { pushLoginPage(); return; @@ -99,7 +106,6 @@ class SplashLogic extends GetxController { } } - void showReportDialog() { FlutterNativeSplash.remove(); showDialog( diff --git a/circle_app/lib/app/webview/view.dart b/circle_app/lib/app/webview/view.dart index 0d41b51..a7170b3 100644 --- a/circle_app/lib/app/webview/view.dart +++ b/circle_app/lib/app/webview/view.dart @@ -45,12 +45,7 @@ class _WebViewContainerState extends State { }, onWebResourceError: (WebResourceError error) {}, - onNavigationRequest: (NavigationRequest request) { - if (request.url.startsWith('')) { - return NavigationDecision.prevent; - } - return NavigationDecision.navigate; - }, + ), ) ..loadRequest(Uri.parse(url)); diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index cbeac92..dcc9db6 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -1,9 +1,9 @@ class Api { - static const baseUrl = 'https://leyuan666.com/zuul-service/'; +static const baseUrl = 'https://leyuan666.com/zuul-service/'; - // static const baseUrl = 'http://192.168.3.55:2000/' ; +// static const baseUrl = 'http://192.168.3.55:2000/' ; // 获取验证码 @@ -80,6 +80,15 @@ class Api { static const getUserMine = 'user-service/my/main'; + //发消息是否需要vip弹窗 + static const getIsVips = 'mall-service/vips/show/'; + + + + //发视频图片消息增加计数 + static const getAddTrialCount = 'mall-service/vips/trialCount/'; + + //个人信息 static const getUserInfo = 'user-service/my/home'; From c799e6702e906967747542ee083e98918d016e64 Mon Sep 17 00:00:00 2001 From: yangyuhao <291808500@qq.com> Date: Thu, 7 Sep 2023 17:17:59 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E5=96=8A=E8=AF=9D=E6=97=A0=E6=B3=95=E9=80=89=E6=8B=A9=E5=9C=88?= =?UTF-8?q?=E5=AD=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/lib/app/call_out/logic.dart | 5 ++++- circle_app/lib/app/select_circle/logic.dart | 19 ++++++++++------ circle_app/lib/app/userinfo/view.dart | 24 ++++++++++++--------- circle_app/lib/network/dio_manager.dart | 2 +- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/circle_app/lib/app/call_out/logic.dart b/circle_app/lib/app/call_out/logic.dart index 30efb70..640b152 100644 --- a/circle_app/lib/app/call_out/logic.dart +++ b/circle_app/lib/app/call_out/logic.dart @@ -54,7 +54,10 @@ class Call_outLogic extends GetxController { if (myConfigData != null) { // print(myConfigData.name); numbers.addAll(myConfigData); - circleName = numbers[0].name; + if(numbers.length>0){ + circleName = numbers[0].name; + } + SharedPreferencesHelper.getInstance().then((sharedPreferences) { vip = sharedPreferences.getInt(SharedPreferencesHelper.VIP); print(vip); diff --git a/circle_app/lib/app/select_circle/logic.dart b/circle_app/lib/app/select_circle/logic.dart index 74d5996..e520eaf 100644 --- a/circle_app/lib/app/select_circle/logic.dart +++ b/circle_app/lib/app/select_circle/logic.dart @@ -17,13 +17,18 @@ class Select_circleLogic extends GetxController { for (var entry in entries.asMap().entries) { MyConfigData bean = MyConfigData(entry.value.key, entry.value.value, false); - selectCircle.forEach((element) { - if(entry.value.key==element.id){ - bean.isSelect = true; - selectIndex = entry.key; - } + if(selectCircle.isEmpty){ arrList.add(bean); - }); + }else{ + selectCircle.forEach((element) { + if(entry.value.key==element.id){ + bean.isSelect = true; + selectIndex = entry.key; + } + arrList.add(bean); + }); + } + } }else{ interestMap.forEach((key, value) { @@ -36,7 +41,7 @@ class Select_circleLogic extends GetxController { arrList.add(bean); }); } - +print(arrList.length.toString()); update(); } diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index 0ac4ebc..d064c81 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -375,6 +375,17 @@ class MyTabbedScreenState extends State } Widget titleTab(UserinfoLogic controller) { + String buttonText = ""; + + if (controller.isMe) { + if (logic.isShowAlbum) { + buttonText = controller.isEdit ? "完成" : "管理"; + } else { + buttonText = "发布喊话"; + } + } else { + buttonText = controller.isUrgeStatus ? "已催更" : "催更"; + } return Container( alignment: Alignment.centerLeft, padding: EdgeInsets.symmetric(horizontal: 10.sp), @@ -414,7 +425,7 @@ class MyTabbedScreenState extends State ), logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): GestureDetector( onTap: () { - if(!logic.isShowAlbum){ + if(!logic.isShowAlbum&&controller.isMe){ List numbers = []; var data = Get.toNamed(AppRoutes.Call_out, arguments: {'numbers': numbers}); return ; @@ -445,14 +456,7 @@ class MyTabbedScreenState extends State horizontal: 12.sp, ), child: Text( - logic.isShowAlbum? - controller.isMe - ? controller.isEdit - ? "完成" - : "管理" - : controller.isUrgeStatus - ? "已催更" - : "催更":"发布喊话", + buttonText, style: const TextStyle( color: Colors.white, fontSize: 12, @@ -523,7 +527,7 @@ class MyTabbedScreenState extends State ? controller.state.imaglist.length+1 : controller.state.imaglist.length , itemBuilder: (BuildContext context, int index) { - print("123123123123"); + // print("123123123123"); if (controller.isMe ) { if (index == 0) { return GestureDetector( diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index f07a137..22686a8 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -255,7 +255,7 @@ class DioManager { // String? errorMsg = isNetworkConnected // ? e.requestOptions.extra["errorMsg"] // : "网络连接断开,请检查网络设置"; - return {'code': 500, 'msg': '加载中${e.message}'}; + return {'code': 500, 'msg': '加载中'}; } catch (e) { // 其他一些意外的报错 return {'code': 500, 'msg': '加载中...'}; From c53c61155ac643ed655a70e3eeb1d939c152813c Mon Sep 17 00:00:00 2001 From: yangyuhao <291808500@qq.com> Date: Fri, 8 Sep 2023 18:13:30 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=B0=8F=E7=B1=B3=E5=92=8C=E7=BA=A2?= =?UTF-8?q?=E7=B1=B3=E4=B8=8D=E8=AF=B7=E6=B1=82=E6=8E=A8=E9=80=81token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +- .../android/app/src/main/AndroidManifest.xml | 3 ++ .../tim_uikit_text_field_layout/narrow.dart | 30 +++++++++++-- .../lib/app/dialog/YesAgreementDialog.dart | 42 ++++++++++++------- circle_app/lib/main.dart | 23 ++++++++++ 5 files changed, 82 insertions(+), 20 deletions(-) diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index eed052d..d716e75 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -65,8 +65,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 11 - versionName "1.1.0" + versionCode 13 + versionName "1.1.2" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/android/app/src/main/AndroidManifest.xml b/circle_app/android/app/src/main/AndroidManifest.xml index f7243ff..838bce2 100644 --- a/circle_app/android/app/src/main/AndroidManifest.xml +++ b/circle_app/android/app/src/main/AndroidManifest.xml @@ -24,6 +24,9 @@ android:name="android.permission.READ_MEDIA_IMAGES"/> + + + 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 7dc7e82..428c477 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 @@ -157,6 +157,7 @@ class TIMTextFieldLayoutNarrow extends StatefulWidget { class _TIMTextFieldLayoutNarrowState extends TIMUIKitState { + final TUISettingModel settingModel = serviceLocator(); final ImagePicker _picker = ImagePicker(); @@ -838,12 +839,14 @@ class _TIMTextFieldLayoutNarrowState return; } + await requestStoragePermission(); + XFile? pickedFile; String? thumbnailPath; // 声明 thumbnailPath 变量 try { pickedFile = await _picker.pickVideo( - source: imageSource, + source: imageSource, maxDuration: const Duration(seconds: 30) ); if (pickedFile == null) { return; @@ -938,20 +941,39 @@ class _TIMTextFieldLayoutNarrowState if (!isOK) { return; } - + await requestStoragePermission(); try { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.camera, ); + if(null==pickedFile){ + return; + } widget.model.sendImageMessage( - imagePath: pickedFile!.path, + imagePath: pickedFile.path, convID: widget.conversationID, convType: widget.conversationType, inputElement: context); - var data = await DioManager.instance.get(url: Api.getAddTrialCount + "1"); + DioManager.instance.get(url: Api.getAddTrialCount + "1"); } catch (e) {} } + //实在找不到问题 先加个权限试试 + Future requestStoragePermission() async { + final status = await Permission.storage.request(); + if (status.isGranted) { + // 权限已授予,可以执行存储操作 + } else if (status.isDenied) { + showOKToast("请打开存储权限。将为你带来更好的服务"); + // 权限被拒绝,您可以显示一条消息来解释为什么需要权限 + } else if (status.isPermanentlyDenied) { + showOKToast("请打开存储权限。将为你带来更优的服务"); + // 权限被永久拒绝,用户无法在应用程序内授予权限 + // 您可以引导用户进入应用程序设置以手动启用权限 + } + } + + _handleCameraAndMic() async { // // 请求权限 // Map permissions = await PermissionHandler().requestPermissions( diff --git a/circle_app/lib/app/dialog/YesAgreementDialog.dart b/circle_app/lib/app/dialog/YesAgreementDialog.dart index 0e5dcc7..76fabf4 100644 --- a/circle_app/lib/app/dialog/YesAgreementDialog.dart +++ b/circle_app/lib/app/dialog/YesAgreementDialog.dart @@ -2,6 +2,7 @@ import 'dart:ffi'; import 'dart:io'; import 'package:connectivity/connectivity.dart'; +import 'package:device_info/device_info.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -198,21 +199,34 @@ class _CustomDialogState extends State { if (Platform.isAndroid) { initWxApi(); } - final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance(); - await ChannelPush.init((msg) {}); - - int? businessID = await TimUiKitPushPlugin.getBuzId(PushConfig.appInfo); - - String token = await ChannelPush.getDeviceToken(); - ChannelPush.uploadToken(); - - print("token=" + token); - if (token != "") { - V2TimCallback res = await coreInstance.setOfflinePushConfig( - token: token, businessID: businessID); - - print("token=" + res.code.toString()); + AndroidDeviceInfo androidInfo; + try { + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + androidInfo = await deviceInfo.androidInfo; + } catch (e) { + // 处理异常 + return true; } + if (androidInfo.brand == 'Xiaomi'||androidInfo.brand == 'Redmi') { + + }else{ + final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance(); + await ChannelPush.init((msg) {}); + + int? businessID = await TimUiKitPushPlugin.getBuzId(PushConfig.appInfo); + + String token = await ChannelPush.getDeviceToken(); + ChannelPush.uploadToken(); + + print("token=" + token); + if (token != "") { + V2TimCallback res = await coreInstance.setOfflinePushConfig( + token: token, businessID: businessID); + + print("token=" + res.code.toString()); + } + } + return true; } diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index 4232715..acef58f 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -13,10 +13,12 @@ import 'package:circle_app/util/SharedPreferencesHelper.dart'; import 'package:circle_app/util/device.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:oktoast/oktoast.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; import 'package:tencent_cloud_chat_uikit/data_services/core/core_services.dart'; @@ -36,8 +38,29 @@ void main() { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); runApp(const MyApp()); + getLostData(); } +Future getLostData() async { + final ImagePicker picker = ImagePicker(); + final LostDataResponse response = await picker.retrieveLostData(); + if (response.isEmpty) { + return; + } + final List? files = response.files; + if (files != null) { + _handleLostFiles(files); + } else { + _handleError(response.exception); + } +} +void _handleLostFiles(List file) {} +Future _handleError(dynamic error) async { + // 处理错误,例如记录错误或显示错误消息 + print('Error occurred: $error'); + // 在界面上显示错误消息 + showToast('内存异常,请重新上传'); +} int IM_SDK_APP_ID = 1400799631; String IOS_APP_ID = ""; From c4780f7b2320991150c0c929dcc092cde80093ca Mon Sep 17 00:00:00 2001 From: yangyuhao <291808500@qq.com> Date: Sat, 9 Sep 2023 15:33:30 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=8E=A8=E9=80=81=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +- circle_app/android/build.gradle | 2 +- .../lib/app/dialog/YesAgreementDialog.dart | 63 ++++++++----------- circle_app/lib/app/login/login/logic.dart | 2 +- circle_app/lib/app/userinfo/view.dart | 4 +- circle_app/lib/common/values/pushconfig.dart | 34 +++++++--- 6 files changed, 60 insertions(+), 49 deletions(-) diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index d716e75..d4b80e4 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -65,8 +65,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 13 - versionName "1.1.2" + versionCode 14 + versionName "1.1.4" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/android/build.gradle b/circle_app/android/build.gradle index 2870ca5..ab73875 100644 --- a/circle_app/android/build.gradle +++ b/circle_app/android/build.gradle @@ -12,7 +12,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' + classpath 'com.android.tools.build:gradle:7.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.huawei.agconnect:agcp:1.6.0.300' } diff --git a/circle_app/lib/app/dialog/YesAgreementDialog.dart b/circle_app/lib/app/dialog/YesAgreementDialog.dart index 76fabf4..8c8e8df 100644 --- a/circle_app/lib/app/dialog/YesAgreementDialog.dart +++ b/circle_app/lib/app/dialog/YesAgreementDialog.dart @@ -13,6 +13,7 @@ import 'package:tencent_chat_push_for_china/tencent_chat_push_for_china.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import '../../common/values/pushconfig.dart'; +import '../../main.dart'; import '../../util/PaymentUtils.dart'; import '../../util/SharedPreferencesHelper.dart'; import '../../util/device.dart'; @@ -143,7 +144,7 @@ class _CustomDialogState extends State { var sp = await SharedPreferencesHelper.getInstance(); sp.setBool(SharedPreferencesHelper.AGREEMENT, true); } catch (e) {} - await uploadBuzIDAndToken(); + uploadBuzIDAndToken(); SmartDialog.dismiss(); pushLoginPage(); }, @@ -195,39 +196,29 @@ class _CustomDialogState extends State { ); } - Future uploadBuzIDAndToken() async { - if (Platform.isAndroid) { - initWxApi(); - } - AndroidDeviceInfo androidInfo; - try { - DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); - androidInfo = await deviceInfo.androidInfo; - } catch (e) { - // 处理异常 - return true; - } - if (androidInfo.brand == 'Xiaomi'||androidInfo.brand == 'Redmi') { - - }else{ - final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance(); - await ChannelPush.init((msg) {}); - - int? businessID = await TimUiKitPushPlugin.getBuzId(PushConfig.appInfo); - - String token = await ChannelPush.getDeviceToken(); - ChannelPush.uploadToken(); - - print("token=" + token); - if (token != "") { - V2TimCallback res = await coreInstance.setOfflinePushConfig( - token: token, businessID: businessID); - - print("token=" + res.code.toString()); - } - } - - - return true; - } + // Future uploadBuzIDAndToken() async { + // if (Platform.isAndroid) { + // initWxApi(); + // } + // + // + // final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance(); + // await ChannelPush.init((msg) {}); + // + // int? businessID = await TimUiKitPushPlugin.getBuzId(PushConfig.appInfo); + // + // String token = await ChannelPush.getDeviceToken(); + // ChannelPush.uploadToken(); + // + // print("token=" + token); + // if (token != "") { + // V2TimCallback res = await coreInstance.setOfflinePushConfig( + // token: token, businessID: businessID); + // + // print("token=" + res.code.toString()); + // } + // + // + // return true; + // } } diff --git a/circle_app/lib/app/login/login/logic.dart b/circle_app/lib/app/login/login/logic.dart index 03eaec7..fc15aec 100644 --- a/circle_app/lib/app/login/login/logic.dart +++ b/circle_app/lib/app/login/login/logic.dart @@ -67,7 +67,7 @@ class LoginLogic extends GetxController { if (bean.code == 200) { showOKToast('发送成功!'); if (kDebugMode) { - print("验证码:${bean.data!.code}"); + //print("验证码:${bean.data!.code}"); // codeEditingController.text = bean.data!.code.toString(); // update(); } diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index d064c81..91a4f34 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -281,7 +281,7 @@ class MyTabbedScreenState extends State shape: BoxShape.circle, color: logic.isOnline ? const Color(0xFF00FFF4) - : const Color(0xFF787575), + : const Color(0x00000000), ), ), logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): Text( @@ -290,7 +290,7 @@ class MyTabbedScreenState extends State fontSize: 12.sp, color: logic.isOnline ? const Color(0xFF00FFF4) - : const Color(0xFF787575), + : const Color(0x00000000), ), ), ], diff --git a/circle_app/lib/common/values/pushconfig.dart b/circle_app/lib/common/values/pushconfig.dart index 890c037..319ac7e 100644 --- a/circle_app/lib/common/values/pushconfig.dart +++ b/circle_app/lib/common/values/pushconfig.dart @@ -1,4 +1,5 @@ +import 'package:device_info/device_info.dart'; import 'package:tencent_chat_push_for_china/model/appInfo.dart'; import 'package:tencent_chat_push_for_china/tencent_chat_push_for_china.dart'; @@ -12,6 +13,7 @@ class PushConfig{ // Business ID for XiaoMi static const XMPushBuzID = 30672; + static const String XMChannelID = "111363"; // APP Info of XiaoMi static const String XMPushAPPID = "2882303761520264048"; @@ -72,14 +74,32 @@ class ChannelPush{ appInfo: PushConfig.appInfo, ); print("token=初始化"+isInit.toString()); - + AndroidDeviceInfo androidInfo; + try { + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + androidInfo = await deviceInfo.androidInfo; + } catch (e) { + // 处理异常 + return true; + } + if (androidInfo.brand == 'Xiaomi'||androidInfo.brand == 'Redmi') { + cPush.createNotificationChannel( + channelId: PushConfig.XMChannelID, + channelName: "消息推送", + channelDescription: + "The notification for chat message from Tencent Cloud IM" + ); + }else{ + cPush.createNotificationChannel( + channelId: PushConfig.OPPOChannelID, + channelName: "消息推送", + channelDescription: + "The notification for chat message from Tencent Cloud IM" + ); + } // create new notification channel - cPush.createNotificationChannel( - channelId: PushConfig.OPPOChannelID, - channelName: "消息推送", - channelDescription: - "The notification for chat message from Tencent Cloud IM" - ); + + // require the permission for notification cPush.requireNotificationPermission();