From 8ad451d4d816299ed92bb21c918998e21a275fdc Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 20 Oct 2022 15:43:24 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=B8=8E=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 2 +- assets/images/default_avatar.png | Bin 0 -> 11937 bytes lib/controllers/private_controller.dart | 2 +- lib/routes/contact_routes.dart | 46 ++++- lib/utils/im_tools.dart | 5 +- .../contact/firend/profile/index_page.dart | 29 ++- .../contact/firend/profile/more_page.dart | 5 +- .../{friends_page.dart => friend_page.dart} | 7 +- .../{groups_page.dart => group_page.dart} | 4 +- .../contact/firend/recommend/index_page.dart | 7 +- .../contact/firend/remark/index_page.dart | 9 +- .../contact/firend/request/apply_page.dart | 11 +- .../contact/firend/request/index_page.dart | 8 +- .../contact/firend/search/index_page.dart | 9 +- .../contact/group/create/index_page.dart | 163 +++++++++++++++- lib/views/contact/group/create/user_page.dart | 179 ++++++++++++++++++ lib/views/public/app_page.dart | 13 +- lib/views/user/qr_code/index_page.dart | 120 +++++++++++- lib/widgets/custom_avatar.dart | 2 +- pubspec.lock | 8 +- pubspec.yaml | 4 +- 21 files changed, 566 insertions(+), 67 deletions(-) create mode 100644 assets/images/default_avatar.png rename lib/views/contact/firend/recommend/{friends_page.dart => friend_page.dart} (95%) rename lib/views/contact/firend/recommend/{groups_page.dart => group_page.dart} (97%) create mode 100644 lib/views/contact/group/create/user_page.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 01c6690..23ce002 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -48,7 +48,7 @@ android { defaultConfig { applicationId "site.zhchain.chat" // minSdkVersion flutter.minSdkVersion - minSdkVersion 21 + minSdkVersion 28 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/assets/images/default_avatar.png b/assets/images/default_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..45118389abdb1b6a160dd263fddbb6404a35ee65 GIT binary patch literal 11937 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 HeEdjrpc(OMt6`fl}RE(5mY4r z(UIv4T!$9=(CpLM$=R7&Jc6D!)E+ z?v5|?J*thOp~T^xB!LUzkhBI^t%Y?wbX+b1A}HLaVvu{K*v^tP7T`WwY}z(|hZtn% z2&O%Ld{$L;_2q-5`%)o8H*;WdG%es<>kDp;>osI@Fz`<1?a|d``k$DSK}L%S*HoQv zR!2tG`n$?73D6j_LG@6tKhzkC<}dHc%F5c?+sAxVk(toZ6AcnhY;gY^j$S14s4mvM z;y%+}<7)lPb)4+C3Ibkv1g$`)=7V zW=5GiUFeE!ce_Vq%5ME)+gq3uGPuk{ba}8+G45sl(vv const ContactGroupCreatePage(), + page: () => const ContactFriendSearchPage(), + ), + GetPage( + name: '/profile', + page: () => const ContactFriendProfilePage(), + children: [ + GetPage( + name: '/more', + page: () => const ContactFriendProfileMorePage(), + ), + ], + ), + GetPage( + name: '/remark', + page: () => const ContactFriendRemarkPage(), + ), + GetPage( + name: '/recommend', + page: () => const ContactFriendRecommendPage(), + children: [ + GetPage( + name: '/friend', + page: () => const ContactFriendRecommendFriendPage(), + ), + GetPage( + name: '/group', + page: () => const ContactFriendRecommendGroupPage(), + ), + ], ), ], ), diff --git a/lib/utils/im_tools.dart b/lib/utils/im_tools.dart index 79fe947..13e6754 100644 --- a/lib/utils/im_tools.dart +++ b/lib/utils/im_tools.dart @@ -30,8 +30,9 @@ class ImTools { } static String parseNicknameFromInfo(V2TimFriendInfo infoResult) { - if (infoResult.friendRemark != '') { - return infoResult.friendRemark!; + if (infoResult.friendRemark != null && + infoResult.friendRemark!.isNotEmpty) { + return infoResult.friendRemark ?? ''; } return infoResult.userProfile!.nickName!; diff --git a/lib/views/contact/firend/profile/index_page.dart b/lib/views/contact/firend/profile/index_page.dart index 9890a40..7c08020 100644 --- a/lib/views/contact/firend/profile/index_page.dart +++ b/lib/views/contact/firend/profile/index_page.dart @@ -2,7 +2,6 @@ import 'package:chat/configs/app_colors.dart'; import 'package:chat/controllers/private_controller.dart'; import 'package:chat/routes/contact_routes.dart'; import 'package:chat/routes/conversation_routes.dart'; -import 'package:chat/routes/moments_routes.dart'; import 'package:chat/services/tim/conversation_service.dart'; import 'package:chat/utils/im_tools.dart'; import 'package:chat/views/home/widgets/action_button.dart'; @@ -11,8 +10,8 @@ import 'package:chat/widgets/custom_avatar.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class ImFriendProfilePage extends StatelessWidget { - const ImFriendProfilePage({Key? key}) : super(key: key); +class ContactFriendProfilePage extends StatelessWidget { + const ContactFriendProfilePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -76,18 +75,18 @@ class ImFriendProfilePage extends StatelessWidget { ); }, ), - const SizedBox(height: 8), - ActionItem( - '他的动态', - onTap: () { - Get.toNamed( - MomentsRoutes.user, - arguments: { - 'userId': _.currentFriend.value.userID, - }, - ); - }, - ), + // const SizedBox(height: 8), + // ActionItem( + // '他的动态', + // onTap: () { + // Get.toNamed( + // MomentsRoutes.user, + // arguments: { + // 'userId': _.currentFriend.value.userID, + // }, + // ); + // }, + // ), const SizedBox(height: 8), Visibility( visible: !_.currentFriend.value.isFriend, diff --git a/lib/views/contact/firend/profile/more_page.dart b/lib/views/contact/firend/profile/more_page.dart index d63d5dc..72ac7a2 100644 --- a/lib/views/contact/firend/profile/more_page.dart +++ b/lib/views/contact/firend/profile/more_page.dart @@ -1,6 +1,7 @@ import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:chat/controllers/private_controller.dart'; import 'package:chat/routes/contact_routes.dart'; +import 'package:chat/services/tim/block_service.dart'; import 'package:chat/services/tim/friend_service.dart'; import 'package:chat/utils/ui_tools.dart'; import 'package:chat/views/home/widgets/action_button.dart'; @@ -8,8 +9,8 @@ import 'package:chat/views/home/widgets/action_item.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class ImFriendProfileMorePage extends StatelessWidget { - const ImFriendProfileMorePage({Key? key}) : super(key: key); +class ContactFriendProfileMorePage extends StatelessWidget { + const ContactFriendProfileMorePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/contact/firend/recommend/friends_page.dart b/lib/views/contact/firend/recommend/friend_page.dart similarity index 95% rename from lib/views/contact/firend/recommend/friends_page.dart rename to lib/views/contact/firend/recommend/friend_page.dart index 1d6c0f8..ae8ac42 100644 --- a/lib/views/contact/firend/recommend/friends_page.dart +++ b/lib/views/contact/firend/recommend/friend_page.dart @@ -5,6 +5,7 @@ import 'package:chat/controllers/private_controller.dart'; import 'package:chat/models/im/contact_info_model.dart'; import 'package:chat/models/im/name_card_model.dart'; import 'package:chat/models/im/private_conversation_model.dart'; +import 'package:chat/routes/contact_routes.dart'; import 'package:chat/services/tim/conversation_service.dart'; import 'package:chat/services/tim/friend_service.dart'; import 'package:chat/utils/im_tools.dart'; @@ -14,8 +15,8 @@ import 'package:get/get.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_conversation.dart'; -class ImFriendRecommendFriendsPage extends StatelessWidget { - const ImFriendRecommendFriendsPage({Key? key}) : super(key: key); +class ContactFriendRecommendFriendPage extends StatelessWidget { + const ContactFriendRecommendFriendPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -65,7 +66,7 @@ class ImFriendRecommendFriendsPage extends StatelessWidget { InkWell( onTap: () { FocusScope.of(Get.context!).requestFocus(FocusNode()); - // Get.offNamed(ImRoutes.friendRecommendGroups); + Get.offNamed(ContactRoutes.friendRecommendGroup); }, child: Container( decoration: const BoxDecoration( diff --git a/lib/views/contact/firend/recommend/groups_page.dart b/lib/views/contact/firend/recommend/group_page.dart similarity index 97% rename from lib/views/contact/firend/recommend/groups_page.dart rename to lib/views/contact/firend/recommend/group_page.dart index 64656b9..268dca1 100644 --- a/lib/views/contact/firend/recommend/groups_page.dart +++ b/lib/views/contact/firend/recommend/group_page.dart @@ -11,8 +11,8 @@ import 'package:get/get.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_conversation.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_group_info.dart'; -class ImFriendRecommendGroupsPage extends StatelessWidget { - const ImFriendRecommendGroupsPage({Key? key}) : super(key: key); +class ContactFriendRecommendGroupPage extends StatelessWidget { + const ContactFriendRecommendGroupPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/contact/firend/recommend/index_page.dart b/lib/views/contact/firend/recommend/index_page.dart index 6759a7b..1484e57 100644 --- a/lib/views/contact/firend/recommend/index_page.dart +++ b/lib/views/contact/firend/recommend/index_page.dart @@ -4,6 +4,7 @@ import 'package:chat/configs/app_size.dart'; import 'package:chat/controllers/private_controller.dart'; import 'package:chat/models/im/name_card_model.dart'; import 'package:chat/models/im/private_conversation_model.dart'; +import 'package:chat/routes/contact_routes.dart'; import 'package:chat/services/tim/conversation_service.dart'; import 'package:chat/views/home/widgets/group_avatar.dart'; import 'package:chat/widgets/custom_avatar.dart'; @@ -12,8 +13,8 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tencent_im_sdk_plugin/enum/conversation_type.dart'; -class ImFriendRecommendPage extends StatelessWidget { - const ImFriendRecommendPage({Key? key}) : super(key: key); +class ContactFriendRecommendPage extends StatelessWidget { + const ContactFriendRecommendPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -68,7 +69,7 @@ class ImFriendRecommendPage extends StatelessWidget { InkWell( onTap: () { FocusScope.of(Get.context!).requestFocus(FocusNode()); - // Get.offNamed(ImRoutes.friendRecommendFriends); + Get.offNamed(ContactRoutes.friendRecommendFriend); }, child: Container( decoration: const BoxDecoration( diff --git a/lib/views/contact/firend/remark/index_page.dart b/lib/views/contact/firend/remark/index_page.dart index dc5ee8f..9223920 100644 --- a/lib/views/contact/firend/remark/index_page.dart +++ b/lib/views/contact/firend/remark/index_page.dart @@ -3,14 +3,15 @@ import 'package:chat/controllers/private_controller.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class ImFriendRemarkPage extends StatefulWidget { - const ImFriendRemarkPage({Key? key}) : super(key: key); +class ContactFriendRemarkPage extends StatefulWidget { + const ContactFriendRemarkPage({Key? key}) : super(key: key); @override - State createState() => _ImFriendRemarkPageState(); + State createState() => + _ContactFriendRemarkPageState(); } -class _ImFriendRemarkPageState extends State { +class _ContactFriendRemarkPageState extends State { final TextEditingController _controller = TextEditingController(); @override diff --git a/lib/views/contact/firend/request/apply_page.dart b/lib/views/contact/firend/request/apply_page.dart index d4ad553..9c15647 100644 --- a/lib/views/contact/firend/request/apply_page.dart +++ b/lib/views/contact/firend/request/apply_page.dart @@ -5,15 +5,16 @@ import 'package:chat/widgets/custom_primary_button.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class ImFriendRequestApplyPage extends StatefulWidget { - const ImFriendRequestApplyPage({Key? key}) : super(key: key); +class ContactFriendRequestApplyPage extends StatefulWidget { + const ContactFriendRequestApplyPage({Key? key}) : super(key: key); @override - State createState() => - _ImFriendRequestApplyPageState(); + State createState() => + _ContactFriendRequestApplyPageState(); } -class _ImFriendRequestApplyPageState extends State { +class _ContactFriendRequestApplyPageState + extends State { late final String userID; String _remark = ''; String _wording = ''; diff --git a/lib/views/contact/firend/request/index_page.dart b/lib/views/contact/firend/request/index_page.dart index 31cf6ba..d9e9586 100644 --- a/lib/views/contact/firend/request/index_page.dart +++ b/lib/views/contact/firend/request/index_page.dart @@ -11,14 +11,14 @@ import 'package:tencent_im_sdk_plugin/enum/friend_type.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_friend_application.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_friend_check_result.dart'; -class ImFriendRequestPage extends StatefulWidget { - const ImFriendRequestPage({Key? key}) : super(key: key); +class ContactFriendRequestPage extends StatefulWidget { + const ContactFriendRequestPage({Key? key}) : super(key: key); @override - State createState() => _ImFriendRequestState(); + State createState() => _ImFriendRequestState(); } -class _ImFriendRequestState extends State { +class _ImFriendRequestState extends State { List? searchList; @override diff --git a/lib/views/contact/firend/search/index_page.dart b/lib/views/contact/firend/search/index_page.dart index e3a32c6..7c18a11 100644 --- a/lib/views/contact/firend/search/index_page.dart +++ b/lib/views/contact/firend/search/index_page.dart @@ -1,14 +1,15 @@ import 'package:chat/configs/app_colors.dart'; import 'package:flutter/material.dart'; -class ImFriendSearchPage extends StatefulWidget { - const ImFriendSearchPage({Key? key}) : super(key: key); +class ContactFriendSearchPage extends StatefulWidget { + const ContactFriendSearchPage({Key? key}) : super(key: key); @override - State createState() => _ImFriendSearchPageState(); + State createState() => + _ContactFriendSearchPageState(); } -class _ImFriendSearchPageState extends State { +class _ContactFriendSearchPageState extends State { @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/views/contact/group/create/index_page.dart b/lib/views/contact/group/create/index_page.dart index 3e1bdaa..5d5b9f7 100644 --- a/lib/views/contact/group/create/index_page.dart +++ b/lib/views/contact/group/create/index_page.dart @@ -1,15 +1,174 @@ +import 'package:chat/configs/app_colors.dart'; +import 'package:chat/routes/conversation_routes.dart'; +import 'package:chat/services/tim/conversation_service.dart'; +import 'package:chat/services/tim/friend_service.dart'; +import 'package:chat/services/tim/group_service.dart'; +import 'package:chat/views/home/widgets/friend_selector.dart'; +import 'package:chat/widgets/custom_avatar.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tencent_im_sdk_plugin/enum/group_type.dart'; +import 'package:tencent_im_sdk_plugin/models/v2_tim_friend_info.dart'; class ContactGroupCreatePage extends StatefulWidget { const ContactGroupCreatePage({Key? key}) : super(key: key); @override - _ContactGroupCreatePageState createState() => _ContactGroupCreatePageState(); + State createState() => _ContactGroupCreatePageState(); } class _ContactGroupCreatePageState extends State { + final ScrollController _scrollController = ScrollController(); + + /// 选中的好友列表 + List _selectList = + List.empty(growable: true); + + @override + void initState() { + super.initState(); + TimFriendService.to.fetchList(); + } + @override Widget build(BuildContext context) { - return Container(); + return Scaffold( + appBar: AppBar( + title: const Text( + '发起群聊', + ), + ), + body: SafeArea( + top: false, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: Colors.white, + height: 58, + padding: const EdgeInsets.all( + 4, + ), + child: ListView.builder( + controller: _scrollController, + scrollDirection: Axis.horizontal, + itemCount: _selectList.length, + itemBuilder: (context, index) { + return Container( + width: 50, + height: 50, + padding: const EdgeInsets.all(4), + child: GestureDetector( + onTap: () { + setState(() { + _selectList.removeAt(index); + }); + }, + child: CustomAvatar( + _selectList[index].userProfile!.faceUrl, + size: 42, + ), + ), + ); + }, + ), + ), + const Divider(height: 0), + Container( + color: AppColors.unactive.withOpacity(0.1), + alignment: Alignment.centerLeft, + padding: const EdgeInsets.only( + left: 16, + ), + height: 40, + width: double.infinity, + child: const Text( + '选择群成员', + style: TextStyle( + fontSize: 14, + ), + ), + ), + Expanded( + child: FriendSelector( + onChanged: onChanged, + ), + ), + Container( + padding: const EdgeInsets.only( + right: 16, + left: 16, + top: 4, + ), + decoration: const BoxDecoration( + color: Colors.white, + border: Border( + top: BorderSide( + color: Colors.black12, + width: 0.4, + ), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '已选 ${_selectList.length}', + style: const TextStyle( + color: Colors.grey, + ), + ), + ElevatedButton( + onPressed: + _selectList.isNotEmpty && _selectList.length < 200 + ? _createGroup + : null, + child: const Text( + '完成', + ), + ) + ], + ), + ), + ], + ), + ), + ); + } + + /// 好友选择,添加到选择列表 + Future onChanged(e) async { + setState(() { + _selectList = e; + + Future.delayed(const Duration(milliseconds: 200), () { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + duration: const Duration(milliseconds: 200), + curve: Curves.bounceIn, + ); + }); + }); + } + + /// 创建群聊 + Future _createGroup() async { + String groupName = '创建的群聊'; + var result = await TimGroupService.to.create( + groupName, + _selectList, + groupType: GroupType.Public, + ); + + if (result != null) { + Get.offNamed( + ConversationRoutes.index, + arguments: { + 'conversation': await TimConversationService.to.getById( + 'group_' + result, + ), + }, + ); + } } } diff --git a/lib/views/contact/group/create/user_page.dart b/lib/views/contact/group/create/user_page.dart new file mode 100644 index 0000000..2a87f5b --- /dev/null +++ b/lib/views/contact/group/create/user_page.dart @@ -0,0 +1,179 @@ +import 'package:chat/configs/app_colors.dart'; +import 'package:chat/routes/conversation_routes.dart'; +import 'package:chat/services/tim/conversation_service.dart'; +import 'package:chat/services/tim/friend_service.dart'; +import 'package:chat/services/tim/group_service.dart'; +import 'package:chat/views/home/widgets/friend_selector.dart'; +import 'package:chat/widgets/custom_avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tencent_im_sdk_plugin/enum/group_type.dart'; +import 'package:tencent_im_sdk_plugin/models/v2_tim_friend_info.dart'; + +class ContactGroupCreateUserPage extends StatefulWidget { + const ContactGroupCreateUserPage({Key? key}) : super(key: key); + + @override + State createState() => + _ContactGroupCreateUserPageState(); +} + +class _ContactGroupCreateUserPageState + extends State { + final ScrollController _scrollController = ScrollController(); + + late final String groupType; + + /// 选中的好友列表 + List _selectList = + List.empty(growable: true); + + @override + void initState() { + super.initState(); + groupType = Get.arguments['groupType']; + TimFriendService.to.fetchList(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text( + '发起群聊', + ), + ), + body: SafeArea( + top: false, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: Colors.white, + height: 58, + padding: const EdgeInsets.all( + 4, + ), + child: ListView.builder( + controller: _scrollController, + scrollDirection: Axis.horizontal, + itemCount: _selectList.length, + itemBuilder: (context, index) { + return Container( + width: 50, + height: 50, + padding: const EdgeInsets.all(4), + child: GestureDetector( + onTap: () { + setState(() { + _selectList.removeAt(index); + }); + }, + child: CustomAvatar( + _selectList[index].userProfile!.faceUrl, + size: 42, + ), + ), + ); + }, + ), + ), + const Divider(height: 0), + Container( + color: AppColors.unactive.withOpacity(0.1), + alignment: Alignment.centerLeft, + padding: const EdgeInsets.only( + left: 16, + ), + height: 40, + width: double.infinity, + child: const Text( + '选择群成员', + style: TextStyle( + fontSize: 14, + ), + ), + ), + Expanded( + child: FriendSelector( + onChanged: onChanged, + ), + ), + Container( + padding: const EdgeInsets.only( + right: 16, + left: 16, + top: 4, + ), + decoration: const BoxDecoration( + color: Colors.white, + border: Border( + top: BorderSide( + color: Colors.black12, + width: 0.4, + ), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '已选 ${_selectList.length}', + style: const TextStyle( + color: Colors.grey, + ), + ), + ElevatedButton( + onPressed: + _selectList.isNotEmpty && _selectList.length < 200 + ? _createGroup + : null, + child: const Text( + '完成', + ), + ) + ], + ), + ), + ], + ), + ), + ); + } + + /// 好友选择,添加到选择列表 + Future onChanged(e) async { + setState(() { + _selectList = e; + + Future.delayed(const Duration(milliseconds: 200), () { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + duration: const Duration(milliseconds: 200), + curve: Curves.bounceIn, + ); + }); + }); + } + + /// 创建群聊 + Future _createGroup() async { + String groupName = '创建的群聊'; + var result = await TimGroupService.to.create( + groupName, + _selectList, + groupType: GroupType.Public, + ); + + if (result != null) { + Get.offNamed( + ConversationRoutes.index, + arguments: { + 'conversation': await TimConversationService.to.getById( + 'group_' + result, + ), + }, + ); + } + } +} diff --git a/lib/views/public/app_page.dart b/lib/views/public/app_page.dart index 6a2df01..572c211 100644 --- a/lib/views/public/app_page.dart +++ b/lib/views/public/app_page.dart @@ -2,7 +2,6 @@ import 'package:chat/configs/app_colors.dart'; import 'package:chat/services/tabbar_service.dart'; import 'package:chat/views/contact/index/index_page.dart'; import 'package:chat/views/home/index_page.dart'; -import 'package:chat/views/moments/index/index_page.dart'; import 'package:chat/views/user/index/user_page.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -14,7 +13,7 @@ class AppPage extends StatelessWidget { final List _tabBarPageList = [ IndexedStackChild(child: const HomePage()), IndexedStackChild(child: const ContactPage()), - IndexedStackChild(child: const MomentsPage()), + // IndexedStackChild(child: const MomentsPage()), IndexedStackChild(child: const UserPage()), ]; @@ -29,11 +28,11 @@ class AppPage extends StatelessWidget { 'active_icon': Icons.contact_page, 'label': '通讯录', }, - { - 'icon': Icons.explore_outlined, - 'active_icon': Icons.explore, - 'label': '发现', - }, + // { + // 'icon': Icons.explore_outlined, + // 'active_icon': Icons.explore, + // 'label': '发现', + // }, { 'icon': Icons.person_outline, 'active_icon': Icons.person, diff --git a/lib/views/user/qr_code/index_page.dart b/lib/views/user/qr_code/index_page.dart index 5700022..120192d 100644 --- a/lib/views/user/qr_code/index_page.dart +++ b/lib/views/user/qr_code/index_page.dart @@ -1,15 +1,131 @@ +import 'package:chat/configs/app_colors.dart'; +import 'package:chat/views/home/widgets/pop_menu_item.dart'; +import 'package:chat/views/public/scan_page.dart'; +import 'package:chat/widgets/custom_avatar.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:qr_flutter/qr_flutter.dart'; class UserQrCodePage extends StatefulWidget { const UserQrCodePage({Key? key}) : super(key: key); @override - _UserQrCodePageState createState() => _UserQrCodePageState(); + State createState() => _UserQrCodePageState(); } class _UserQrCodePageState extends State { @override Widget build(BuildContext context) { - return Container(); + return Scaffold( + appBar: AppBar( + title: const Text('我的二维码'), + actions: [ + IconButton( + onPressed: () { + _showLongPressMenu(); + }, + icon: const Icon(Icons.more_horiz), + ), + ], + ), + body: Center( + child: Container( + width: Get.width - 32, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + CustomAvatar( + '', + size: 64, + radius: 6, + ), + const SizedBox(width: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + 'Jason', + style: TextStyle( + fontSize: 20, + ), + ), + SizedBox(height: 8), + ], + ), + ], + ), + const SizedBox(height: 32), + QrImage( + data: 'BEFRIEND|5', + version: 3, + size: Get.width * 0.8, + ), + const SizedBox(height: 32), + const Text( + '扫一扫上面的二维码,加我共力好友', + style: TextStyle( + color: AppColors.unactive, + ), + ), + ], + ), + ), + ), + ); + } + + Future _showLongPressMenu() async { + showModalBottomSheet( + context: Get.context!, + isScrollControlled: true, + backgroundColor: AppColors.white, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(8)), + ), + builder: (context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + PopMenuItem( + '保存到手机', + onTap: () {}, + ), + const Divider(height: 0), + PopMenuItem( + '扫描二维码', + onTap: () { + Get.back(); + Permission.camera.request().isGranted.then((value) { + if (value) { + Get.to(const ScanPage()); + } + }); + }, + ), + const Divider(height: 0), + const Divider(height: 0.4), + Container( + color: AppColors.page, + height: 8, + ), + const Divider(height: 0.4), + PopMenuItem( + '取消', + onTap: () { + Get.back(); + }, + ), + ], + ); + }, + ); } } diff --git a/lib/widgets/custom_avatar.dart b/lib/widgets/custom_avatar.dart index 5ee2f41..d145dec 100644 --- a/lib/widgets/custom_avatar.dart +++ b/lib/widgets/custom_avatar.dart @@ -17,7 +17,7 @@ class CustomAvatar extends StatelessWidget { @override Widget build(BuildContext context) { if (avtarUrl == null || avtarUrl == '') { - avtarUrl = 'assets/chats/default_avatar.png'; + avtarUrl = 'assets/images/default_avatar.png'; } avtarUrl = avtarUrl!.trim(); diff --git a/pubspec.lock b/pubspec.lock index e054fae..b3e8c94 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -542,14 +542,14 @@ packages: name: permission_handler url: "https://pub.flutter-io.cn" source: hosted - version: "10.2.0" + version: "9.2.0" permission_handler_android: dependency: transitive description: name: permission_handler_android url: "https://pub.flutter-io.cn" source: hosted - version: "10.2.0" + version: "9.0.2+1" permission_handler_apple: dependency: transitive description: @@ -572,12 +572,12 @@ packages: source: hosted version: "0.1.2" photo_manager: - dependency: transitive + dependency: "direct main" description: name: photo_manager url: "https://pub.flutter-io.cn" source: hosted - version: "2.4.1" + version: "2.2.1" photo_view: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 0169786..a918f2c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,9 +43,10 @@ dependencies: video_player: ^2.4.7 scroll_to_index: ^2.1.1 dart_date: ^1.1.1 - permission_handler: ^10.2.0 + permission_handler: ^9.2.0 tuple: ^2.0.1 photo_view: ^0.14.0 + photo_manager: 2.2.1 chewie: ^1.3.5 dev_dependencies: @@ -56,4 +57,5 @@ flutter: uses-material-design: true assets: - assets/icons/ + - assets/images/ - assets/transits/