From a71c77a04f5640d1f895a4a689443a41ad8627a6 Mon Sep 17 00:00:00 2001 From: htylight Date: Sun, 17 Mar 2024 20:49:51 +0800 Subject: [PATCH] move account setting to main settings list screen --- lib/components/common_widgets.dart | 21 ----- lib/models/websocket_model.dart | 8 +- .../friend_profile/friend_profile_screen.dart | 21 ++++- .../change_group_chat_avatar_screen.dart | 18 +---- .../components/group_chat_profile_tile.dart | 2 +- .../group_chat_profile_screen.dart | 80 ++++++++----------- .../more/setting_screen/setting_screen.dart | 26 +++++- .../change_account_screen.dart | 2 +- .../change_basic_screen.dart | 30 ++++--- lib/screens/my_profile/my_profile_screen.dart | 17 +++- 10 files changed, 118 insertions(+), 107 deletions(-) diff --git a/lib/components/common_widgets.dart b/lib/components/common_widgets.dart index a0fbaa5..c4ef1ad 100755 --- a/lib/components/common_widgets.dart +++ b/lib/components/common_widgets.dart @@ -226,27 +226,6 @@ class CommonTextField extends StatelessWidget { } } -// TextField textField({ -// Color color = kPrimaryColor, -// bool obscureText = false, -// required String labelText, -// required TextEditingController controller, -// }) { -// return TextField( -// controller: controller, -// obscureText: obscureText, -// cursorColor: kSecondaryColor, -// textAlignVertical: TextAlignVertical.bottom, -// decoration: InputDecoration( -// helperText: '5-10位', -// errorText: 'xxx', -// labelText: labelText, -// floatingLabelStyle: const TextStyle(color: kSecondaryColor), -// focusedBorder: -// UnderlineInputBorder(borderSide: BorderSide(color: color))), -// ); -// } - class CommonElevatedButton extends StatelessWidget { const CommonElevatedButton({ super.key, diff --git a/lib/models/websocket_model.dart b/lib/models/websocket_model.dart index 7d6d2f0..3815ad5 100644 --- a/lib/models/websocket_model.dart +++ b/lib/models/websocket_model.dart @@ -28,8 +28,8 @@ class WebSocketManager extends ChangeNotifier { Timer? reconnectTimer; int reconnectCount = 5; int reconnectTimes = 0; - Duration heartBeatTimeout = const Duration(seconds: 4); - Duration reconnectTimeout = const Duration(seconds: 3); + Duration heartBeatTimeout = const Duration(seconds: 30); + Duration reconnectTimeout = const Duration(seconds: 5); Map sendImageTimer = {}; void connect(String userId, bool isReconnect) { @@ -39,8 +39,8 @@ class WebSocketManager extends ChangeNotifier { socketStatus = SocketStatus.reconnecting; notifyListeners(); } - // This doesn't blcok the programe whethe it connect the server or not - // So heartBeat will be executre straightly + // This doesn't block the program whether it connect the server or not + // So heartBeat will be execute straightly channel = WebSocketChannel.connect(wsUrl); heartBeatInspect(); diff --git a/lib/screens/friend_profile/friend_profile_screen.dart b/lib/screens/friend_profile/friend_profile_screen.dart index 3d471a5..1b6a3f9 100755 --- a/lib/screens/friend_profile/friend_profile_screen.dart +++ b/lib/screens/friend_profile/friend_profile_screen.dart @@ -61,7 +61,7 @@ class _FriendProfileScreenState extends State { offset: isOpen ? const Offset(0, 4) : Offset.zero, duration: const Duration(milliseconds: 170), child: AnimatedOpacity( - opacity: isOpen ? 0: 1, + opacity: isOpen ? 0 : 1, duration: const Duration(milliseconds: 120), child: Text( valueV, @@ -107,13 +107,20 @@ class _FriendProfileScreenState extends State { physics: const AlwaysScrollableScrollPhysics(), slivers: [ SliverAppBar( - expandedHeight: 200, + expandedHeight: 240, floating: true, pinned: true, + stretch: true, backgroundColor: Colors.orange, flexibleSpace: FlexibleSpaceBar( - centerTitle: true, collapseMode: CollapseMode.pin, + centerTitle: true, + titlePadding: const EdgeInsets.only(left: 0, bottom: 15), + stretchModes: const [ + StretchMode.zoomBackground, + StretchMode.blurBackground, + StretchMode.fadeTitle, + ], title: Text(getIt .get() .friends[widget.friendId]! @@ -170,6 +177,10 @@ class _FriendProfileScreenState extends State { }, style: OutlinedButton.styleFrom( fixedSize: const Size(130, 45), + side: const BorderSide(color: kUnAvailableColor), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6.0), + ), ), child: const Text( '语音通话', @@ -182,6 +193,10 @@ class _FriendProfileScreenState extends State { }, style: OutlinedButton.styleFrom( fixedSize: const Size(100, 45), + side: const BorderSide(color: kUnAvailableColor), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6.0), + ), ), child: const Text( '设置', diff --git a/lib/screens/group_chat_profile/change_group_chat_screen/change_group_chat_avatar_screen.dart b/lib/screens/group_chat_profile/change_group_chat_screen/change_group_chat_avatar_screen.dart index 73e2657..be8eaed 100755 --- a/lib/screens/group_chat_profile/change_group_chat_screen/change_group_chat_avatar_screen.dart +++ b/lib/screens/group_chat_profile/change_group_chat_screen/change_group_chat_avatar_screen.dart @@ -13,10 +13,8 @@ import 'package:together_mobile/common/constants.dart'; import 'package:together_mobile/models/contact_model.dart'; import 'package:together_mobile/models/route_state_model.dart'; import 'package:together_mobile/request/group_chat.dart'; -import 'package:together_mobile/request/server.dart'; +import 'package:together_mobile/request/server.dart' show groupChatAvatarsUrl; import 'package:together_mobile/models/init_get_it.dart'; -import 'package:together_mobile/models/user_model.dart'; -import 'package:together_mobile/request/user_profile.dart'; class ChangeGroupChatAvatarScreen extends StatefulWidget { const ChangeGroupChatAvatarScreen({ @@ -69,20 +67,10 @@ class _ChangeGroupChatAvatarScreenState Container( margin: const EdgeInsets.fromLTRB(10, 20, 10, 40), child: _croppedImage == null - ? getIt - .get() - .groupChats[widget.groupChatId]! - .avatar - .isEmpty - ? const CircleAvatar( - radius: 100, - backgroundImage: - AssetImage('assets/images/Logo_light.png'), - ) - : CircleAvatar( + ? CircleAvatar( radius: 100, backgroundImage: CachedNetworkImageProvider( - '$userAvatarsUrl/${getIt.get().groupChats[widget.groupChatId]!.avatar}', + '$groupChatAvatarsUrl/${getIt.get().groupChats[widget.groupChatId]!.avatar}', )) : CircleAvatar( radius: 100, diff --git a/lib/screens/group_chat_profile/components/group_chat_profile_tile.dart b/lib/screens/group_chat_profile/components/group_chat_profile_tile.dart index 4e1c81c..ac48ebf 100755 --- a/lib/screens/group_chat_profile/components/group_chat_profile_tile.dart +++ b/lib/screens/group_chat_profile/components/group_chat_profile_tile.dart @@ -7,7 +7,7 @@ class GroupChatProfileTile extends StatelessWidget { super.key, required this.onTap, required this.title, - required this.info, + this.info = '', }); final String title; diff --git a/lib/screens/group_chat_profile/group_chat_profile_screen.dart b/lib/screens/group_chat_profile/group_chat_profile_screen.dart index e3d2ebe..feee335 100755 --- a/lib/screens/group_chat_profile/group_chat_profile_screen.dart +++ b/lib/screens/group_chat_profile/group_chat_profile_screen.dart @@ -1,5 +1,7 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:cherry_toast/cherry_toast.dart'; import 'package:flutter/material.dart'; +import 'package:get_it_mixin/get_it_mixin.dart'; import 'package:go_router/go_router.dart'; import 'package:hive_flutter/hive_flutter.dart'; @@ -10,10 +12,12 @@ import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/group_chat.dart'; import 'package:together_mobile/screens/group_chat_profile/components/group_chat_profile_header.dart'; +import '../../request/server.dart' show groupChatAvatarsUrl; import 'components/group_chat_profile_tile.dart'; -class GroupChatProfileScreen extends StatefulWidget { - const GroupChatProfileScreen({ +class GroupChatProfileScreen extends StatefulWidget + with GetItStatefulWidgetMixin { + GroupChatProfileScreen({ super.key, required this.groupChatId, }); @@ -24,20 +28,21 @@ class GroupChatProfileScreen extends StatefulWidget { State createState() => _GroupChatProfileScreenState(); } -class _GroupChatProfileScreenState extends State { +class _GroupChatProfileScreenState extends State + with GetItStateMixin { Future _getGroupChatFullProfile() async { Map res = await getGroupChatFullProfile(widget.groupChatId); - getIt.get().addGroupChatProfile( - widget.groupChatId, - res['groupChat'], - ); + get().addGroupChatProfile( + widget.groupChatId, + res['groupChat'], + ); - getIt.get().refreshGroupChatMemberProfile( - widget.groupChatId, - res['memberNameAvatar'], - ); + get().refreshGroupChatMemberProfile( + widget.groupChatId, + res['memberNameAvatar'], + ); return Future(() => true); } @@ -75,30 +80,25 @@ class _GroupChatProfileScreenState extends State { SliverToBoxAdapter( child: ListTile( onTap: () { - // context.pushNamed( - // 'GroupChatOutline', - // queryParameters: {'groupChatId': widget.groupChatId}, - // ); context.pushNamed( 'ChangeGroupChatAvatar', queryParameters: {'groupChatId': widget.groupChatId}, ); }, - leading: const CircleAvatar( - backgroundImage: AssetImage('assets/images/Logo_light.png'), + leading: CircleAvatar( + backgroundImage: CachedNetworkImageProvider( + '$groupChatAvatarsUrl/${get().groupChats[widget.groupChatId]!.avatar}', + ), ), title: Text( - getIt - .get() + get() .groupChats[widget.groupChatId]! .groupChatRemark .isEmpty - ? getIt - .get() + ? get() .groupChats[widget.groupChatId]! .name - : getIt - .get() + : get() .groupChats[widget.groupChatId]! .groupChatRemark, style: const TextStyle(fontSize: 18), @@ -117,14 +117,13 @@ class _GroupChatProfileScreenState extends State { onTap: () {}, title: '群聊成员', info: - '共 ${getIt.get().groupChats[widget.groupChatId]!.members.length} 人', + '共 ${get().groupChats[widget.groupChatId]!.members.length} 人', ), GroupChatProfileTile( onTap: () { final query = { 'groupChatId': widget.groupChatId, - 'name': getIt - .get() + 'name': get() .groupChats[widget.groupChatId]! .name, }; @@ -134,8 +133,7 @@ class _GroupChatProfileScreenState extends State { ); }, title: '群聊名称', - info: getIt - .get() + info: get() .groupChats[widget.groupChatId]! .name, ), @@ -143,8 +141,7 @@ class _GroupChatProfileScreenState extends State { onTap: () { final query = { 'groupChatId': widget.groupChatId, - 'intro': getIt - .get() + 'intro': get() .groupChats[widget.groupChatId]! .introduction, }; @@ -154,16 +151,14 @@ class _GroupChatProfileScreenState extends State { ); }, title: '群聊简介', - info: getIt - .get() + info: get() .groupChats[widget.groupChatId]! .introduction, ), GroupChatProfileTile( onTap: () {}, title: '群聊标签', - info: getIt - .get() + info: get() .groupChats[widget.groupChatId]! .tags .join('|'), @@ -215,8 +210,7 @@ class _GroupChatProfileScreenState extends State { onTap: () { final query = { 'groupChatId': widget.groupChatId, - 'remarkInGroupChat': getIt - .get() + 'remarkInGroupChat': get() .groupChats[widget.groupChatId]! .remarkInGroupChat, }; @@ -226,8 +220,7 @@ class _GroupChatProfileScreenState extends State { ); }, title: '我的群聊昵称', - info: getIt - .get() + info: get() .groupChats[widget.groupChatId]! .remarkInGroupChat, ), @@ -235,8 +228,7 @@ class _GroupChatProfileScreenState extends State { onTap: () { final query = { 'groupChatId': widget.groupChatId, - 'groupChatRemark': getIt - .get() + 'groupChatRemark': get() .groupChats[widget.groupChatId]! .groupChatRemark, }; @@ -246,8 +238,7 @@ class _GroupChatProfileScreenState extends State { ); }, title: '我的群聊备注', - info: getIt - .get() + info: get() .groupChats[widget.groupChatId]! .groupChatRemark, ), @@ -264,9 +255,8 @@ class _GroupChatProfileScreenState extends State { title: '删除聊天记录', info: '', ), - getIt.get().id == - getIt - .get() + get().id == + get() .groupChats[widget.groupChatId]! .supervisor ? SliverToBoxAdapter( diff --git a/lib/screens/more/setting_screen/setting_screen.dart b/lib/screens/more/setting_screen/setting_screen.dart index 0c59f69..bf680c4 100644 --- a/lib/screens/more/setting_screen/setting_screen.dart +++ b/lib/screens/more/setting_screen/setting_screen.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive_flutter/hive_flutter.dart'; +import 'package:together_mobile/common/constants.dart'; import 'package:together_mobile/database/hive_database.dart'; import 'package:together_mobile/models/apply_list_model.dart'; @@ -13,6 +13,9 @@ import 'package:together_mobile/models/token_model.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/models/websocket_model.dart'; +import '../../group_chat_profile/components/group_chat_profile_header.dart'; +import '../../group_chat_profile/components/group_chat_profile_tile.dart'; + class SettingScreen extends StatelessWidget { const SettingScreen({super.key}); @@ -29,8 +32,19 @@ class SettingScreen extends StatelessWidget { title: const Text('设置'), ), body: CustomScrollView( + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics(), + ), slivers: [ - // SliverList(delegate: delegate), + const GroupChatProfileHeader( + header: '账号安全', + ), + GroupChatProfileTile( + onTap: () { + context.pushNamed('ChangeAccount'); + }, + title: '账号设置', + ), SliverToBoxAdapter( child: TextButton( onPressed: () async { @@ -52,7 +66,13 @@ class SettingScreen extends StatelessWidget { }, ); }, - child: const Text('退出登陆'), + style: TextButton.styleFrom( + foregroundColor: kErrorColor, + ), + child: const Text( + '退出登录', + style: TextStyle(fontSize: 18), + ), ), ), ], diff --git a/lib/screens/my_profile/change_profile_screen/change_account_screen.dart b/lib/screens/my_profile/change_profile_screen/change_account_screen.dart index d3f85b0..aa14040 100644 --- a/lib/screens/my_profile/change_profile_screen/change_account_screen.dart +++ b/lib/screens/my_profile/change_profile_screen/change_account_screen.dart @@ -63,7 +63,7 @@ class _ChangeAccountScreenState extends State { return Scaffold( appBar: AppBar( centerTitle: true, - title: const Text('更改账号资料'), + title: const Text('账号设置'), ), body: SingleChildScrollView( child: ExpansionPanelList( diff --git a/lib/screens/my_profile/change_profile_screen/change_basic_screen.dart b/lib/screens/my_profile/change_profile_screen/change_basic_screen.dart index 2c595fb..569e605 100644 --- a/lib/screens/my_profile/change_profile_screen/change_basic_screen.dart +++ b/lib/screens/my_profile/change_profile_screen/change_basic_screen.dart @@ -1,4 +1,6 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:cherry_toast/cherry_toast.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_pickers/pickers.dart'; import 'package:flutter_pickers/time_picker/model/pduration.dart'; @@ -8,6 +10,8 @@ import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/user_profile.dart'; +import '../../../request/server.dart' show userAvatarsUrl; + class ChangeBasicScreen extends StatefulWidget { const ChangeBasicScreen({super.key}); @@ -58,7 +62,6 @@ class _ChangeBasicScreenState extends State { Widget build(BuildContext context) { final keys = userProfile.keys.toList(); keys.insert(0, '头像'); - keys.insert(0, '账号'); return Scaffold( appBar: AppBar( @@ -72,14 +75,10 @@ class _ChangeBasicScreenState extends State { itemCount: keys.length, itemBuilder: (context, index) { String key = keys[index]; - if (key == '账号' || key == '头像') { + if (key == '头像') { return InkWell( onTap: () { - if (key == '账号') { - context.pushNamed('ChangeAccount'); - } else { - context.pushNamed('ChangeMyAvatar'); - } + context.pushNamed('ChangeMyAvatar'); }, child: Padding( padding: const EdgeInsets.all(10.0), @@ -90,10 +89,19 @@ class _ChangeBasicScreenState extends State { '$key设置', style: const TextStyle(fontSize: 18), ), - const Icon( - Icons.keyboard_arrow_right_outlined, - size: 30, - ), + Row( + children: [ + CachedNetworkImage( + height: 65, + imageUrl: + '$userAvatarsUrl/${getIt.get().avatar}', + ), + const Icon( + Icons.keyboard_arrow_right_outlined, + size: 30, + ), + ], + ) ], ), ), diff --git a/lib/screens/my_profile/my_profile_screen.dart b/lib/screens/my_profile/my_profile_screen.dart index 8fda71a..4f6585f 100755 --- a/lib/screens/my_profile/my_profile_screen.dart +++ b/lib/screens/my_profile/my_profile_screen.dart @@ -57,7 +57,7 @@ class _MyProfileScreenState extends State { offset: isOpen ? const Offset(0, 4) : Offset.zero, duration: const Duration(milliseconds: 170), child: AnimatedOpacity( - opacity: isOpen ? 0: 1, + opacity: isOpen ? 0 : 1, duration: const Duration(milliseconds: 120), child: Text( valueV, @@ -103,14 +103,21 @@ class _MyProfileScreenState extends State { physics: const AlwaysScrollableScrollPhysics(), slivers: [ SliverAppBar( - expandedHeight: 200, + expandedHeight: 240, floating: true, pinned: true, + stretch: true, backgroundColor: Colors.orange, flexibleSpace: FlexibleSpaceBar( + title: Text(getIt.get().nickname), + titlePadding: const EdgeInsets.only(left: 0, bottom: 15), centerTitle: true, collapseMode: CollapseMode.pin, - title: Text(getIt.get().nickname), + stretchModes: const [ + StretchMode.zoomBackground, + StretchMode.blurBackground, + StretchMode.fadeTitle, + ], background: Center( child: Material( elevation: 10.0, @@ -156,6 +163,10 @@ class _MyProfileScreenState extends State { }, style: OutlinedButton.styleFrom( fixedSize: const Size(150, 45), + side: const BorderSide(color: kUnAvailableColor), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6.0), + ), ), child: const Text( '编辑资料',