diff --git a/lib/models/contact_model.dart b/lib/models/contact_model.dart index 8a973a9..b68101c 100644 --- a/lib/models/contact_model.dart +++ b/lib/models/contact_model.dart @@ -4,7 +4,7 @@ class FriendSetting { String friendRemark = ''; String friendGroup = ''; - FriendSetting.fromJson(Map json) { + FriendSetting.fromJson(Map json) { friendRemark = json['friendRemark'] ?? ''; friendGroup = json['friendGroup'] ?? '我的好友'; } @@ -36,9 +36,10 @@ class Contact extends ChangeNotifier { // groupChats[key] = GroupChatSetting.fromJson(value); // }); - for (String i in json['friendGroups']) { - friendGroups.add(i); - } + // for (String i in json['friendGroups']) { + // friendGroups.add(i); + // } + friendGroups = List.from(json['friendGroups']); } Map filterGroupFriends(String groupName) { @@ -51,6 +52,11 @@ class Contact extends ChangeNotifier { return groupFriends; } + void addFriend(String friendId, Map friendSetting) { + friends[friendId] = FriendSetting.fromJson(friendSetting); + notifyListeners(); + } + void changeFriendRemark(String friendId, String remark) { friends[friendId]!.friendRemark = remark; } @@ -59,23 +65,9 @@ class Contact extends ChangeNotifier { friends[friendId]!.friendGroup = group; } - void manageGroup( - List newGroups, - List> groupNameChangePair, - String newDefaultGroup, - ) { - defaultGroup = newDefaultGroup; - friendGroups = newGroups; - for (var pair in groupNameChangePair) { - if (pair[1].isEmpty) { - continue; - } - friends.forEach((key, value) { - if (value.friendGroup == pair[0]) { - friends[key]!.friendGroup = pair[1]; - } - }); - } + void removeFriend(String friendId) { + friends.remove(friendId); + notifyListeners(); } } @@ -113,4 +105,23 @@ class ContactAccountProfile extends ChangeNotifier { friends[key] = FriendAccountProfile.fromJson(value); }); } + + (bool, String) getIdBy(String condition, String filterValue) { + String friendId = ''; + switch (condition) { + case 'username': + for (var key in friends.keys) { + if (friends[key]!.username == filterValue) { + friendId = key; + break; + } + } + break; + } + return friendId.isNotEmpty ? (true, friendId) : (false, ''); + } + + void removeFriend(String friendId) { + friends.remove(friendId); + } } diff --git a/lib/request/contact.dart b/lib/request/contact.dart index 49aee26..8172a58 100644 --- a/lib/request/contact.dart +++ b/lib/request/contact.dart @@ -62,6 +62,7 @@ Future> manageGroups( String userId, List groups, List> groupNameChangePair, + List deletedOriginGroups, String defaultGroup, ) async { Response response = await request.post( @@ -70,9 +71,25 @@ Future> manageGroups( 'user_id': userId, 'groups': groups, 'group_name_change_pair': groupNameChangePair, + 'deleted_origin_groups': deletedOriginGroups, 'default_group': defaultGroup, }, ); return response.data; } + +Future> deleteFriend( + String userId, + String friendId, +) async { + Response response = await request.post( + '/contact/delete/friend', + data: { + 'user_id': userId, + 'friend_id': friendId, + }, + ); + + return response.data; +} diff --git a/lib/router/chat_router.dart b/lib/router/chat_router.dart index 0927d88..9f770aa 100644 --- a/lib/router/chat_router.dart +++ b/lib/router/chat_router.dart @@ -5,7 +5,7 @@ import 'package:together_mobile/screens/message/message_screen.dart'; final chatRouter = GoRoute( path: '/chat', name: 'Chat', - builder: (context, state) => const ChatScreen(), + builder: (context, state) => ChatScreen(), routes: [ GoRoute( path: 'message', diff --git a/lib/router/contact_router.dart b/lib/router/contact_router.dart index e4732a3..10cdca6 100644 --- a/lib/router/contact_router.dart +++ b/lib/router/contact_router.dart @@ -1,13 +1,15 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:together_mobile/models/contact_model.dart'; +import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/screens/contact/contact_apply_screen/applicant_profile_screen/applicant_profile_screen.dart'; import 'package:together_mobile/screens/friend_profile/friend_setting_screen/friend_setting_screen.dart'; import 'router_key.dart'; import 'package:together_mobile/screens/contact/contact_apply_screen/apply_list_screen.dart'; import 'package:together_mobile/screens/contact/contact_screen.dart'; -import 'package:together_mobile/screens/contact/friend_group_screen/friend_group_screen.dart'; +import 'package:together_mobile/screens/contact/manage_group_screen/manage_group_screen.dart'; import 'package:together_mobile/screens/contact_add/contact_add_friend_screen/add_friend_screen.dart'; import 'package:together_mobile/screens/contact_add/search_new_screen.dart'; import 'package:together_mobile/screens/friend_profile/friend_profile_screen.dart'; @@ -16,7 +18,14 @@ import 'package:together_mobile/screens/group_chat_profile/group_chat_profile_sc final contactRouter = GoRoute( path: '/contact', name: 'Contact', - builder: (context, state) => const ContactScreen(), + builder: (context, state) { + if (state.queryParameters.isNotEmpty) { + var deletedFriendId = state.queryParameters['deletedFriendId']; + getIt.get().removeFriend(deletedFriendId!); + getIt.get().removeFriend(deletedFriendId); + } + return ContactScreen(); + }, routes: [ GoRoute( path: 'add', @@ -92,7 +101,9 @@ final contactRouter = GoRoute( path: 'friend_setting', name: 'FriendSetting', parentNavigatorKey: rootNavigatorKey, - builder: (context, state) => FriendSettingScreen(friendId: state.queryParameters['friendId']!,), + builder: (context, state) => FriendSettingScreen( + friendId: state.queryParameters['friendId']!, + ), ), ], ), diff --git a/lib/screens/chat/chat_screen.dart b/lib/screens/chat/chat_screen.dart index d732e2f..496a65e 100755 --- a/lib/screens/chat/chat_screen.dart +++ b/lib/screens/chat/chat_screen.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; + import 'package:cached_network_image/cached_network_image.dart'; -import 'package:together_mobile/models/contact_model.dart'; import 'components/chat_tile.dart'; +import 'package:together_mobile/models/contact_model.dart'; import 'package:together_mobile/models/apply_list_model.dart'; import 'package:together_mobile/request/apply.dart'; import 'package:together_mobile/request/server.dart'; diff --git a/lib/screens/contact/components/friend_group.dart b/lib/screens/contact/components/friend_group.dart index 439d203..ee74c87 100755 --- a/lib/screens/contact/components/friend_group.dart +++ b/lib/screens/contact/components/friend_group.dart @@ -18,29 +18,30 @@ class FriendGroup extends StatefulWidget { } class _FriendGroupState extends State { - late Map _groupFriends; - late List _friendTiles; - - @override - void initState() { - super.initState(); - _groupFriends = getIt.get().filterGroupFriends(widget.groupName); - _friendTiles = List.generate( - _groupFriends.length, - (index) => FriendTile( - key: ValueKey( - getIt.get().friends.keys.toList()[index], - ), - friendId: _groupFriends.keys.toList()[index]), - ); - } - @override Widget build(BuildContext context) { return ExpansionTile( title: Text(widget.groupName), - trailing: Text(_friendTiles.length.toString()), - children: _friendTiles, + trailing: Text( + getIt + .get() + .filterGroupFriends(widget.groupName) + .length + .toString(), + ), + children: List.generate( + getIt.get().filterGroupFriends(widget.groupName).length, + (index) => FriendTile( + key: ValueKey( + getIt.get().friends.keys.toList()[index], + ), + friendId: getIt + .get() + .filterGroupFriends(widget.groupName) + .keys + .toList()[index], + ), + ), ); } } diff --git a/lib/screens/contact/contact_apply_screen/applicant_profile_screen/applicant_profile_screen.dart b/lib/screens/contact/contact_apply_screen/applicant_profile_screen/applicant_profile_screen.dart index e6a4ed5..ba841f1 100755 --- a/lib/screens/contact/contact_apply_screen/applicant_profile_screen/applicant_profile_screen.dart +++ b/lib/screens/contact/contact_apply_screen/applicant_profile_screen/applicant_profile_screen.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; @@ -6,8 +5,6 @@ import 'package:flutter/material.dart'; import 'package:together_mobile/common/constants.dart'; import 'package:together_mobile/request/server.dart'; import 'package:together_mobile/screens/friend_profile/components/friend_profile_card.dart'; -import 'package:together_mobile/models/init_get_it.dart'; -import 'package:together_mobile/models/user_model.dart'; class ApplicantProfileScreen extends StatelessWidget { const ApplicantProfileScreen({ diff --git a/lib/screens/contact/contact_apply_screen/components/apply_bottom_sheet.dart b/lib/screens/contact/contact_apply_screen/components/apply_bottom_sheet.dart index 7acdf1a..9260c77 100755 --- a/lib/screens/contact/contact_apply_screen/components/apply_bottom_sheet.dart +++ b/lib/screens/contact/contact_apply_screen/components/apply_bottom_sheet.dart @@ -7,13 +7,12 @@ import 'package:go_router/go_router.dart'; import 'package:together_mobile/common/constants.dart'; import 'package:together_mobile/models/apply_list_model.dart'; +import 'package:together_mobile/models/contact_model.dart'; import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/apply.dart'; import 'package:together_mobile/request/server.dart'; -const List friendGroup = ['我的好友', '同学', '同事', '朋友', '家人']; - class ApplyBottomSheet extends StatefulWidget { const ApplyBottomSheet({ super.key, @@ -33,7 +32,7 @@ class ApplyBottomSheet extends StatefulWidget { } class _ApplyBottomSheetState extends State { - String _curValue = friendGroup.first; + String _curValue = getIt.get().friendGroups.first; final _remarkController = TextEditingController(); @override @@ -163,7 +162,10 @@ class _ApplyBottomSheetState extends State { _curValue = value!; }); }, - items: friendGroup.map>((String value) { + items: getIt + .get() + .friendGroups + .map>((String value) { return DropdownMenuItem( value: value, child: Text(value), @@ -212,12 +214,24 @@ class _ApplyBottomSheetState extends State { if (res['code'] == 10600) { // ignore: use_build_context_synchronously - CherryToast.success(title: const Text('添加好友成功')).show(context); + CherryToast.success( + title: const Text( + '添加好友成功', + style: TextStyle( + color: kContentColorLight, + ), + )).show(context); getIt.get().removeAt(widget.index); widget.refreshCallback(); + getIt.get().addFriend(widget.apply.applicant!, recipientSetting); } else { // ignore: use_build_context_synchronously - CherryToast.error(title: const Text('添加失败,稍后重试')).show(context); + CherryToast.error( + title: const Text( + '添加失败,稍后重试', + style: TextStyle(color: kContentColorLight), + ), + ).show(context); } } } diff --git a/lib/screens/contact/contact_screen.dart b/lib/screens/contact/contact_screen.dart index 6530d29..9a6f817 100755 --- a/lib/screens/contact/contact_screen.dart +++ b/lib/screens/contact/contact_screen.dart @@ -1,27 +1,27 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; + import 'package:go_router/go_router.dart'; import 'package:badges/badges.dart' as badges; -import 'package:visibility_detector/visibility_detector.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:get_it_mixin/get_it_mixin.dart'; import 'package:together_mobile/common/constants.dart'; import 'package:together_mobile/models/apply_list_model.dart'; import 'package:together_mobile/models/contact_model.dart'; -import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/server.dart'; import 'package:together_mobile/screens/contact/components/friend_group.dart'; import 'package:together_mobile/screens/contact/components/friend_tile.dart'; import 'package:together_mobile/screens/contact/components/group_chat_tile.dart'; -class ContactScreen extends StatefulWidget { - const ContactScreen({super.key}); +class ContactScreen extends StatefulWidget with GetItStatefulWidgetMixin { + ContactScreen({super.key}); @override State createState() => _ContactScreenState(); } -class _ContactScreenState extends State { +class _ContactScreenState extends State with GetItStateMixin { final Map _shows = { 'friendGroups': true, 'allFriends': false, @@ -30,6 +30,13 @@ class _ContactScreenState extends State { @override Widget build(BuildContext context) { + Map friends = watchOnly( + (Contact contact) => contact.friends, + ); + List friendGroups = watchOnly( + (Contact contact) => contact.friendGroups, + ); + // Create a localkey, use to generate the custom scroll view, // or there will be a error: "Duplicate GlobalKey detected in widget tree." // But when I wrap custom scroll view into the RefrashIndicator, the key isn't needed any more @@ -39,13 +46,13 @@ class _ContactScreenState extends State { appBar: AppBar( leading: Container( margin: const EdgeInsets.only(left: 8), - child: getIt.get().avatar.isEmpty + child: get().avatar.isEmpty ? const CircleAvatar( backgroundImage: AssetImage('assets/images/user_2.png'), ) : CircleAvatar( backgroundImage: CachedNetworkImageProvider( - '$avatarsUrl/${getIt.get().avatar}', + '$avatarsUrl/${get().avatar}', ), ), ), @@ -79,7 +86,7 @@ class _ContactScreenState extends State { [ TextButton( onPressed: () async { - // await getApplicantInfo(getIt.get().applicantIds); + // await getApplicantInfo(get().applicantIds); context.push('/contact/apply_list'); }, style: TextButton.styleFrom( @@ -89,13 +96,13 @@ class _ContactScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ badges.Badge( - showBadge: getIt.get().count > 0, + showBadge: get().count > 0, badgeStyle: const badges.BadgeStyle( badgeColor: kErrorColor, elevation: 12, ), badgeContent: Text( - getIt.get().count.toString(), + get().count.toString(), style: TextStyle( fontSize: 11, color: @@ -158,26 +165,25 @@ class _ContactScreenState extends State { (BuildContext context, int index) { if (_shows['friendGroups']!) { return FriendGroup( - key: ValueKey(getIt.get().friendGroups[index]), - groupName: getIt.get().friendGroups[index], + key: ValueKey(friendGroups[index]), + groupName: friendGroups[index], ); } else if (_shows['allFriends']!) { return FriendTile( key: ValueKey( - getIt.get().friends.keys.toList()[index], + friends.keys.toList()[index], ), - friendId: - getIt.get().friends.keys.toList()[index], + friendId: friends.keys.toList()[index], ); } else { return GroupChatTile(); } }, childCount: _shows['friendGroups']! - ? getIt.get().friendGroups.length + ? get().friendGroups.length : _shows['allFriends']! - ? getIt.get().friends.length - : getIt.get().groupChats.length, + ? get().friends.length + : get().groupChats.length, ), ), ], diff --git a/lib/screens/contact/friend_group_screen/components/group_bottom_sheet.dart b/lib/screens/contact/manage_group_screen/components/group_bottom_sheet.dart similarity index 83% rename from lib/screens/contact/friend_group_screen/components/group_bottom_sheet.dart rename to lib/screens/contact/manage_group_screen/components/group_bottom_sheet.dart index d80d3f7..aa6786d 100644 --- a/lib/screens/contact/friend_group_screen/components/group_bottom_sheet.dart +++ b/lib/screens/contact/manage_group_screen/components/group_bottom_sheet.dart @@ -4,6 +4,8 @@ import 'package:go_router/go_router.dart'; import 'package:cherry_toast/cherry_toast.dart'; import 'package:together_mobile/common/constants.dart'; +import 'package:together_mobile/models/contact_model.dart'; +import 'package:together_mobile/models/init_get_it.dart'; class EditGroupBottomSheet extends StatefulWidget { const EditGroupBottomSheet({ @@ -130,18 +132,48 @@ class _EditGroupBottomSheetState extends State { thickness: 1, ), TextButton( - onPressed: () { - if (widget.tempGroups[widget.index] == widget.tempDefaultGroup) { + onPressed: () async { + String deletedGroup = widget.tempGroups[widget.index]; + if (deletedGroup == widget.tempDefaultGroup) { CherryToast.warning( - title: const Text('不可删除默认分组'), + title: const Text( + '不可删除默认分组', + style: TextStyle( + color: kContentColorLight, + ), + ), ).show(context); return; } - // close the bottomsheet - context.pop(); - widget.deleteCallback(widget.index); - widget.refreshCallback(); + + int? choose = await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('删除分组'), + content: const Text('该分组内的好友将被移到默认分组'), + actions: [ + TextButton( + onPressed: () => context.pop(0), + child: const Text('取消'), + ), + TextButton( + onPressed: () => context.pop(1), + child: const Text('确定'), + ), + ], + ); + }, + ); + + if (choose == 1) { + // close the bottomsheet + // ignore: use_build_context_synchronously + context.pop(); + widget.deleteCallback(widget.index); + widget.refreshCallback(); + } }, style: TextButton.styleFrom( fixedSize: const Size(240, 40), diff --git a/lib/screens/contact/friend_group_screen/components/reorderable_friend_group_list.dart b/lib/screens/contact/manage_group_screen/components/reorderable_friend_group_list.dart similarity index 95% rename from lib/screens/contact/friend_group_screen/components/reorderable_friend_group_list.dart rename to lib/screens/contact/manage_group_screen/components/reorderable_friend_group_list.dart index e7164cc..0954686 100755 --- a/lib/screens/contact/friend_group_screen/components/reorderable_friend_group_list.dart +++ b/lib/screens/contact/manage_group_screen/components/reorderable_friend_group_list.dart @@ -5,7 +5,7 @@ import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:reorderables/reorderables.dart'; import 'package:together_mobile/common/constants.dart'; -import 'package:together_mobile/screens/contact/friend_group_screen/components/group_bottom_sheet.dart'; +import 'package:together_mobile/screens/contact/manage_group_screen/components/group_bottom_sheet.dart'; class ReorderableFriendGroupList extends StatefulWidget { const ReorderableFriendGroupList({ @@ -62,7 +62,9 @@ class _ReorderableFriendGroupListState onPressed: (BuildContext context) { if (widget.tempGroups[index] == widget.tempDefaultGroup) { CherryToast.warning( - title: const Text('不可删除默认分组'), + title: const Text( + '不可删除默认分组', + ), ).show(context); return; } diff --git a/lib/screens/contact/friend_group_screen/friend_group_screen.dart b/lib/screens/contact/manage_group_screen/manage_group_screen.dart similarity index 84% rename from lib/screens/contact/friend_group_screen/friend_group_screen.dart rename to lib/screens/contact/manage_group_screen/manage_group_screen.dart index b13c301..564b6d3 100755 --- a/lib/screens/contact/friend_group_screen/friend_group_screen.dart +++ b/lib/screens/contact/manage_group_screen/manage_group_screen.dart @@ -9,7 +9,7 @@ import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/contact.dart'; -import 'package:together_mobile/screens/contact/friend_group_screen/components/reorderable_friend_group_list.dart'; +import 'package:together_mobile/screens/contact/manage_group_screen/components/reorderable_friend_group_list.dart'; class FriendGroupScreen extends StatefulWidget { const FriendGroupScreen({super.key}); @@ -22,6 +22,7 @@ class _FriendGroupScreenState extends State { bool _isChanged = false; final List _tempGroups = []; final List> _groupNameChangePair = []; + final List _deletedOriginGroups = []; String _tempDefaultGroup = getIt.get().defaultGroup; @override @@ -59,7 +60,7 @@ class _FriendGroupScreenState extends State { ? kUnActivatedColor : Theme.of(context).brightness == Brightness.light ? kContentColorDark - : kContentColorLight, + : kPrimaryColor, ), ), ), @@ -85,6 +86,12 @@ class _FriendGroupScreenState extends State { } void _delete(int index) { + if (getIt.get().friendGroups.contains(_tempGroups[index])) { + setState(() { + _deletedOriginGroups.add(_tempGroups[index]); + }); + } + setState(() { _tempGroups.removeAt(index); _isChanged = !listEquals(_tempGroups, getIt.get().friendGroups); @@ -118,25 +125,32 @@ class _FriendGroupScreenState extends State { } Future _save() async { + int sub = + getIt.get().friendGroups.length - _deletedOriginGroups.length; + + setState(() { + _deletedOriginGroups.addAll(List.filled(sub - 1, '')); + }); + Map res = await manageGroups( getIt.get().id, _tempGroups, _groupNameChangePair, + _deletedOriginGroups, _tempDefaultGroup, ); if (res['code'] == 10700) { // ignore: use_build_context_synchronously CherryToast.success( - title: const Text('保存更改成功'), + title: const Text( + '保存更改成功', + style: TextStyle(color: kContentColorLight), + ), ).show(context); } - getIt.get().manageGroup( - _tempGroups, - _groupNameChangePair, - _tempDefaultGroup, - ); + getIt.get().init(res['data']); setState(() { _isChanged = false; diff --git a/lib/screens/contact_add/contact_add_friend_screen/components/add_bottom_sheet.dart b/lib/screens/contact_add/contact_add_friend_screen/components/add_bottom_sheet.dart index d5becf0..044584f 100755 --- a/lib/screens/contact_add/contact_add_friend_screen/components/add_bottom_sheet.dart +++ b/lib/screens/contact_add/contact_add_friend_screen/components/add_bottom_sheet.dart @@ -1,15 +1,16 @@ import 'dart:io'; - -import 'package:cherry_toast/cherry_toast.dart'; import 'package:flutter/material.dart'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:cherry_toast/cherry_toast.dart'; import 'package:go_router/go_router.dart'; import 'package:together_mobile/common/constants.dart'; +import 'package:together_mobile/models/contact_model.dart'; import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/apply.dart'; - -const List friendGroup = ['我的好友', '同学', '同事', '朋友', '家人']; +import 'package:together_mobile/request/server.dart'; class AddBottomSheet extends StatefulWidget { const AddBottomSheet({super.key, required this.friendId}); @@ -23,7 +24,7 @@ class AddBottomSheet extends StatefulWidget { class _AddBottomSheetState extends State { final TextEditingController _helloController = TextEditingController(); final TextEditingController _remarkController = TextEditingController(); - String _selectedGroup = friendGroup.first; + String _selectedGroup = getIt.get().friendGroups.first; @override void dispose() { @@ -62,8 +63,8 @@ class _AddBottomSheetState extends State { ) : CircleAvatar( radius: 30, - backgroundImage: FileImage( - File(getIt.get().avatar), + backgroundImage: CachedNetworkImageProvider( + '$avatarsUrl/${getIt.get().avatar}', ), ), title: Text( @@ -149,7 +150,10 @@ class _AddBottomSheetState extends State { _selectedGroup = value!; }); }, - items: friendGroup.map>((String value) { + items: getIt + .get() + .friendGroups + .map>((String value) { return DropdownMenuItem( value: value, child: Text(value), @@ -206,7 +210,14 @@ class _AddBottomSheetState extends State { context.pop(); // ignore: use_build_context_synchronously - CherryToast.success(title: const Text('已发送添加申请')).show(context); + CherryToast.success( + title: const Text( + '已发送添加申请', + style: TextStyle( + color: kContentColorLight, + ), + ), + ).show(context); } } } diff --git a/lib/screens/contact_add/search_new_screen.dart b/lib/screens/contact_add/search_new_screen.dart index c32885d..513b042 100755 --- a/lib/screens/contact_add/search_new_screen.dart +++ b/lib/screens/contact_add/search_new_screen.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:together_mobile/common/constants.dart'; +import 'package:together_mobile/models/contact_model.dart'; import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/search_new.dart'; @@ -127,19 +128,33 @@ class _SearchNewScreenState extends State { return; } - if (_controller.text == getIt.get().username || - _controller.text == getIt.get().email) { + String searchValue = _controller.text; + + if (searchValue == getIt.get().username || + searchValue == getIt.get().email) { context.pushNamed('MainProfile'); return; } + var (isExisted, friendId) = getIt.get().getIdBy( + 'username', + searchValue, + ); + if (isExisted) { + context.pushNamed( + 'FriendProfile', + queryParameters: {'friendId': friendId}, + ); + return; + } + setState(() { _isHttpSent = true; }); Map res = await searchContactBy( condition, - _controller.text, + searchValue, ); setState(() { diff --git a/lib/screens/friend_profile/friend_setting_screen/friend_setting_screen.dart b/lib/screens/friend_profile/friend_setting_screen/friend_setting_screen.dart index d8d0af2..7769817 100644 --- a/lib/screens/friend_profile/friend_setting_screen/friend_setting_screen.dart +++ b/lib/screens/friend_profile/friend_setting_screen/friend_setting_screen.dart @@ -1,9 +1,13 @@ +import 'dart:async'; + import 'package:cherry_toast/cherry_toast.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:together_mobile/common/constants.dart'; import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/models/contact_model.dart'; +import 'package:together_mobile/models/user_model.dart'; import 'package:together_mobile/request/contact.dart'; class FriendSettingScreen extends StatefulWidget { @@ -48,234 +52,319 @@ class _FriendSettingScreenState extends State { centerTitle: true, title: const Text('好友设置'), ), - body: SingleChildScrollView( - child: ExpansionPanelList( - expansionCallback: (panelIndex, isExpanded) { - setState(() { - _expand[panelIndex] = !isExpanded; - }); - }, - children: [ - // 设置备注 - ExpansionPanel( - headerBuilder: (BuildContext context, bool isExpanded) { - return Padding( - padding: const EdgeInsets.only(left: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - '设置备注', - style: TextStyle(fontSize: 16), - ), - Text( - getIt - .get() - .friends[widget.friendId]! - .friendRemark, - style: const TextStyle( - fontSize: 16, - color: kUnActivatedColor, - ), - ), - ], - ), - ); + body: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: ExpansionPanelList( + expansionCallback: (panelIndex, isExpanded) { + setState(() { + _expand[panelIndex] = !isExpanded; + }); }, - body: Padding( - padding: const EdgeInsets.fromLTRB(10, 0, 20, 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: 200, - height: 45, - child: TextField( - onChanged: (value) { - if (value == - getIt - .get() - .friends[widget.friendId]! - .friendRemark) { - setState(() { - _isRemarkChanged = false; - }); - } else { - setState(() { - _isRemarkChanged = true; - }); - } - }, - controller: _remarkController, - style: const TextStyle(fontSize: 18), - decoration: const InputDecoration( - border: InputBorder.none, - hintText: '点击输入备注', + children: [ + // 设置备注 + ExpansionPanel( + headerBuilder: (BuildContext context, bool isExpanded) { + return Padding( + padding: const EdgeInsets.only(left: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + '设置备注', + style: TextStyle(fontSize: 16), + ), + Text( + getIt + .get() + .friends[widget.friendId]! + .friendRemark, + style: const TextStyle( + fontSize: 16, + color: kUnActivatedColor, + ), + ), + ], + ), + ); + }, + body: Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 20, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 200, + height: 45, + child: TextField( + onChanged: (value) { + if (value == + getIt + .get() + .friends[widget.friendId]! + .friendRemark) { + setState(() { + _isRemarkChanged = false; + }); + } else { + setState(() { + _isRemarkChanged = true; + }); + } + }, + controller: _remarkController, + style: const TextStyle(fontSize: 18), + decoration: const InputDecoration( + border: InputBorder.none, + hintText: '点击输入备注', + ), + ), ), - ), - ), - FilledButton( - onPressed: () async { - if (!_isRemarkChanged || - _remarkController.text.isEmpty) { - return; - } + FilledButton( + onPressed: () async { + if (!_isRemarkChanged || + _remarkController.text.isEmpty) { + return; + } - Map res = await changeFriendRemark( - widget.friendId, - _remarkController.text, - ); + Map res = await changeFriendRemark( + widget.friendId, + _remarkController.text, + ); - if (res['code'] == 10700) { - // ignore: use_build_context_synchronously - CherryToast.success( - title: const Text('已更改好友备注'), - ).show(context); + if (res['code'] == 10700) { + // ignore: use_build_context_synchronously + CherryToast.success( + title: const Text('已更改好友备注'), + ).show(context); - setState(() { - _isRemarkChanged = false; - }); + setState(() { + _isRemarkChanged = false; + }); - getIt.get().changeFriendRemark( - widget.friendId, - _remarkController.text, - ); - } - }, - style: FilledButton.styleFrom( - maximumSize: const Size(60, 30), - minimumSize: const Size(60, 30), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), + getIt.get().changeFriendRemark( + widget.friendId, + _remarkController.text, + ); + } + }, + style: FilledButton.styleFrom( + maximumSize: const Size(60, 30), + minimumSize: const Size(60, 30), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + backgroundColor: _isRemarkChanged && + _remarkController.text.isNotEmpty + ? kPrimaryColor + : Theme.of(context).brightness == + Brightness.dark + ? kUnActivatedColor + : kUnAvailableColor, + ), + child: const Text( + '更改', + style: TextStyle(fontSize: 14), + ), ), - backgroundColor: _isRemarkChanged && - _remarkController.text.isNotEmpty - ? kPrimaryColor - : Theme.of(context).brightness == Brightness.dark - ? kUnActivatedColor - : kUnAvailableColor, - ), - child: const Text( - '更改', - style: TextStyle(fontSize: 14), - ), + ], ), - ], + ), + isExpanded: _expand[0], ), - ), - isExpanded: _expand[0], + // 设置分组 + ExpansionPanel( + headerBuilder: (BuildContext context, bool isExpanded) { + return Padding( + padding: const EdgeInsets.only(left: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + '设置分组', + style: TextStyle(fontSize: 16), + ), + Text( + getIt + .get() + .friends[widget.friendId]! + .friendGroup, + style: const TextStyle( + fontSize: 16, + color: kUnActivatedColor, + ), + ), + ], + ), + ); + }, + body: Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 20, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + height: 45, + child: DropdownButton( + value: _group, + onChanged: (value) { + if (value == _group) { + setState(() { + _isGroupChanged = false; + }); + } else { + setState(() { + _isGroupChanged = true; + _group = value!; + }); + } + }, + items: getIt + .get() + .friendGroups + .map>( + (String value) => DropdownMenuItem( + value: value, + child: Text(value), + ), + ) + .toList(), + ), + ), + FilledButton( + onPressed: () async { + if (!_isGroupChanged) { + return; + } + + Map res = await changeFreindGroup( + widget.friendId, + _group, + ); + + if (res['code'] == 10700) { + // ignore: use_build_context_synchronously + CherryToast.success( + title: const Text( + '已更改好友分组', + style: TextStyle( + color: kContentColorLight, + ), + ), + ).show(context); + + setState(() { + _isGroupChanged = false; + }); + + // getIt.get().changeFriendGroup( + // widget.friendId, + // _group, + // ); + getIt.get().init(res['data']); + } + }, + style: FilledButton.styleFrom( + maximumSize: const Size(60, 30), + minimumSize: const Size(60, 30), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + backgroundColor: _isGroupChanged + ? kPrimaryColor + : Theme.of(context).brightness == + Brightness.dark + ? kUnActivatedColor + : kUnAvailableColor, + ), + child: const Text( + '更改', + style: TextStyle(fontSize: 14), + ), + ), + ], + ), + ), + isExpanded: _expand[1], + ) + ], ), - // 设置分组 - ExpansionPanel( - headerBuilder: (BuildContext context, bool isExpanded) { - return Padding( - padding: const EdgeInsets.only(left: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - '设置分组', - style: TextStyle(fontSize: 16), - ), - Text( - getIt - .get() - .friends[widget.friendId]! - .friendGroup, - style: const TextStyle( - fontSize: 16, - color: kUnActivatedColor, - ), - ), - ], - ), - ); + ), + SliverToBoxAdapter( + child: TextButton( + onPressed: () async { + await _deleteFriend(context); }, - body: Padding( - padding: const EdgeInsets.fromLTRB(10, 0, 20, 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - height: 45, - child: DropdownButton( - value: _group, - onChanged: (value) { - if (value == _group) { - setState(() { - _isGroupChanged = false; - }); - } else { - setState(() { - _isGroupChanged = true; - _group = value!; - }); - } - }, - items: getIt - .get() - .friendGroups - .map>( - (String value) => DropdownMenuItem( - value: value, - child: Text(value), - ), - ) - .toList(), - ), - ), - FilledButton( - onPressed: () async { - if (!_isGroupChanged) { - return; - } - - Map res = await changeFreindGroup( - widget.friendId, - _group, - ); - - if (res['code'] == 10700) { - // ignore: use_build_context_synchronously - CherryToast.success( - title: const Text('已更改好友分组'), - ).show(context); - - setState(() { - _isGroupChanged = false; - }); - - getIt.get().changeFriendGroup( - widget.friendId, - _group, - ); - } - }, - style: FilledButton.styleFrom( - maximumSize: const Size(60, 30), - minimumSize: const Size(60, 30), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - backgroundColor: _isGroupChanged - ? kPrimaryColor - : Theme.of(context).brightness == Brightness.dark - ? kUnActivatedColor - : kUnAvailableColor, - ), - child: const Text( - '更改', - style: TextStyle(fontSize: 14), - ), - ), - ], + style: TextButton.styleFrom( + foregroundColor: kErrorColor.withOpacity(0.4), + ), + child: const Text( + '删除好友', + style: TextStyle( + color: kErrorColor, + fontSize: 16, ), ), - isExpanded: _expand[1], - ) - ], - ), + ), + ), + ], ), ); } + + Future _deleteFriend(BuildContext context) async { + int? choose = await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('删除好友'), + content: const Text('删除好友后,你将会从对方好友列表中移除'), + actions: [ + TextButton( + onPressed: () => context.pop(0), + child: const Text( + '取消', + style: TextStyle( + color: kUnAvailableColor, + ), + ), + ), + TextButton( + onPressed: () => context.pop(1), + child: const Text( + '确认', + style: TextStyle( + color: kErrorColor, + ), + ), + ), + ], + ); + }, + ); + + if (choose == 1) { + Map res = await deleteFriend( + getIt.get().id, + widget.friendId, + ); + + if (res['code'] == 10700) { + // ignore: use_build_context_synchronously + context.goNamed( + 'Contact', + queryParameters: {'deletedFriendId': widget.friendId}, + ); + // ignore: use_build_context_synchronously + CherryToast.success( + title: const Text( + '已删除好友', + style: TextStyle( + color: kContentColorLight, + ), + ), + ).show(context); + } + } + } } diff --git a/pubspec.lock b/pubspec.lock index 4fab81c..28669a3 100755 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "61.0.0" analyzer: @@ -14,7 +14,7 @@ packages: description: name: analyzer sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.13.0" archive: @@ -22,7 +22,7 @@ packages: description: name: archive sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.3.7" args: @@ -30,7 +30,7 @@ packages: description: name: args sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2" async: @@ -38,7 +38,7 @@ packages: description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.11.0" badges: @@ -46,7 +46,7 @@ packages: description: name: badges sha256: "6e7f3ec561ec08f47f912cfe349d4a1707afdc8dda271e17b046aa6d42c89e77" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.1" boolean_selector: @@ -54,7 +54,7 @@ packages: description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" build: @@ -62,7 +62,7 @@ packages: description: name: build sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" build_config: @@ -70,7 +70,7 @@ packages: description: name: build_config sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" build_daemon: @@ -78,7 +78,7 @@ packages: description: name: build_daemon sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0" build_resolvers: @@ -86,7 +86,7 @@ packages: description: name: build_resolvers sha256: "6c4dd11d05d056e76320b828a1db0fc01ccd376922526f8e9d6c796a5adbac20" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.1" build_runner: @@ -94,7 +94,7 @@ packages: description: name: build_runner sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.6" build_runner_core: @@ -102,7 +102,7 @@ packages: description: name: build_runner_core sha256: "6d6ee4276b1c5f34f21fdf39425202712d2be82019983d52f351c94aafbc2c41" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.2.10" built_collection: @@ -110,7 +110,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: @@ -118,7 +118,7 @@ packages: description: name: built_value sha256: "598a2a682e2a7a90f08ba39c0aaa9374c5112340f0a2e275f61b59389543d166" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.6.1" cached_network_image: @@ -126,7 +126,7 @@ packages: description: name: cached_network_image sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.3" cached_network_image_platform_interface: @@ -134,7 +134,7 @@ packages: description: name: cached_network_image_platform_interface sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.0" cached_network_image_web: @@ -142,7 +142,7 @@ packages: description: name: cached_network_image_web sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" characters: @@ -150,7 +150,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.0" checked_yaml: @@ -158,7 +158,7 @@ packages: description: name: checked_yaml sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.3" cherry_toast: @@ -166,7 +166,7 @@ packages: description: name: cherry_toast sha256: "5724acebea4544697994e47a180295657b48d7468224c4c6296f230706a9a4a5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.1" clock: @@ -174,7 +174,7 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" code_builder: @@ -182,7 +182,7 @@ packages: description: name: code_builder sha256: "4ad01d6e56db961d29661561effde45e519939fdaeb46c351275b182eac70189" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.5.0" collection: @@ -190,7 +190,7 @@ packages: description: name: collection sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.17.1" colorfilter_generator: @@ -198,7 +198,7 @@ packages: description: name: colorfilter_generator sha256: ccc2995e440b1d828d55d99150e7cad64624f3cb4a1e235000de3f93cf10d35c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.0.8" convert: @@ -206,7 +206,7 @@ packages: description: name: convert sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.1" cross_file: @@ -214,7 +214,7 @@ packages: description: name: cross_file sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.3.3+4" crypto: @@ -222,7 +222,7 @@ packages: description: name: crypto sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.3" csslib: @@ -230,7 +230,7 @@ packages: description: name: csslib sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.0" cupertino_icons: @@ -238,7 +238,7 @@ packages: description: name: cupertino_icons sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.5" dart_style: @@ -246,7 +246,7 @@ packages: description: name: dart_style sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.2" dbus: @@ -254,7 +254,7 @@ packages: description: name: dbus sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.8" device_info_plus: @@ -262,7 +262,7 @@ packages: description: name: device_info_plus sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.0.2" device_info_plus_platform_interface: @@ -270,23 +270,23 @@ packages: description: name: device_info_plus_platform_interface sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.0" dio: dependency: "direct main" description: name: dio - sha256: "3866d67f93523161b643187af65f5ac08bc991a5bcdaf41a2d587fe4ccb49993" - url: "https://pub.flutter-io.cn" + sha256: "9d6445da1caf8412070670c03c39ad5b12a78cc8c2361417b220905a2bcbdd2f" + url: "https://pub.dev" source: hosted - version: "5.3.0" + version: "5.3.1" extended_image: dependency: transitive description: name: extended_image sha256: e77d18f956649ba6e5ecebd0cb68542120886336a75ee673788145bd4c3f0767 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.0.2" extended_image_library: @@ -294,7 +294,7 @@ packages: description: name: extended_image_library sha256: bb8d08c504ebc73d476ec1c99451a61f12e95538869e734fc4f55a3a2d5c98ec - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.5.3" fake_async: @@ -302,7 +302,7 @@ packages: description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: @@ -310,7 +310,7 @@ packages: description: name: ffi sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.2" file: @@ -318,7 +318,7 @@ packages: description: name: file sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.4" file_selector_linux: @@ -326,7 +326,7 @@ packages: description: name: file_selector_linux sha256: "770eb1ab057b5ae4326d1c24cc57710758b9a46026349d021d6311bd27580046" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.2" file_selector_macos: @@ -334,7 +334,7 @@ packages: description: name: file_selector_macos sha256: "4ada532862917bf16e3adb3891fe3a5917a58bae03293e497082203a80909412" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+1" file_selector_platform_interface: @@ -342,7 +342,7 @@ packages: description: name: file_selector_platform_interface sha256: "412705a646a0ae90f33f37acfae6a0f7cbc02222d6cd34e479421c3e74d3853c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.6.0" file_selector_windows: @@ -350,7 +350,7 @@ packages: description: name: file_selector_windows sha256: "1372760c6b389842b77156203308940558a2817360154084368608413835fc26" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3" fixnum: @@ -358,7 +358,7 @@ packages: description: name: fixnum sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" flutter: @@ -371,7 +371,7 @@ packages: description: name: flutter_blurhash sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.0" flutter_cache_manager: @@ -379,7 +379,7 @@ packages: description: name: flutter_cache_manager sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.3.1" flutter_colorpicker: @@ -387,7 +387,7 @@ packages: description: name: flutter_colorpicker sha256: "458a6ed8ea480eb16ff892aedb4b7092b2804affd7e046591fb03127e8d8ef8b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.3" flutter_image_compress: @@ -395,7 +395,7 @@ packages: description: name: flutter_image_compress sha256: "2725cce5c58fdeaf1db8f4203688228bb67e3523a66305ccaa6f99071beb6dc2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.4" flutter_image_compress_common: @@ -403,7 +403,7 @@ packages: description: name: flutter_image_compress_common sha256: "8e7299afe109dc4b97fda34bf0f4967cc1fc10bc8050c374d449cab262d095b3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" flutter_image_compress_platform_interface: @@ -411,7 +411,7 @@ packages: description: name: flutter_image_compress_platform_interface sha256: "3c7e86da7540b1adfa919b461885a41a018d4a26544d0fcbeaa769f6542e603d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" flutter_image_compress_web: @@ -419,7 +419,7 @@ packages: description: name: flutter_image_compress_web sha256: e879189dc7f246dcf8f06c07ee849231341508bf51e8ed7d5dcbe778ddde0e81 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.3+1" flutter_lints: @@ -427,7 +427,7 @@ packages: description: name: flutter_lints sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.2" flutter_local_notifications: @@ -435,7 +435,7 @@ packages: description: name: flutter_local_notifications sha256: aea96b3b78556c97607d9bee59fcec515bc3ec1b6e905f14d72906ae055033fa - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "14.1.2" flutter_local_notifications_linux: @@ -443,7 +443,7 @@ packages: description: name: flutter_local_notifications_linux sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0+1" flutter_local_notifications_platform_interface: @@ -451,7 +451,7 @@ packages: description: name: flutter_local_notifications_platform_interface sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.0+1" flutter_pickers: @@ -459,7 +459,7 @@ packages: description: name: flutter_pickers sha256: f38a9d9229afed75f76bae64e628b78b9c20194873e3c141783523cf21ac8a95 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.9" flutter_plugin_android_lifecycle: @@ -467,7 +467,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.15" flutter_secure_storage: @@ -475,7 +475,7 @@ packages: description: name: flutter_secure_storage sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.0.0" flutter_secure_storage_linux: @@ -483,7 +483,7 @@ packages: description: name: flutter_secure_storage_linux sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.3" flutter_secure_storage_macos: @@ -491,7 +491,7 @@ packages: description: name: flutter_secure_storage_macos sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.0" flutter_secure_storage_platform_interface: @@ -499,7 +499,7 @@ packages: description: name: flutter_secure_storage_platform_interface sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" flutter_secure_storage_web: @@ -507,7 +507,7 @@ packages: description: name: flutter_secure_storage_web sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" flutter_secure_storage_windows: @@ -515,7 +515,7 @@ packages: description: name: flutter_secure_storage_windows sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_slidable: @@ -523,7 +523,7 @@ packages: description: name: flutter_slidable sha256: cc4231579e3eae41ae166660df717f4bad1359c87f4a4322ad8ba1befeb3d2be - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.0" flutter_test: @@ -536,7 +536,7 @@ packages: description: name: flutter_timezone sha256: "4508018aba499c837f723e2e718259eb677410490638b7ea669b11113d083e68" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.7" flutter_web_plugins: @@ -549,7 +549,7 @@ packages: description: name: font_awesome_flutter sha256: "5fb789145cae1f4c3245c58b3f8fb287d055c26323879eab57a7bf0cfd1e45f3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "10.5.0" frontend_server_client: @@ -557,23 +557,39 @@ packages: description: name: frontend_server_client sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.0" + functional_listener: + dependency: transitive + description: + name: functional_listener + sha256: "026d1bd4f66367f11d9ec9f1f1ddb42b89e4484b356972c76d983266cf82f33f" + url: "https://pub.dev" + source: hosted + version: "2.3.1" get_it: dependency: "direct main" description: name: get_it sha256: "529de303c739fca98cd7ece5fca500d8ff89649f1bb4b4e94fb20954abcd7468" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.6.0" + get_it_mixin: + dependency: "direct main" + description: + name: get_it_mixin + sha256: d59fe7e49e258ddf9f10580b50cce5c129d3f2f6a340b684847615128c641261 + url: "https://pub.dev" + source: hosted + version: "4.2.0" glob: dependency: transitive description: name: glob sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" go_router: @@ -581,7 +597,7 @@ packages: description: name: go_router sha256: "00d1b67d6e9fa443331da229084dd3eb04407f5a2dff22940bd7bba6af5722c3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.1.1" google_fonts: @@ -589,7 +605,7 @@ packages: description: name: google_fonts sha256: "2776c66b3e97c6cdd58d1bd3281548b074b64f1fd5c8f82391f7456e38849567" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.5" graphs: @@ -597,7 +613,7 @@ packages: description: name: graphs sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.1" hand_signature: @@ -605,7 +621,7 @@ packages: description: name: hand_signature sha256: "69cc5a978a5a15dfc1fabb01c097efcf91e9af2006475e48bb8f2560db368a97" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.1" hive: @@ -613,7 +629,7 @@ packages: description: name: hive sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.3" hive_flutter: @@ -621,7 +637,7 @@ packages: description: name: hive_flutter sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" hive_generator: @@ -629,7 +645,7 @@ packages: description: name: hive_generator sha256: "65998cc4d2cd9680a3d9709d893d2f6bb15e6c1f92626c3f1fa650b4b3281521" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.0" html: @@ -637,7 +653,7 @@ packages: description: name: html sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.15.4" http: @@ -645,7 +661,7 @@ packages: description: name: http sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" http_client_helper: @@ -653,7 +669,7 @@ packages: description: name: http_client_helper sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.0" http_multi_server: @@ -661,7 +677,7 @@ packages: description: name: http_multi_server sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.1" http_parser: @@ -669,7 +685,7 @@ packages: description: name: http_parser sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.2" image: @@ -677,7 +693,7 @@ packages: description: name: image sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.17" image_editor: @@ -685,7 +701,7 @@ packages: description: name: image_editor sha256: "9877a057b0cd2fafcd9a3dce5279948bd850d53ce76231a83c9678a2c9f186e9" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.0" image_editor_common: @@ -693,7 +709,7 @@ packages: description: name: image_editor_common sha256: "07fc9bcc16918a8230e132b9d9a9f66bb1cef3ac99f5e2939cf2ad7a6775b511" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" image_editor_platform_interface: @@ -701,7 +717,7 @@ packages: description: name: image_editor_platform_interface sha256: ee01ec5e228e10c40f96d7f822c176d4140c15b6706e4a701866ee0cdd1c2b72 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" image_editor_plus: @@ -709,7 +725,7 @@ packages: description: name: image_editor_plus sha256: "1a79038294402ac058488f6f619e62fc78ed857393512912d896da778f5f7e8d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.5" image_picker: @@ -717,7 +733,7 @@ packages: description: name: image_picker sha256: "6296e98782726d37f59663f0727d0e978eee1ced1ffed45ccaba591786a7f7b3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" image_picker_android: @@ -725,7 +741,7 @@ packages: description: name: image_picker_android sha256: "8179b54039b50eee561676232304f487602e2950ffb3e8995ed9034d6505ca34" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.7+4" image_picker_for_web: @@ -733,7 +749,7 @@ packages: description: name: image_picker_for_web sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" image_picker_ios: @@ -741,7 +757,7 @@ packages: description: name: image_picker_ios sha256: b3e2f21feb28b24dd73a35d7ad6e83f568337c70afab5eabac876e23803f264b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.8" image_picker_linux: @@ -749,7 +765,7 @@ packages: description: name: image_picker_linux sha256: "02cbc21fe1706b97942b575966e5fbbeaac535e76deef70d3a242e4afb857831" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.1" image_picker_macos: @@ -757,7 +773,7 @@ packages: description: name: image_picker_macos sha256: cee2aa86c56780c13af2c77b5f2f72973464db204569e1ba2dd744459a065af4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.1" image_picker_platform_interface: @@ -765,7 +781,7 @@ packages: description: name: image_picker_platform_interface sha256: c1134543ae2187e85299996d21c526b2f403854994026d575ae4cf30d7bb2a32 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.9.0" image_picker_windows: @@ -773,7 +789,7 @@ packages: description: name: image_picker_windows sha256: c3066601ea42113922232c7b7b3330a2d86f029f685bba99d82c30e799914952 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.1" io: @@ -781,7 +797,7 @@ packages: description: name: io sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.4" js: @@ -789,7 +805,7 @@ packages: description: name: js sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.6.7" json_annotation: @@ -797,7 +813,7 @@ packages: description: name: json_annotation sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.8.1" lints: @@ -805,7 +821,7 @@ packages: description: name: lints sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" logging: @@ -813,7 +829,7 @@ packages: description: name: logging sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" matcher: @@ -821,7 +837,7 @@ packages: description: name: matcher sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.12.15" material_color_utilities: @@ -829,7 +845,7 @@ packages: description: name: material_color_utilities sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.0" matrix2d: @@ -837,7 +853,7 @@ packages: description: name: matrix2d sha256: "188718dd3bc2a31e372cfd0791b0f77f4f13ea76164147342cc378d9132949e7" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.4" meta: @@ -845,7 +861,7 @@ packages: description: name: meta sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.9.1" mime: @@ -853,7 +869,7 @@ packages: description: name: mime sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.4" octo_image: @@ -861,7 +877,7 @@ packages: description: name: octo_image sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" package_config: @@ -869,7 +885,7 @@ packages: description: name: package_config sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.0" path: @@ -877,7 +893,7 @@ packages: description: name: path sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.8.3" path_provider: @@ -885,7 +901,7 @@ packages: description: name: path_provider sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.15" path_provider_android: @@ -893,7 +909,7 @@ packages: description: name: path_provider_android sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.27" path_provider_foundation: @@ -901,7 +917,7 @@ packages: description: name: path_provider_foundation sha256: "916731ccbdce44d545414dd9961f26ba5fbaa74bcbb55237d8e65a623a8c7297" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.4" path_provider_linux: @@ -909,23 +925,23 @@ packages: description: name: path_provider_linux sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.11" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" - url: "https://pub.flutter-io.cn" + sha256: bced5679c7df11190e1ddc35f3222c858f328fff85c3942e46e7f5589bf9eb84 + url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.1.0" path_provider_windows: dependency: transitive description: name: path_provider_windows sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.7" petitparser: @@ -933,7 +949,7 @@ packages: description: name: petitparser sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.4.0" photo_view: @@ -941,7 +957,7 @@ packages: description: name: photo_view sha256: "8036802a00bae2a78fc197af8a158e3e2f7b500561ed23b4c458107685e645bb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.14.0" platform: @@ -949,7 +965,7 @@ packages: description: name: platform sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: @@ -957,7 +973,7 @@ packages: description: name: plugin_platform_interface sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.5" pointycastle: @@ -965,7 +981,7 @@ packages: description: name: pointycastle sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.7.3" pool: @@ -973,7 +989,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.1" pub_semver: @@ -981,7 +997,7 @@ packages: description: name: pub_semver sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" pubspec_parse: @@ -989,7 +1005,7 @@ packages: description: name: pubspec_parse sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.3" reorderables: @@ -997,7 +1013,7 @@ packages: description: name: reorderables sha256: "004a886e4878df1ee27321831c838bc1c976311f4ca6a74ce7d561e506540a77" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.6.0" rxdart: @@ -1005,7 +1021,7 @@ packages: description: name: rxdart sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.27.7" screenshot: @@ -1013,7 +1029,7 @@ packages: description: name: screenshot sha256: "455284ff1f5b911d94a43c25e1385485cf6b4f288293eba68f15dad711c7b81c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.0" shared_preferences: @@ -1021,7 +1037,7 @@ packages: description: name: shared_preferences sha256: "0344316c947ffeb3a529eac929e1978fcd37c26be4e8468628bac399365a3ca1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" shared_preferences_android: @@ -1029,7 +1045,7 @@ packages: description: name: shared_preferences_android sha256: fe8401ec5b6dcd739a0fe9588802069e608c3fdbfd3c3c93e546cf2f90438076 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" shared_preferences_foundation: @@ -1037,7 +1053,7 @@ packages: description: name: shared_preferences_foundation sha256: f39696b83e844923b642ce9dd4bd31736c17e697f6731a5adf445b1274cf3cd4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.2" shared_preferences_linux: @@ -1045,7 +1061,7 @@ packages: description: name: shared_preferences_linux sha256: "71d6806d1449b0a9d4e85e0c7a917771e672a3d5dc61149cc9fac871115018e1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" shared_preferences_platform_interface: @@ -1053,7 +1069,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" shared_preferences_web: @@ -1061,7 +1077,7 @@ packages: description: name: shared_preferences_web sha256: "7347b194fb0bbeb4058e6a4e87ee70350b6b2b90f8ac5f8bd5b3a01548f6d33a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" shared_preferences_windows: @@ -1069,7 +1085,7 @@ packages: description: name: shared_preferences_windows sha256: f95e6a43162bce43c9c3405f3eb6f39e5b5d11f65fab19196cf8225e2777624d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" shelf: @@ -1077,7 +1093,7 @@ packages: description: name: shelf sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.1" shelf_web_socket: @@ -1085,7 +1101,7 @@ packages: description: name: shelf_web_socket sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.4" sky_engine: @@ -1098,7 +1114,7 @@ packages: description: name: source_gen sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" source_helper: @@ -1106,7 +1122,7 @@ packages: description: name: source_helper sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.4" source_span: @@ -1114,7 +1130,7 @@ packages: description: name: source_span sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.9.1" sqflite: @@ -1122,7 +1138,7 @@ packages: description: name: sqflite sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" sqflite_common: @@ -1130,7 +1146,7 @@ packages: description: name: sqflite_common sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.0" stack_trace: @@ -1138,7 +1154,7 @@ packages: description: name: stack_trace sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.11.0" stream_channel: @@ -1146,7 +1162,7 @@ packages: description: name: stream_channel sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" stream_transform: @@ -1154,7 +1170,7 @@ packages: description: name: stream_transform sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.0" string_scanner: @@ -1162,7 +1178,7 @@ packages: description: name: string_scanner sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" synchronized: @@ -1170,7 +1186,7 @@ packages: description: name: synchronized sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.0" term_glyph: @@ -1178,7 +1194,7 @@ packages: description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: @@ -1186,7 +1202,7 @@ packages: description: name: test_api sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.5.1" timezone: @@ -1194,7 +1210,7 @@ packages: description: name: timezone sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.2" timing: @@ -1202,7 +1218,7 @@ packages: description: name: timing sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" typed_data: @@ -1210,7 +1226,7 @@ packages: description: name: typed_data sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.2" uuid: @@ -1218,7 +1234,7 @@ packages: description: name: uuid sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.7" vector_math: @@ -1226,7 +1242,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" video_player: @@ -1234,7 +1250,7 @@ packages: description: name: video_player sha256: "3fd106c74da32f336dc7feb65021da9b0207cb3124392935f1552834f7cce822" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" video_player_android: @@ -1242,7 +1258,7 @@ packages: description: name: video_player_android sha256: f338a5a396c845f4632959511cad3542cdf3167e1b2a1a948ef07f7123c03608 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.9" video_player_avfoundation: @@ -1250,7 +1266,7 @@ packages: description: name: video_player_avfoundation sha256: f5f5b7fe8c865be8a57fe80c2dca130772e1db775b7af4e5c5aa1905069cfc6c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.9" video_player_platform_interface: @@ -1258,7 +1274,7 @@ packages: description: name: video_player_platform_interface sha256: "1ca9acd7a0fb15fb1a990cb554e6f004465c6f37c99d2285766f08a4b2802988" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.2.0" video_player_web: @@ -1266,23 +1282,15 @@ packages: description: name: video_player_web sha256: "44ce41424d104dfb7cf6982cc6b84af2b007a24d126406025bf40de5d481c74c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.16" - visibility_detector: - dependency: "direct main" - description: - name: visibility_detector - sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.4.0+2" watcher: dependency: transitive description: name: watcher sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" web_socket_channel: @@ -1290,7 +1298,7 @@ packages: description: name: web_socket_channel sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.0" win32: @@ -1298,7 +1306,7 @@ packages: description: name: win32 sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.6" win32_registry: @@ -1306,7 +1314,7 @@ packages: description: name: win32_registry sha256: e4506d60b7244251bc59df15656a3093501c37fb5af02105a944d73eb95be4c9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" xdg_directories: @@ -1314,7 +1322,7 @@ packages: description: name: xdg_directories sha256: e0b1147eec179d3911f1f19b59206448f78195ca1d20514134e10641b7d7fbff - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" xml: @@ -1322,7 +1330,7 @@ packages: description: name: xml sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.3.0" yaml: @@ -1330,7 +1338,7 @@ packages: description: name: yaml sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index ac4796c..9fad827 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: flutter_slidable: ^3.0.0 flutter_timezone: ^1.0.6 get_it: ^7.6.0 + get_it_mixin: ^4.2.0 go_router: ^7.1.1 google_fonts: ^4.0.0 hive: ^2.2.3 @@ -55,7 +56,6 @@ dependencies: shared_preferences: ^2.2.0 timezone: ^0.9.2 video_player: ^2.6.1 - visibility_detector: ^0.4.0+2 dev_dependencies: flutter_lints: ^2.0.0