From 7b7f01ae93b3d487ac06cd6e099419160fe42b7d Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Tue, 14 Nov 2023 09:09:04 +0800 Subject: [PATCH] =?UTF-8?q?1.3.2=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +- .../assets/images/circle/circile_all_icon.png | Bin 15852 -> 12285 bytes .../ios/Runner.xcodeproj/project.pbxproj | 12 +- circle_app/ios/Runner/Runner.entitlements | 5 +- circle_app/lib/app/circle/logic.dart | 3 + .../lib/app/circle/widgets/like_view.dart | 1011 +++++++++-------- .../lib/app/dialog/UnlockCallDialog.dart | 4 +- circle_app/lib/app/dialog/UpdateDialog.dart | 4 +- circle_app/lib/app/home/logic.dart | 42 +- circle_app/lib/app/home/view.dart | 49 +- circle_app/lib/app/like/logic.dart | 11 + circle_app/lib/app/like/view.dart | 354 +++++- .../tim_uikit_conversation.dart | 156 +-- circle_app/lib/app/msg/logic.dart | 5 +- circle_app/lib/app/msg/view.dart | 29 +- circle_app/lib/app/my_circle/view.dart | 137 +-- circle_app/lib/app/userinfo/view.dart | 4 +- circle_app/lib/main.dart | 4 + circle_app/lib/network/api.dart | 3 +- circle_app/lib/util/eventBus.dart | 5 + circle_app/lib/util/util.dart | 18 + circle_app/lib/view/notice.dart | 2 +- circle_app/pubspec.lock | 8 + circle_app/pubspec.yaml | 2 +- 24 files changed, 1113 insertions(+), 759 deletions(-) diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index 3877ade..88eafad 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -71,8 +71,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 24 - versionName "1.3.2" + versionCode 22 + versionName "1.3.0" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/assets/images/circle/circile_all_icon.png b/circle_app/assets/images/circle/circile_all_icon.png index 501fdee472b0e0b3c43cd7421f3d83012684ac0a..68ef933d59bfff1afb7dcf2fabe7ac9aeb3e0eef 100644 GIT binary patch literal 12285 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 - + + aps-environment + development + diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index f0b45f7..812858b 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -493,6 +493,7 @@ class Circle { String ios_item; double amount; bool is_limit; + bool is_top; double oldAmount; String lastCalloutTime; bool isJoin; @@ -510,6 +511,7 @@ class Circle { required this.intro, required this.amount, required this.oldAmount, + required this.is_top, required this.lastCalloutTime, required this.isJoin, required this.isLike, @@ -529,6 +531,7 @@ class Circle { return Circle( id: json['id'], + is_top: json['is_top'] ?? false, is_limit: json['is_limit'] ?? false, image: json['image'] ?? '', ios_item: json['ios_item'] ?? '', diff --git a/circle_app/lib/app/circle/widgets/like_view.dart b/circle_app/lib/app/circle/widgets/like_view.dart index 03f79f9..f3f53f6 100644 --- a/circle_app/lib/app/circle/widgets/like_view.dart +++ b/circle_app/lib/app/circle/widgets/like_view.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/circle/logic.dart'; @@ -16,20 +17,20 @@ import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; class LikeView extends StatefulWidget { - @override _LikeViewState createState() => _LikeViewState(); - } -class _LikeViewState extends State with AutomaticKeepAliveClientMixin { +class _LikeViewState extends State + with AutomaticKeepAliveClientMixin { @override bool get wantKeepAlive => true; final ScrollController scrollController = ScrollController(); - + final RefreshController refreshController = RefreshController(); // ListLogic? listsLg; @@ -47,52 +48,44 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin void dispose() { // TODO: implement dispose - if(null!=scroToTop){ + if (null != scroToTop) { EventBusManager.cancelSubscription(scroToTop!); - } + EventBusManager.cancelSubscription(likeRefreshSub!); + scrollController.dispose(); super.dispose(); - - } - StreamSubscription? callRefreshCicle =null; - StreamSubscription? scroToTop =null; + StreamSubscription? callRefreshCicle = null; + StreamSubscription? scroToTop = null; + StreamSubscription? likeRefreshSub = null; @override void initState() { // TODO: implement initState super.initState(); - scrollController.addListener(() { - try { - if (scrollController.position.pixels == - scrollController.position.maxScrollExtent) { - loadMore(); - } - } catch (_) {} - }); + loadLikeListData(); - - - scroToTop = EventBusManager.on().listen((event) { + scroToTop = EventBusManager.on().listen((event) { // if (widget.logic.state.index == widget.index) { - scrollController.animateTo( - 0.0, - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - ); - // } - + var str = '{\"content\":{\"calloutId\":10453,\"interestId\":5},\"event\":3}'; + var params = jsonDecode(str); + scrollController.animateTo( + 0.0, + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + }); + likeRefreshSub = EventBusManager.on().listen((event) { + // if (widget.logic.state.index == widget.index) { + refreshData(); + // } }); - // widget.back(widget.createState()); } - - - loadLikeListData() async { if (likeMore) { var data = await DioManager.instance.get( @@ -101,8 +94,9 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin if (data["code"] == 200) { List dataList = data["data"]["lists"] ?? []; if (callOutPage == 1) { - lists.clear(); + lists.clear(); } + if (dataList.isNotEmpty) { likeMore = true; for (var element in dataList) { @@ -113,7 +107,15 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin likeMore = dataList.length == 20; if (!likeMore) { loadRecomdistData(); + } else { + if (callOutPage == 2 || callOutPage == 1) { + refreshController.refreshCompleted(); + refreshController.loadComplete(); + } else { + refreshController.loadComplete(); + } } + if (mounted) { setState(() {}); } @@ -144,6 +146,16 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin recomandPage++; } recomandMore = dataList.length == 20; + + if (recomandPage == 2 || recomandPage == 1) { + refreshController.refreshCompleted(); + } else { + if (recomandMore) { + refreshController.loadComplete(); + } else { + refreshController.loadNoData(); + } + } if (mounted) { setState(() {}); } @@ -159,7 +171,10 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin void refreshData() { callOutPage = 1; + recomandPage = 1; likeMore = true; + recomandMore = true; + refreshController.resetNoData(); loadLikeListData(); } @@ -188,15 +203,11 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin // if (bean.user!.id == userId) { // Get.toNamed(AppRoutes.UserInfoActivity); // } else { - Get.toNamed(AppRoutes.UserInfoActivity, - arguments: bean.user!.id!.toString()); + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: bean.user!.id!.toString()); // } // }); - - - - // if (bean.isQueen) { // showJoinCiclePiker(cicleId); // } else { @@ -209,7 +220,6 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin } void pushMsgPage(var 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){ // widget.bean.is_limit = false; @@ -237,16 +247,22 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin // 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!); + 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(); + 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)??""; + 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(); } @@ -258,95 +274,103 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin List widgets = []; int i = 0; // print(urlList); - if(null!=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( width: Get.width, - padding: EdgeInsets.only(left: 10.sp,right: 10.sp), + padding: EdgeInsets.only(left: 10.sp, right: 10.sp), // margin: // EdgeInsets.only(left: widget.index > 0 ? 4.sp : 0, right: 4.sp), - child: - RefreshIndicator( - onRefresh: () async { - refreshData(); - // refreshCircleData(); - }, - child: - ListView.builder( - physics: const AlwaysScrollableScrollPhysics(), - addAutomaticKeepAlives:false, - addRepaintBoundaries:false, - scrollDirection: Axis.vertical, - controller: scrollController, - itemCount: likeMore ? lists.length + 1 : lists.length + 1 + recomanddlists.length, - itemBuilder: (context, index) { - if (lists.length > index) { - var list = lists[index]; - if (list.isQueen!) { - return vipDynamicItem(list); - } else { - return normalDynamicItem(list); - } - } else if (!likeMore && lists.length == index) { - return tipItem(); - } else if (index - lists.length < recomanddlists.length) { - var list = recomanddlists[index - lists.length]; - if (list.isQueen!) { - return vipDynamicItem(list); - } else { - return normalDynamicItem(list); - } + child: SmartRefresher( + controller: refreshController, + onRefresh: refreshData, + onLoading: loadMore, + enablePullUp: recomandMore, + child: ListView.builder( + physics: const AlwaysScrollableScrollPhysics(), + addAutomaticKeepAlives: false, + addRepaintBoundaries: false, + scrollDirection: Axis.vertical, + controller: scrollController, + itemCount: likeMore + ? lists.length + : lists.length + recomanddlists.length + 1, + itemBuilder: (context, index) { + if (lists.length - 1 >= index) { + var list = lists[index]; + if (list.isQueen!) { + return vipDynamicItem(list); } else { - return Container( - margin: EdgeInsets.only( - top: likeMore ? 0 : 10.sp), - child: likeMore ? loaddingWidget(likeMore) : GestureDetector( - onTap: () { - - var homeLogic = Get.find(); - homeLogic.tabController.animateTo(1, duration: Duration(milliseconds: 0), curve: Curves.ease); - homeLogic.updateIndex(1); - }, - child: Container( - margin: EdgeInsets.only(bottom: 10.sp), - child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('add'), - width: 180.sp, - ), - Text( - '查看更多圈子', - style: TextStyle( - color: Colors.white, fontSize: 18.sp), - ) - ], - ), - ), - )); + return normalDynamicItem(list); } - }), - ), - + } else if (!likeMore && + lists.length == index && + recomanddlists.isNotEmpty) { + return tipItem(); + } else if (index - lists.length < recomanddlists.length && + !likeMore) { + var list = recomanddlists[index - lists.length]; + if (list.isQueen!) { + return vipDynamicItem(list); + } else { + return normalDynamicItem(list); + } + } else { + if (recomandMore) return Container(); + return Container( + margin: EdgeInsets.only(top: likeMore ? 0 : 10.sp), + child: likeMore + ? loaddingWidget(likeMore) + : GestureDetector( + onTap: () { + var homeLogic = Get.find(); + homeLogic.tabController.animateTo(1, + duration: Duration(milliseconds: 0), + curve: Curves.ease); + homeLogic.updateIndex(1); + }, + child: Container( + margin: EdgeInsets.only(bottom: 10.sp), + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getLoginImage('start_bg'), + width: 180.sp, + ), + Text( + '查看更多圈子', + style: TextStyle( + color: Colors.white, + fontSize: 18.sp), + ) + ], + ), + ), + )); + } + }), + ), )); } - void _showTextContentDialog(BuildContext context, String msg,String title) { + void _showTextContentDialog(BuildContext context, String msg, String title) { showDialog( context: context, builder: (BuildContext context) { @@ -357,7 +381,6 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin padding: const EdgeInsets.all(1.0), child: Stack( children: [ - Container( decoration: BoxDecoration( shape: BoxShape.rectangle, @@ -385,31 +408,37 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin 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, + Icons.close, + color: Colors.white, size: 20.sp, ), )), @@ -439,7 +468,8 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin onTap: () { // pushOtherPeopleHomePage(element.id.toString()); }, - child: circleWidget(element.avatar!,element.id.toString(), width: 24), + child: + circleWidget(element.avatar!, element.id.toString(), width: 24), ), )); index++; @@ -455,13 +485,12 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin double picHeight = 0.0; - if (lists.album != null) { if (lists.album!.isNotEmpty) { Album info = lists.album!.first; if (info.type == 1) { - double picWidth = (Get.width - 20.sp)/3; + double picWidth = (Get.width - 20.sp) / 3; if (lists.album!.length > 3) { picHeight = picWidth * 2; } else { @@ -473,19 +502,20 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin } } - double widgetHeight = 130.sp + contentHeight(lists.content!) + picHeight + 76.sp; + double widgetHeight = + 130.sp + contentHeight(lists.content!) + picHeight + 76.sp; return GestureDetector( onTap: () async { - var sp = await SharedPreferencesHelper.getInstance(); - String myUserId = sp.getMyUserId(); + var sp = await SharedPreferencesHelper.getInstance(); + String myUserId = sp.getMyUserId(); - if(lists.user?.id!.toString() == myUserId){ - Get.toNamed(AppRoutes.UserInfoActivity); - return; - } - pushHomePage(lists, lists.id.toString()); - }, + if (lists.user?.id!.toString() == myUserId) { + Get.toNamed(AppRoutes.UserInfoActivity); + return; + } + pushHomePage(lists, lists.id.toString()); + }, child: Container( margin: EdgeInsets.only(top: 10.sp), width: Get.width, @@ -496,10 +526,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin image: AssetImage( getCircleImage('pic_bg'), ))), - child: Stack(children: - - [ - + child: Stack(children: [ Positioned( left: 0, top: 2.sp, @@ -509,7 +536,6 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin Positioned( right: 2.sp, top: 2.sp, - child: Stack( alignment: Alignment.center, children: [ @@ -544,7 +570,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), ClipOval( child: CachedNetworkImage( - imageUrl:lists.user!.avatar_thumb!, + imageUrl: lists.user!.avatar_thumb!, width: 40.sp, height: 40.sp, fit: BoxFit.cover, @@ -554,65 +580,72 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), Expanded( child: Container( - padding: EdgeInsets.only(left: 8.sp, top: 12.sp), - alignment: Alignment.centerLeft, - height: 72.sp, - child: Column( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + alignment: Alignment.centerLeft, + height: 72.sp, + child: Column( + children: [ + Row( children: [ - Row( - children: [ - Text( - lists.user!.nickname!, - style: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w600), - ), - SizedBox( - width: 8.sp, - ), - lists.user?.vip != null && lists.user!.vip == 0 - ? Container() - : Image.asset( - getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), - width: 36.sp, - ) - ], + Text( + lists.user!.nickname!, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), ), SizedBox( - height: 4.sp, - ), - Row( - children: [ - Container( - alignment: Alignment.center, - height: 18.sp, - padding: - EdgeInsets.only(left: 6.sp, right: 6.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(9.sp), - gradient: const LinearGradient( - begin: Alignment(0.25, 0.5), - end: Alignment(0.75, 0.5), - colors: [ - Color(0xff8DFFF8), - 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!]}', - style: TextStyle( - color: Colors.black, - fontSize: 12.sp, - ), - ), - ) - ], + width: 8.sp, ), + lists.user?.vip != null && + lists.user!.vip == 0 + ? Container() + : Image.asset( + getCircleImage(lists.user!.vip == 1 + ? 'vip' + : 'year_vip'), + width: 36.sp, + ) ], ), - )), + SizedBox( + height: 4.sp, + ), + Row( + children: [ + Container( + alignment: Alignment.center, + height: 18.sp, + padding: EdgeInsets.only( + left: 6.sp, right: 6.sp), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(9.sp), + gradient: const LinearGradient( + begin: Alignment(0.25, 0.5), + end: Alignment(0.75, 0.5), + colors: [ + Color(0xff8DFFF8), + 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!]}', + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + ), + ), + ) + ], + ), + ], + ), + )), ], ), ), @@ -626,51 +659,51 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin margin: EdgeInsets.only(top: 5.sp), child: picHeight == 140.sp ? ClipRRect( - borderRadius: BorderRadius.circular(6.sp), - child: VideoItemWidget(lists.album![0].url!)) + borderRadius: BorderRadius.circular(6.sp), + child: VideoItemWidget(lists.album![0].url!)) : GridView.builder( - itemCount: lists.album!.length, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, //横轴三个子widget - crossAxisSpacing: 8.sp, - mainAxisSpacing: 8.sp, - childAspectRatio: 1.0 //宽高比为1时,子widget - ), - itemBuilder: (contentxt, currentIndex) { - Album album = lists.album![currentIndex]; - return GestureDetector( - onTap: () { - var imgList = []; - for (var element in lists.album!) { - imgList.add(element.url!); - } - Get.toNamed(AppRoutes.Swiper, arguments: { - 'imaglist': imgList, - 'index': currentIndex - }); - }, - child: ClipRRect( - borderRadius: BorderRadius.circular(6.sp), - child: CachedNetworkImage( - imageUrl: album.url!, - // placeholder: (context, url) => - // SizedBox( - // width: 30.sp, - // height: 30.sp, - // child: CircularProgressIndicator( - // color: Color(0xFF07FAFB), - // strokeWidth: 2.sp, - // ), - // ), - errorWidget: (context, url, error) => - const Icon(Icons.error), - fit: BoxFit.cover, - ), - ), - ); - }), + itemCount: lists.album!.length, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, //横轴三个子widget + crossAxisSpacing: 8.sp, + mainAxisSpacing: 8.sp, + childAspectRatio: 1.0 //宽高比为1时,子widget + ), + itemBuilder: (contentxt, currentIndex) { + Album album = lists.album![currentIndex]; + return GestureDetector( + onTap: () { + var imgList = []; + for (var element in lists.album!) { + imgList.add(element.url!); + } + Get.toNamed(AppRoutes.Swiper, arguments: { + 'imaglist': imgList, + 'index': currentIndex + }); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: CachedNetworkImage( + imageUrl: album.url!, + // placeholder: (context, url) => + // SizedBox( + // width: 30.sp, + // height: 30.sp, + // child: CircularProgressIndicator( + // color: Color(0xFF07FAFB), + // strokeWidth: 2.sp, + // ), + // ), + errorWidget: (context, url, error) => + const Icon(Icons.error), + fit: BoxFit.cover, + ), + ), + ); + }), ), Container( height: 30.sp, @@ -678,36 +711,38 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin margin: EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000) - ), + color: Color(0x33000000)), child: Row( children: [ widgets.isNotEmpty ? SizedBox( - width: 24 + 12.sp * widgets.length - 8.sp, - height: 24.sp, - child: Stack(children: widgets), - ) + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) : Container(), SizedBox( width: 4.sp, ), widgets.isNotEmpty ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white, fontSize: 14.sp), - )) + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )) : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white, fontSize: 14.sp), - )), + child: Text( + '赶紧成为第一位私聊ta的圈友吧', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )), GestureDetector( onTap: () { - pushMsgPage(lists, lists.interest!['id'].toString(),); + pushMsgPage( + lists, + lists.interest!['id'].toString(), + ); // pushHomePage( // lists, widget.bean.id.toString()); }, @@ -727,7 +762,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin left: 2.sp, child: Container( width: Get.width - 4.sp - 20.sp, - child: circleInfoItem(lists.interest,lists,index), + child: circleInfoItem(lists.interest, lists, index), )) ])), ); @@ -747,7 +782,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin Album info = lists.album!.first; if (info.type == 1) { - double picWidth = (Get.width - 20.sp)/3; + double picWidth = (Get.width - 20.sp) / 3; if (lists.album!.length > 3) { picHeight = picWidth * 2; } else { @@ -765,9 +800,9 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin 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++; @@ -784,7 +819,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin 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; } @@ -822,7 +857,6 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), Container( width: Get.width, - padding: EdgeInsets.only(left: 12.sp, right: 12.sp), child: Column( children: [ @@ -840,7 +874,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), ClipOval( child: CachedNetworkImage( - imageUrl:lists.user!.avatar_thumb!, + imageUrl: lists.user!.avatar_thumb!, width: 40.sp, height: 40.sp, fit: BoxFit.cover, @@ -852,65 +886,71 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), Expanded( child: Container( - padding: EdgeInsets.only(left: 8.sp, top: 12.sp), - alignment: Alignment.centerLeft, - height: 72.sp, - child: Column( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + alignment: Alignment.centerLeft, + height: 72.sp, + child: Column( + children: [ + Row( children: [ - Row( - children: [ - Text( - lists.user!.nickname!, - style: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w600), - ), - SizedBox( - width: 8.sp, - ), - lists.user?.vip != null && lists.user!.vip == 0 - ? Container() - : Image.asset( - getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), - width: 36.sp, - ) - ], + Text( + lists.user!.nickname!, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), ), SizedBox( - height: 4.sp, - ), - Row( - children: [ - Container( - alignment: Alignment.center, - height: 18.sp, - padding: EdgeInsets.only( - left: 6.sp, right: 6.sp), - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(9.sp), - gradient: const LinearGradient( - begin: Alignment(0.25, 0.5), - end: Alignment(0.75, 0.5), - colors: [ - Color(0xff8DFFF8), - Color(0xffB5D3FF) - ])), - child: Text( - 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, - ), - ), - ) - ], + width: 8.sp, ), + lists.user?.vip != null && + lists.user!.vip == 0 + ? Container() + : Image.asset( + getCircleImage(lists.user!.vip == 1 + ? 'vip' + : 'year_vip'), + width: 36.sp, + ) ], ), - )), + SizedBox( + height: 4.sp, + ), + Row( + children: [ + Container( + alignment: Alignment.center, + height: 18.sp, + padding: EdgeInsets.only( + left: 6.sp, right: 6.sp), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(9.sp), + gradient: const LinearGradient( + begin: Alignment(0.25, 0.5), + end: Alignment(0.75, 0.5), + colors: [ + Color(0xff8DFFF8), + Color(0xffB5D3FF) + ])), + child: Text( + 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, + ), + ), + ) + ], + ), + ], + ), + )), ], ), ), @@ -921,69 +961,77 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), picHeight > 0 ? Container( - height: picHeight, - alignment: Alignment.centerLeft, - margin: EdgeInsets.only(top: 5.sp), - child: picHeight == 140.sp - ? ClipRRect( - borderRadius: BorderRadius.circular(6.sp), - child: VideoItemWidget(lists.album![0].url!)) - : GridView.builder( - itemCount: lists.album!.length, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, //横轴三个子widget - crossAxisSpacing: 8.sp, - mainAxisSpacing: 8.sp, - childAspectRatio: 1.0 //宽高比为1时,子widget - ), - itemBuilder: (contentxt, currentIndex) { - Album album = lists.album![currentIndex]; - if (album.type == 2) { - return ClipRRect( - borderRadius: - BorderRadius.circular(6.sp), - child: VideoItemWidget(album.url!)); - } - return GestureDetector( - onTap: () { - var imgList = []; - for (var element in lists.album!) { - imgList.add(element.url!); - } - Get.toNamed(AppRoutes.Swiper, - arguments: { - 'imaglist': imgList, - 'index': currentIndex - }); - }, - child: ClipRRect( - borderRadius: - BorderRadius.circular(6.sp), - child: CachedNetworkImage( - imageUrl: album.url!, - // placeholder: (context, url) => - // SizedBox( - // width: 30.sp, - // height: 30.sp, - // child: CircularProgressIndicator( - // color: Color(0xFF07FAFB), - // strokeWidth: 2.sp, - // ), - // ), - errorWidget: (context, url, error) => - const Icon(Icons.error), - fit: BoxFit.cover, - ), - ), - ); - })) + height: picHeight, + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(top: 5.sp), + child: picHeight == 140.sp + ? ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: + VideoItemWidget(lists.album![0].url!)) + : GridView.builder( + itemCount: lists.album!.length, + physics: + const NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, //横轴三个子widget + crossAxisSpacing: 8.sp, + mainAxisSpacing: 8.sp, + childAspectRatio: + 1.0 //宽高比为1时,子widget + ), + itemBuilder: (contentxt, currentIndex) { + Album album = lists.album![currentIndex]; + if (album.type == 2) { + return ClipRRect( + borderRadius: + BorderRadius.circular(6.sp), + child: VideoItemWidget(album.url!)); + } + return GestureDetector( + onTap: () { + var imgList = []; + for (var element in lists.album!) { + imgList.add(element.url!); + } + Get.toNamed(AppRoutes.Swiper, + arguments: { + 'imaglist': imgList, + 'index': currentIndex + }); + }, + child: ClipRRect( + borderRadius: + BorderRadius.circular(6.sp), + child: CachedNetworkImage( + imageUrl: album.url!, + // placeholder: (context, url) => + // SizedBox( + // width: 30.sp, + // height: 30.sp, + // child: CircularProgressIndicator( + // color: Color(0xFF07FAFB), + // strokeWidth: 2.sp, + // ), + // ), + errorWidget: + (context, url, error) => + const Icon(Icons.error), + fit: BoxFit.cover, + ), + ), + ); + })) : Container(), Container( height: 30.sp, - padding: EdgeInsets.only(left: 5.sp, right: 10.sp,), - margin: EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), + padding: EdgeInsets.only( + left: 5.sp, + right: 10.sp, + ), + margin: + EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15.sp), color: Color(0x33000000)), @@ -991,30 +1039,31 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin children: [ widgets.isNotEmpty ? SizedBox( - width: 24 + 12.sp * widgets.length - 8.sp, - height: 24.sp, - child: Stack(children: widgets), - ) + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) : Container(), SizedBox( width: 4.sp, ), widgets.isNotEmpty ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white, fontSize: 14.sp), - )) + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )) : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white, fontSize: 14.sp), - )), + child: Text( + '赶紧成为第一位私聊ta的圈友吧', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )), GestureDetector( - onTap: () async{ - pushMsgPage(lists, lists.interest!['id'].toString()); + onTap: () async { + pushMsgPage( + lists, lists.interest!['id'].toString()); // }); }, @@ -1025,7 +1074,6 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ], ), ), - ], ), ), @@ -1034,7 +1082,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin bottom: 2.sp, child: Container( width: Get.width - 4.sp - 20.sp, - child: circleInfoItem(lists.interest,lists,index), + child: circleInfoItem(lists.interest, lists, index), )) ], )), @@ -1057,32 +1105,43 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), ), if (showTitle) - Text('还没有您喜欢的圈友发布喊话哦~',style: TextStyle(color: Colors.white,fontSize: 16.sp),), + Text( + '还没有您喜欢的圈友发布喊话哦~', + style: TextStyle(color: Colors.white, fontSize: 16.sp), + ), Container( margin: EdgeInsets.only(top: 20.sp), - padding: EdgeInsets.only(left: 30.sp,right: 30.sp), + padding: EdgeInsets.only(left: 30.sp, right: 30.sp), child: Row( children: [ - Expanded(child: Container(height: 2.sp,color: Colors.white.withOpacity(0.5),)), + Expanded( + child: Container( + height: 2.sp, + color: Colors.white.withOpacity(0.5), + )), Container( - margin: EdgeInsets.only(left: 8.sp,right: 8.sp), + margin: EdgeInsets.only(left: 8.sp, right: 8.sp), height: 2.sp, decoration: BoxDecoration( - color: Colors.white.withOpacity(0.5), - borderRadius: BorderRadius.circular(1.sp) - ), + color: Colors.white.withOpacity(0.5), + borderRadius: BorderRadius.circular(1.sp)), + ), + Text( + '喊话推荐', + style: TextStyle(color: Colors.white, fontSize: 17.sp), ), - Text('喊话推荐',style: TextStyle(color: Colors.white,fontSize: 17.sp),), Container( - margin: EdgeInsets.only(left: 8.sp,right: 8.sp), + margin: EdgeInsets.only(left: 8.sp, right: 8.sp), height: 2.sp, decoration: BoxDecoration( - color: Colors.white.withOpacity(0.5), - borderRadius: BorderRadius.circular(1.sp) - ), + color: Colors.white.withOpacity(0.5), + borderRadius: BorderRadius.circular(1.sp)), ), - - Expanded(child: Container(height: 2.sp,color: Colors.white.withOpacity(0.5),)), + Expanded( + child: Container( + height: 2.sp, + color: Colors.white.withOpacity(0.5), + )), ], ), ) @@ -1091,23 +1150,21 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ); } - circleInfoItem(var bean,Lists list,int index) { + circleInfoItem(var bean, Lists list, int index) { return GestureDetector( onTap: () { Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean['id'].toString()); }, child: ClipRRect( - borderRadius: BorderRadius.circular( - 12.sp), + borderRadius: BorderRadius.circular(12.sp), child: Container( padding: EdgeInsets.only(left: 12.sp, right: 12.sp), height: 72.sp, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.fill, - image: - AssetImage(getCircleImage('top_circle_bg')))), + image: AssetImage(getCircleImage('top_circle_bg')))), child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -1130,68 +1187,79 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: CachedNetworkImage( - imageUrl:bean['image'], + imageUrl: bean['image'], width: 40.sp, height: 40.sp, memCacheHeight: 40, memCacheWidth: 40, - fit:BoxFit.cover - ), + fit: BoxFit.cover), ), ), Expanded( child: Container( - padding: EdgeInsets.only(left: 8.sp, top: 12.sp), - // alignment: Alignment., - height: 72.sp, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - bean['title'], - style: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w600), - ), - SizedBox( - height: 4.sp, - ), - Text( - // "view_total" -> 21 - '${convertToTenThousand(bean['view_total'])}人看过', - textAlign: TextAlign.left, - style: TextStyle( - color: const Color(0xff03FEFB), - fontSize: 12.sp, - ), - ), - ], + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bean['title'], + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), ), - )), - GestureDetector(//加入圈子 + SizedBox( + height: 4.sp, + ), + Text( + // "view_total" -> 21 + '${convertToTenThousand(bean['view_total'])}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + )), + GestureDetector( + //加入圈子 onTap: () async { CircleLogic cLogic = Get.find(); if (bean['is_join']) { var data = await DioManager.instance.get( - url: "/up-service/interest/${bean['id']}",); + url: "/up-service/interest/${bean['id']}", + ); if (data["code"] == 200) { Circle info = Circle.fromJson(data['data']); - Get.bottomSheet( - CircleShare('','',info), isScrollControlled: true, - enableDrag: false - ); + Get.bottomSheet(CircleShare('', '', info), + isScrollControlled: true, enableDrag: false); } } else { await cLogic.outCircle( - bean['id'].toString(), - bean['is_join']); + bean['id'].toString(), bean['is_join']); bean['is_join'] = !bean['is_join']; - list.interest = bean; - lists[index] = list; - setState(() { + if (recomanddlists.isNotEmpty) { + recomanddlists.forEach((element) { + if (element.interest!['id'].toString() == bean['id'].toString()) { + element.interest!['is_join'] = true; + element.interest = element.interest!; + } + }); + } - }); + if (lists.isNotEmpty) { + lists.forEach((element) { + if (element.interest!['id'].toString() == bean['id'].toString()) { + element.interest!['is_join'] = true; + element.interest = element.interest!; + } + }); + } + setState(() {}); } }, child: Stack( @@ -1203,8 +1271,8 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), Text( !bean['is_join'] ? '申请加入' : '分享有奖', - style: TextStyle( - color: Colors.white, fontSize: 12.sp), + style: + TextStyle(color: Colors.white, fontSize: 12.sp), ) ], )) @@ -1214,9 +1282,9 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ); } - circleWidget(String url, String userId,{double width = 24}) { + circleWidget(String url, String userId, {double width = 24}) { return GestureDetector( - onTap: (){ + onTap: () { Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); }, child: Stack( @@ -1228,7 +1296,8 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin ), ClipOval( child: CachedNetworkImage( - imageUrl:url??"https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + imageUrl: url ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", width: (width - 1).sp, height: (width - 1).sp, fit: BoxFit.cover, @@ -1240,8 +1309,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin )); } - void _showOutCircleDialog( - BuildContext context, var controller, var bean) { + void _showOutCircleDialog(BuildContext context, var controller, var bean) { showDialog( context: context, builder: (BuildContext context) { @@ -1283,7 +1351,7 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin child: Text( "提示", style: - TextStyle(color: Colors.white, fontSize: 16.sp), + TextStyle(color: Colors.white, fontSize: 16.sp), ), ), Container( @@ -1336,9 +1404,8 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin GestureDetector( onTap: () async { Navigator.pop(context); - await controller - .outCircle(bean['id'].toString(), bean['is_join']); - + await controller.outCircle( + bean['id'].toString(), bean['is_join']); }, child: Container( margin: EdgeInsets.only(top: 24.sp), @@ -1406,4 +1473,4 @@ class _LikeViewState extends State with AutomaticKeepAliveClientMixin // logic.update(); // } } -} \ No newline at end of file +} diff --git a/circle_app/lib/app/dialog/UnlockCallDialog.dart b/circle_app/lib/app/dialog/UnlockCallDialog.dart index 7f1d72a..4ee69a6 100644 --- a/circle_app/lib/app/dialog/UnlockCallDialog.dart +++ b/circle_app/lib/app/dialog/UnlockCallDialog.dart @@ -203,7 +203,7 @@ class UnlockCallDialog extends GetxController { child: Row( children: [ Text( - '¥${int.parse(amount)}', + '¥${double.parse(amount).toInt()}', style: TextStyle( color: Color(0xffE845FF), fontSize: 16.sp, @@ -213,7 +213,7 @@ class UnlockCallDialog extends GetxController { width: 2.sp, ), Text( - '(原价${int.parse(oldAmount)})', + '(原价${double.parse(oldAmount).toInt()})', style: TextStyle( color: Colors.white70, fontSize: 16.sp, diff --git a/circle_app/lib/app/dialog/UpdateDialog.dart b/circle_app/lib/app/dialog/UpdateDialog.dart index 0d6f247..ecd9b01 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'; @@ -260,7 +260,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/home/logic.dart b/circle_app/lib/app/home/logic.dart index f4f9aa6..d5a0e70 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -40,7 +40,16 @@ class HomeLogic extends GetxController { final RxString unreadSIze = "0".obs; final RxBool showcirlceUnred = false.obs; + late V2TimSimpleMsgListener msgListener; + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + TencentImSDKPlugin.v2TIMManager + .v2TIMMessageManager.removeAdvancedMsgListener(); + + } @override void onInit() async { @@ -55,11 +64,15 @@ class HomeLogic extends GetxController { tabs.add(MsgPage()); tabs.add(MinefragmentPage()); - EventBusManager.on().listen((event) { - getUnreadSize(); - }); + // EventBusManager.on().listen((event) { + // getUnreadSize(); + // }); getUnreadSize(); - var msgListener = V2TimSimpleMsgListener(onRecvC2CTextMessage: ( + + + + + msgListener = V2TimSimpleMsgListener(onRecvC2CTextMessage: ( msgID, userInfo, text, @@ -100,7 +113,7 @@ class HomeLogic extends GetxController { break; case 2://上线 - String ageMsg = "${content['genderName']}·${content['age']}·${content['roleName']}·${content['orientationName']}"; + String ageMsg = "${content['genderName']}·${content['age']}·${content['roleName']}·${content['orientationName']}"; showFloatingButtonOverlay(Get.context!,content['nickname'],ageMsg,content['avatarThumb'],2,(){ pushChatPage(content['id'].toString(), content['imId'], @@ -113,6 +126,25 @@ class HomeLogic extends GetxController { }); + TencentImSDKPlugin.v2TIMManager + .v2TIMMessageManager.addAdvancedMsgListener( + listener: V2TimAdvancedMsgListener( + onRecvNewMessage: (message) { + print(message); + if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) { + if ( message.customElem?.data != null) { + print(message.customElem!.data!); + Map jsonData = jsonDecode(message.customElem!.data!); + String event = jsonData['event'].toString(); + if (int.parse(event) == 3) { + showOKToast(message.customElem!.desc!.toString()); + EventBusManager.fire(LikeRefresh()); + } + } + } + } + ) + ); diff --git a/circle_app/lib/app/home/view.dart b/circle_app/lib/app/home/view.dart index 506eeea..0df2c6c 100644 --- a/circle_app/lib/app/home/view.dart +++ b/circle_app/lib/app/home/view.dart @@ -18,7 +18,7 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State - with AutomaticKeepAliveClientMixin,SingleTickerProviderStateMixin { + with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin { @override bool get wantKeepAlive => true; @@ -27,7 +27,11 @@ class _HomePageState extends State void initState() { // TODO: implement initState super.initState(); - logic.tabController = TabController(length: 4, vsync: this, initialIndex: 0,animationDuration: Duration.zero); + logic.tabController = TabController( + length: 4, + vsync: this, + initialIndex: 0, + animationDuration: Duration.zero); } @override @@ -67,7 +71,7 @@ class _HomePageState extends State width: MediaQuery.of(context).size.width, // height: // Get.height - 49.sp + MediaQuery.of(context).padding.bottom, - decoration: const BoxDecoration(image: bgWidget), + decoration: const BoxDecoration(image: bgWidget), ), TabBarView( physics: const NeverScrollableScrollPhysics(), @@ -94,7 +98,8 @@ class _HomePageState extends State behavior: HitTestBehavior.opaque, onTap: () { if (!isSelected) { - logic.tabController.animateTo(index, duration: Duration(milliseconds: 0), curve: Curves.ease); + logic.tabController.animateTo(index, + duration: Duration(milliseconds: 0), curve: Curves.ease); controller.updateIndex(index); } }, @@ -113,24 +118,24 @@ class _HomePageState extends State gaplessPlayback: true, ))), // if (logic.showcirlceUnred.value && index == 1) - Obx(() => Visibility( - visible: index == 1 && controller.showcirlceUnred.value, - child: Positioned( - // right: 4.sp, - top: 10.sp, - child: Container( - - width: 14.sp, - height: 14.sp, - margin: EdgeInsets.only( - left:24.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(7.sp), - gradient: LinearGradient( - colors: controller.showcirlceUnred.value ? [Color(0xFFC343F9), Color(0xFFFB34B2)] : [Color(0xFFC343F9), Color(0xFFFB34B2)]), - border: - Border.all(color: Color(0xFF170730), width: 1.sp))), - ))), + Obx(() => Visibility( + visible: index == 1 && controller.showcirlceUnred.value, + child: Positioned( + // right: 4.sp, + top: 10.sp, + child: Container( + width: 14.sp, + height: 14.sp, + margin: EdgeInsets.only(left: 24.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.sp), + gradient: LinearGradient( + colors: controller.showcirlceUnred.value + ? [Color(0xFFC343F9), Color(0xFFFB34B2)] + : [Color(0xFFC343F9), Color(0xFFFB34B2)]), + border: + Border.all(color: Color(0xFF170730), width: 1.sp))), + ))), // Obx(() => null) Obx(() => Visibility( visible: index == 2 && controller.unreadSIze != "0", diff --git a/circle_app/lib/app/like/logic.dart b/circle_app/lib/app/like/logic.dart index 3880df8..d7fbbdf 100644 --- a/circle_app/lib/app/like/logic.dart +++ b/circle_app/lib/app/like/logic.dart @@ -155,6 +155,17 @@ class LikeLogic extends GetxController { showOKToast(bean.msg); } + setTopCircle(String interest_id,bool isStatus) async { + var data = await DioManager.instance.post( + url: Api.circleTop, + params: {"interestId": interest_id,'isTop' :isStatus ? 1 : 0}); + var bean = BaseResponse.fromJson(data, (data) => data); + if (bean.code == 200) { + relaodMyData(); + } + showOKToast(bean.msg); + } + loadCalloutsNew() async { List idList = []; diff --git a/circle_app/lib/app/like/view.dart b/circle_app/lib/app/like/view.dart index 608b7bf..4cfe535 100644 --- a/circle_app/lib/app/like/view.dart +++ b/circle_app/lib/app/like/view.dart @@ -1,9 +1,13 @@ + + import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/circle/widgets/info_list_view.dart'; import 'package:circle_app/app/select_circle/logic.dart'; import 'package:circle_app/common/Widgets/circle_share.dart'; import 'package:circle_app/common/Widgets/text_more.dart'; +import 'package:circle_app/main.dart'; +import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; @@ -12,11 +16,48 @@ import 'package:get/get.dart'; import 'logic.dart'; -class LikePage extends StatelessWidget { +class LikePage extends StatefulWidget { LikePage({Key? key}) : super(key: key); + + @override + State createState() => _LikePageState(); +} + +class _LikePageState extends State with RouteAware { final ctr = Get.lazyPut(() => LikeLogic()); + final logic = Get.find(); + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + + /// 路由订阅 + routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); + } + + + @override + void dispose() { + routeObserver.unsubscribe(this); + super.dispose(); + } + + void didPopNext() { + print('didPopNext'); + logic.loadMyCircleData(); + } + + ///当前页面进入时触发 + void didPush() { + print('didPopNext'); + + } + void didPop() { + print('didPop'); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -70,7 +111,8 @@ class LikePage extends StatelessWidget { logic.currentIndex, logic.mycircle.lists[logic.currentIndex], logic, - key: ValueKey('${logic.mycircle.lists[logic.currentIndex].id.toString() + logic.currentIndex.toString()}'), + key: ValueKey( + '${logic.mycircle.lists[logic.currentIndex].id.toString() + logic.currentIndex.toString()}'), ))) ], ), @@ -91,7 +133,7 @@ class LikePage extends StatelessWidget { child: ListView.builder( controller: logic.rightCtr, itemBuilder: (context, index) { - return circleInfoItem(logic.circle.lists[index]); + return circleInfoItem(logic.circle.lists[index],index); }, itemCount: logic.circle.lists.length, )), @@ -112,7 +154,7 @@ class LikePage extends StatelessWidget { ); } - circleInfoItem(Circle bean) { + circleInfoItem(Circle bean,int index) { List urlList = bean.lastJoinUsers; List widgets = []; int i = 0; @@ -133,10 +175,20 @@ class LikePage extends StatelessWidget { }); } return GestureDetector( - onTap: () { - // if (bean.isJoin) { - Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean.id); - // } + onTap: () async { + var result = await Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean.id); + var data = await DioManager.instance.get( + url: "/up-service/interest/${bean.id}",); + if (data["code"] == 200) { + var bean = Circle.fromJson(data['data']); + logic.circle.lists[index] = bean; + if (mounted) { + setState(() { + + }); + } + + } }, child: Container( margin: EdgeInsets.only(bottom: 10.sp), @@ -261,9 +313,9 @@ class LikePage extends StatelessWidget { additionText: '查看更多', maxLines: 3, style: - TextStyle(color: Colors.white, fontSize: 14.sp), + TextStyle(color: Colors.white, fontSize: 17.sp), additionStyle: TextStyle( - color: const Color(0xFFFF4DF6), fontSize: 14.sp), + color: const Color(0xFFFF4DF6), fontSize: 17.sp), onTap: () { _showTextContentDialog( Get.context!, bean.intro, bean.title); @@ -365,6 +417,27 @@ class LikePage extends StatelessWidget { logic.update(); } }, + onLongPress: () { + if (index >= 0) { + int count = 0; + for(int i = 0; i < logic.mycircle.lists.length; i++) { + if (logic.mycircle.lists[i].is_top) { + count++; + } + if (count == 5 || i > 5) { + break; + } + } + + if (count == 5 && !logic.mycircle.lists[index].is_top) { + showOKToast('圈子置顶最多五个哦~'); + } else { + _showSetTopCircleDialog(Get.context!,logic,logic.mycircle.lists[index]); + } + + + } + }, child: Container( width: 65.sp, height: 65.sp, @@ -373,31 +446,35 @@ class LikePage extends StatelessWidget { alignment: Alignment.center, children: [ if (text.isEmpty) - Image.asset( - getCircleImage('circile_all_icon'), - width: 55.sp, - ), + topCicleStatusItem( + isSelcted, + Image.asset( + getCircleImage('circile_all_icon'), + width: 55.sp, + )), if (text.isNotEmpty) - Container( - margin: EdgeInsets.all(6.sp), - // padding: EdgeInsets.only(left: 4.sp), - alignment: Alignment.center, - padding: EdgeInsets.all(6.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(7.sp), - gradient: LinearGradient( - colors: [Color(0xFF3F6967), Color(0xFF5C3769)])), - child: Text( - text, - maxLines: 2, - style: TextStyle( - color: Colors.white, - fontSize: 13.sp, - overflow: TextOverflow.ellipsis, - fontWeight: FontWeight.w600), - textAlign: TextAlign.center, - ), - ), + cicleStatusItem( + isSelcted, + Container( + // margin: EdgeInsets.all(6.sp), + // padding: EdgeInsets.only(left: 4.sp), + alignment: Alignment.center, + // padding: EdgeInsets.all(6.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.sp), + gradient: LinearGradient( + colors: [Color(0xFF3F6967), Color(0xFF5C3769)])), + child: Text( + text, + maxLines: 2, + style: TextStyle( + color: Colors.white, + fontSize: 13.sp, + overflow: TextOverflow.ellipsis, + fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + )), if (isUnread) Positioned( right: 6.sp, @@ -406,7 +483,7 @@ class LikePage extends StatelessWidget { width: 15.sp, height: 15.sp, decoration: BoxDecoration( - shape: BoxShape.circle, + shape: BoxShape.circle, gradient: LinearGradient( colors: [Color(0xFFC343F9), Color(0xFFFB34B2)]), border: @@ -418,6 +495,77 @@ class LikePage extends StatelessWidget { ); } + cicleStatusItem(bool isSelected, Widget widget) { + return Container( + width: 48.sp, + height: 48.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.0), + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: isSelected + ? [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ] + : [ + Colors.transparent, + Colors.transparent, + ], + stops: [0.0365, 0.9427], + ), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(7.0), + child: Container( + padding: EdgeInsets.all(isSelected ? 1.sp : 0.sp), + color: Color(0x14022AFF), + child: widget, + )), + ); + } + + topCicleStatusItem(bool isSelected, Widget widget) { + return Container( + alignment: Alignment.center, + width: 48.sp, + height: 48.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.0), + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: isSelected + ? [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ] + : [ + Colors.transparent, + Colors.transparent, + ], + stops: [0.0365, 0.9427], + ), + ), + child: Container( + width: 47.sp, + height: 47.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.sp), + gradient: LinearGradient( + colors: [Color(0xFF3F6967), Color(0xFF5C3769)])), + // padding: EdgeInsets.all(isSelected ? 1.sp : 0), + child: ClipRRect( + borderRadius: BorderRadius.circular(7.0), + child: Container( + margin: EdgeInsets.all(isSelected ? 1.sp : 0.sp), + color: Color(0x14022AFF), + child: widget, + ))), + ); + } + void _showTextContentDialog(BuildContext context, String msg, String title) { showDialog( context: context, @@ -498,4 +646,140 @@ class LikePage extends StatelessWidget { ); } + void _showSetTopCircleDialog(BuildContext context, var controller, var bean) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 160.sp, + padding: EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 24.sp), + child: Column( + children: [ + Center( + child: Text( + "提示", + style: + TextStyle(color: Colors.white, fontSize: 16.sp), + ), + ), + Container( + margin: EdgeInsets.only( + top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: Text( + bean.is_top ? "是否取消置顶该圈子。" : "是否置顶该圈子。", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Container( + margin: EdgeInsets.only(top: 30.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "否", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ), + SizedBox(width: 24.sp), + GestureDetector( + onTap: () { + Navigator.pop(context); + logic.setTopCircle(bean.id.toString(), !bean.is_top); + }, + child: Container( + margin: EdgeInsets.only(top: 24.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "是", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); + } } 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 004ab23..fdc18bd 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:math'; +import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_slidable_for_tencent_im/flutter_slidable.dart'; @@ -41,9 +42,8 @@ class TIMConversation extends StatefulWidget { /// conversation controller final TIMUIKitConversationController? controller; - - final AutoScrollController? autoScrollController; + final AutoScrollController? autoScrollController; final ScrollController? scrollController; @@ -84,7 +84,7 @@ class TIMConversation extends StatefulWidget { this.controller, this.autoScrollController, this.itemSecondaryMenuBuilder, - this.scrollController, + this.scrollController, this.itemBuilder, this.isShowDraft = true, this.itemSlideBuilder, @@ -160,21 +160,30 @@ class _TIMConversationState extends TIMUIKitState { serviceLocator(); late TIMUIKitConversationController _timuiKitConversationController; final TUIThemeViewModel themeViewModel = serviceLocator(); - final TUIFriendShipViewModel friendShipViewModel = - serviceLocator(); - + // final TUIFriendShipViewModel friendShipViewModel = + // serviceLocator(); + bool hasMore = true; @override void initState() { super.initState(); final controller = getController(); + widget.scrollController!.addListener(() { + + try { + if (widget.scrollController!.position.pixels == + widget.scrollController!.position.maxScrollExtent && hasMore) { + _timuiKitConversationController.loadData(); + } + } catch (_) {} + }); _timuiKitConversationController = controller; _timuiKitConversationController.model = model; } scrollToTop() { widget.autoScrollController!.animateTo( - 0.0, // Scroll to the top + 0, // Scroll to the top duration: Duration(milliseconds: 300), curve: Curves.easeInOut, ); @@ -191,10 +200,10 @@ class _TIMConversationState extends TIMUIKitState { model.setSelectedConversation(conversation); } - _clearHistory(V2TimConversation conversationItem) async{ - await _timuiKitConversationController.clearHistoryMessage( + _clearHistory(V2TimConversation conversationItem) async { + await _timuiKitConversationController.clearHistoryMessage( conversation: conversationItem); - await Future.delayed(Duration(seconds: 1)); + await Future.delayed(Duration(seconds: 1)); EventBusManager.fire(RefreshUnread()); } @@ -204,8 +213,8 @@ class _TIMConversationState extends TIMUIKitState { isPinned: !conversation.isPinned!); } - _deleteConversation(V2TimConversation conversation) async{ - await _timuiKitConversationController.deleteConversation( + _deleteConversation(V2TimConversation conversation) async { + await _timuiKitConversationController.deleteConversation( conversationID: conversation.conversationID); await Future.delayed(Duration(seconds: 1)); EventBusManager.fire(RefreshUnread()); @@ -217,15 +226,15 @@ class _TIMConversationState extends TIMUIKitState { (element) => (element?.groupID != null || element?.userID != null)) .toList(); - // 过滤指定的 userID + // 过滤指定的 userID qpqz_prod_10_10000000000 String devtTargetUserID = "qpqz_dev_10_10000000000"; - String prodTargetUserID = "qpqz_dev_10_10000000000"; + String prodTargetUserID = "qpqz_prod_10_10000000000"; filteredConversationList = filteredConversationList .where((conversation) => - conversation?.userID != devtTargetUserID ||conversation?.userID != prodTargetUserID) + conversation?.userID != devtTargetUserID && + conversation?.userID != prodTargetUserID) .toList(); - if (widget.conversationCollector != null) { filteredConversationList = filteredConversationList .where(widget.conversationCollector!) @@ -384,14 +393,12 @@ class _TIMConversationState extends TIMUIKitState { return MultiProvider( providers: [ ChangeNotifierProvider.value(value: model), - ChangeNotifierProvider.value(value: friendShipViewModel) + // ChangeNotifierProvider.value(value: friendShipViewModel) ], builder: (BuildContext context, Widget? w) { final _model = Provider.of(context); - bool haveMoreData = _model.haveMoreData; - final _friendShipViewModel = - Provider.of(context); - _model.lifeCycle = widget.lifeCycle; + hasMore = _model.haveMoreData; + // _model.lifeCycle = widget.lifeCycle; List filteredConversationList = getFilteredConversation(); @@ -413,31 +420,43 @@ class _TIMConversationState extends TIMUIKitState { future: getUserListInfo(userIdList), builder: (BuildContext context, AsyncSnapshot> snapshot) { + // if (snapshot.connectionState != ConnectionState.done || + // haveMoreData) { + // if (haveMoreData) { + // _timuiKitConversationController.loadData(); + // } + // + // return Container(); + // } + return ListView.builder( controller: widget.scrollController!, shrinkWrap: true, itemCount: filteredConversationList.length, itemBuilder: (context, index) { - if (index == filteredConversationList.length - 1) { - if (haveMoreData) { - _timuiKitConversationController.loadData(); - } - } + // if (index == filteredConversationList.length - 1) { + // if (haveMoreData) { + // loaddingWidget(true); + // // _timuiKitConversationController.loadData(); + // } else { + // return Container(); + // } + // } final conversationItem = filteredConversationList[index]; - final V2TimUserStatus? onlineStatus = - _friendShipViewModel.userStatusList.firstWhere( - (item) => - item.userID == conversationItem?.userID, - orElse: () => - V2TimUserStatus(statusType: 0)); + // final V2TimUserStatus? onlineStatus = + // _friendShipViewModel.userStatusList.firstWhere( + // (item) => + // item.userID == conversationItem?.userID, + // orElse: () => + // V2TimUserStatus(statusType: 0)); - if (widget.itemBuilder != null) { - return widget.itemBuilder!( - conversationItem!, onlineStatus); - } + // if (widget.itemBuilder != null) { + // return widget.itemBuilder!( + // conversationItem!, onlineStatus); + // } final slideChildren = _getSlideBuilder()(conversationItem!); @@ -454,28 +473,38 @@ class _TIMConversationState extends TIMUIKitState { ConnectionState.done) { if ((snapshot.data ?? []).isNotEmpty) { snapshot.data!.forEach((element) { - if (element.userID == conversationItem.userID) { + if (element.userID == + conversationItem.userID) { userFullInfo = element; } }); //自己的信息 - V2TimUserFullInfo myuserFullInfo =snapshot.data!.where((element) => element.userID! == model.selfInfoViewModel.loginInfo!.userID!).toList().first; - + V2TimUserFullInfo myuserFullInfo = snapshot + .data! + .where((element) => + element.userID! == + model.selfInfoViewModel.loginInfo! + .userID!) + .toList() + .first; if (userFullInfo!.customInfo! .containsKey('Label')) { - var otherInfo = jsonDecode(userFullInfo! + if (userFullInfo! .customInfo!['Label'] - .toString()); - Map myInfo = jsonDecode(myuserFullInfo! - .customInfo!['Label'] - .toString()); - if (myInfo != null) { - if (myInfo.containsKey('city')) { - if (myInfo['city'] - .toString() - .contains(otherInfo['city'].toString())) { - isSameCity = true; + .toString().isNotEmpty) { + var otherInfo = jsonDecode(userFullInfo! + .customInfo!['Label'] + .toString()); + Map myInfo = jsonDecode(myuserFullInfo! + .customInfo!['Label'] + .toString()); + if (myInfo != null) { + if (myInfo.containsKey('city')) { + if (myInfo['city'].toString().contains( + otherInfo['city'].toString())) { + isSameCity = true; + } } } } @@ -483,7 +512,7 @@ class _TIMConversationState extends TIMUIKitState { if (userFullInfo != null) { List userIdList = - userFullInfo!.userID!.split('_'); + userFullInfo!.userID!.split('_'); if (userIdList.length >= 4) { if (int.parse(userIdList[2]) == 10) { isOfficial = true; @@ -493,7 +522,6 @@ class _TIMConversationState extends TIMUIKitState { } } } - } Widget conversationLineItem() { @@ -524,7 +552,7 @@ class _TIMConversationState extends TIMUIKitState { conversationItem.userID != null && conversationItem .userID!.isNotEmpty) - ? onlineStatus + ? null : null, draftTimestamp: conversationItem.draftTimestamp, @@ -590,20 +618,18 @@ class _TIMConversationState extends TIMUIKitState { ? widget.emptyBuilder!() : Container()); } - - return TUIKitScreenUtils.getDeviceWidget( + // EasyRefresh( + // header: CustomizeBallPulseHeader(color: theme.primaryColor), + // onRefresh: () async { + // model.refresh(); + // }, + // child: + return TUIKitScreenUtils.getDeviceWidget( defaultWidget: SlidableAutoCloseBehavior( - child: EasyRefresh( - header: CustomizeBallPulseHeader(color: theme.primaryColor), - onRefresh: () async { - model.refresh(); - }, - child:SingleChildScrollView( - controller: widget.scrollController, - child: conversationList(), - ), + child: conversationList(), + ), - ), + desktopWidget: Scrollbar( controller: widget.autoScrollController!, child: conversationList())); diff --git a/circle_app/lib/app/msg/logic.dart b/circle_app/lib/app/msg/logic.dart index 7bb853a..d6923d0 100644 --- a/circle_app/lib/app/msg/logic.dart +++ b/circle_app/lib/app/msg/logic.dart @@ -3,17 +3,20 @@ import 'package:circle_app/network/api.dart'; import 'package:circle_app/network/dio_manager.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; - +import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'state.dart'; class MsgLogic extends GetxController { final MsgState state = MsgState(); List lists = []; + ScrollController listScrollController = ScrollController(); + @override void onInit() { // TODO: implement onInit super.onInit(); + loadLikeData(); } loadLikeData() async { diff --git a/circle_app/lib/app/msg/view.dart b/circle_app/lib/app/msg/view.dart index 4ad3b14..59846ee 100644 --- a/circle_app/lib/app/msg/view.dart +++ b/circle_app/lib/app/msg/view.dart @@ -23,12 +23,16 @@ import 'logic.dart'; const msgBgWidget = DecorationImage( fit: BoxFit.fill, image: AssetImage('assets/images/base/home_back.png')); -class MsgPage extends StatelessWidget { +class MsgPage extends StatefulWidget { MsgPage({Key? key}) : super(key: key); + @override + State createState() => _MsgPageState(); +} + +class _MsgPageState extends State with AutomaticKeepAliveClientMixin { final ctr = Get.put(MsgLogic()); - - + var logic = Get.find(); void getPipeiData() async { var data = await DioManager.instance .get(url: Api.getMatch); @@ -46,7 +50,6 @@ class MsgPage extends StatelessWidget { } } - showRechargeDialog(){ Get.bottomSheet( Scaffold( @@ -73,7 +76,19 @@ class MsgPage extends StatelessWidget { // tipWidget(), // reconmandWidget(), // Text(controller.state.msg), - Expanded(child: msgWdiget(context)) + Expanded(child: TIMConversation( + autoScrollController: logic.scrollController, + scrollController: logic.listScrollController, + onTapItem: (selectedConv) async{ + String type = selectedConv.userID!.split('_')[2]; + if (int.parse(type) == 11) { + Get.toNamed(AppRoutes.Sys_notify_list, arguments: selectedConv); + return; + } + Get.toNamed(AppRoutes.Chat, arguments: selectedConv); + + }, + )) ], ); }), @@ -371,4 +386,8 @@ class MsgPage extends StatelessWidget { Widget msgItem(conv, status) { return Container(); } + + @override + // TODO: implement wantKeepAlive + bool get wantKeepAlive => true; } diff --git a/circle_app/lib/app/my_circle/view.dart b/circle_app/lib/app/my_circle/view.dart index b23fb0a..4220fec 100644 --- a/circle_app/lib/app/my_circle/view.dart +++ b/circle_app/lib/app/my_circle/view.dart @@ -504,140 +504,5 @@ class _My_circlePageState extends State ); } - void _showOutCircleDialog(BuildContext context, var controller, Circle bean) { - showDialog( - context: context, - builder: (BuildContext context) { - return Dialog( - backgroundColor: Colors.transparent, - child: Container( - height: 160.sp, - padding: EdgeInsets.all(1.0), - child: Stack( - children: [ - Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(10.0), - gradient: LinearGradient( - colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - ), - ), - Container( - margin: EdgeInsets.all(1.sp), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(10.0), - gradient: LinearGradient( - colors: [Color(0xFF4C3E5F), Color(0xFF324140)], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - ), - ), - Container( - margin: EdgeInsets.only(top: 24.sp), - child: Column( - children: [ - Center( - child: Text( - "提示", - style: - TextStyle(color: Colors.white, fontSize: 16.sp), - ), - ), - Container( - margin: EdgeInsets.only( - top: 12.sp, left: 14.sp, right: 14.sp), - alignment: Alignment.center, - child: Text( - "是否确认退出该圈子。", - textAlign: TextAlign.center, - style: TextStyle( - color: Color(0xCCF7FAFA), fontSize: 16.sp), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - Navigator.pop(context); - }, - child: Container( - margin: EdgeInsets.only(top: 30.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17), - gradient: LinearGradient( - colors: [ - Color(0x26FFFFFF), - Color(0x26FFFFFF), - ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ), - ), - padding: EdgeInsets.only( - top: 10.sp, - bottom: 10.sp, - left: 52.sp, - right: 52.sp), - child: Text( - "否", - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ), - ), - SizedBox(width: 24.sp), - GestureDetector( - onTap: () { - Navigator.pop(context); - logic.outCircle(bean.id.toString(), bean.isJoin); - }, - child: Container( - margin: EdgeInsets.only(top: 24.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17), - gradient: LinearGradient( - colors: [ - Color(0xFF06F9FA), - Color(0xFFDC5BFD), - ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ), - ), - padding: EdgeInsets.only( - top: 10.sp, - bottom: 10.sp, - left: 52.sp, - right: 52.sp), - child: Text( - "是", - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ), - ) - ], - ) - ], - ), - ) - ], - ), - ), - ); - }, - ); - } + } diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index a37b173..f50acba 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -272,8 +272,8 @@ class MyTabbedScreenState extends State borderRadius: BorderRadius.circular(17.sp), gradient: const LinearGradient( colors: [ - Color(0x26FFFFFF), - Color(0x26FFFFFF), + Color(0xaaDC5BFD), + Color(0xaa06F9FA), ], begin: Alignment.centerLeft, end: Alignment.centerRight, diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index dcb586c..d657443 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -33,6 +33,9 @@ import 'package:tencent_chat_push_for_china/tencent_chat_push_for_china.dart'; import 'app/login/login/logic.dart'; import 'app/splash/view.dart'; +///定义全局的 routeObserver 对象 +final RouteObserver routeObserver = RouteObserver(); + final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance(); final TUIChatSeparateViewModel chatSeparateViewModel = TUIChatSeparateViewModel(); @@ -524,6 +527,7 @@ class _MyAppState extends State with WidgetsBindingObserver { Locale('en', 'US'), ], home: SplashPage(), + navigatorObservers: [routeObserver], builder: FlutterSmartDialog.init(), debugShowCheckedModeBanner: false, ))); diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index 49070bf..3c2470a 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -303,6 +303,7 @@ class Api { //获取多个圈子是否有新喊话 static const calloutsNew = '/up-service/interests/callouts/new'; - +//是否置顶圈子 + static const circleTop = '/up-service/interest/top'; } \ No newline at end of file diff --git a/circle_app/lib/util/eventBus.dart b/circle_app/lib/util/eventBus.dart index bbb651a..2448e13 100644 --- a/circle_app/lib/util/eventBus.dart +++ b/circle_app/lib/util/eventBus.dart @@ -62,4 +62,9 @@ class ScrollToTop { class RefreshUnread { +} + + +class LikeRefresh { + } \ No newline at end of file diff --git a/circle_app/lib/util/util.dart b/circle_app/lib/util/util.dart index f437f2c..8c9aeda 100644 --- a/circle_app/lib/util/util.dart +++ b/circle_app/lib/util/util.dart @@ -315,6 +315,24 @@ class CustomLoadFooter extends StatelessWidget { } } + +class CustomLikeLoadFooter extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ClassicFooter( + // 自定义加载更多时的文字 + canLoadingText: "松手开始加载数据", + loadingText: "正在加载...", + idleText: "上拉加载更多", + noDataText: "", + height: 20.sp, + spacing: 5, + failedText: "加载失败", + ); + } +} + + // 获取应用程序的文档目录路径 Future getApplicationDocumentsDirectoryPath() async { final directory = await getApplicationDocumentsDirectory(); diff --git a/circle_app/lib/view/notice.dart b/circle_app/lib/view/notice.dart index 421d5ce..92b0970 100644 --- a/circle_app/lib/view/notice.dart +++ b/circle_app/lib/view/notice.dart @@ -170,7 +170,7 @@ void showFloatingButtonOverlay( countdownTimer = Timer.periodic(Duration(seconds: 1), (timer) { if (countdownSeconds > 0) { countdownSeconds--; - // overlayEntry.markNeedsBuild(); // 刷新 OverlayEntry + // overlayEntry.markNeedsBuild(); // 刷新 OverlayEntry } else { timer.cancel(); // 取消计时器 diff --git a/circle_app/pubspec.lock b/circle_app/pubspec.lock index 0ddb926..f8baf87 100644 --- a/circle_app/pubspec.lock +++ b/circle_app/pubspec.lock @@ -606,6 +606,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.3" + flutter_install_app: + dependency: "direct main" + description: + name: flutter_install_app + sha256: "9b117006d17c900e671c26bcbc9b15c7b8efd15d6f9b4442ad5d576de20fab53" + url: "https://pub.dev" + source: hosted + version: "1.3.0" flutter_intl: dependency: "direct main" description: diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index 2be09f0..af33f4c 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -95,7 +95,7 @@ dependencies: #event_bus: event_bus: ^2.0.0 #安装apk -# flutter_install_app: 1.3.0 + flutter_install_app: 1.3.0 #闪屏页 flutter_native_splash: 2.2.16 #腾讯离线推送