Files
tongxunruanjian/mobile-next/lib/routes/app_navigator.dart
T
编码工程师andmultica-agent 8046ec7483 feat(mobile-next): 导入官方 openim-flutter-demo 固定基线 3.8.3-patch.3 并完成双构建
- 上游: github.com/OpenIMSDK/openim-flutter-demo tag 3.8.3-patch.3
  commit b3dfdb1e8aaeaaf6f0793e10cadd20d5c184a31f
- 并行目录 mobile-next/ 原样导入(含 LICENSE),不覆盖现网 mobile/
- 锁定 Flutter 3.24.5 / Dart 3.5.4 / JDK 17 / Gradle 7.6.3 / AGP 7.3.1
- 实测 Android debug 与 release 构建均成功(见 docs/mobile-next-baseline-import.md)
- 本提交可单独回退:git revert 1db1229(重写前)

Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 15:24:33 +08:00

383 lines
11 KiB
Dart

import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import 'package:get/get.dart';
import 'package:openim_common/openim_common.dart';
import '../pages/chat/group_setup/edit_name/edit_name_logic.dart';
import '../pages/chat/group_setup/group_member_list/group_member_list_logic.dart';
import '../pages/contacts/add_by_search/add_by_search_logic.dart';
import '../pages/contacts/group_profile_panel/group_profile_panel_logic.dart';
import '../pages/contacts/select_contacts/select_contacts_logic.dart';
import '../pages/mine/edit_my_info/edit_my_info_logic.dart';
import 'app_pages.dart';
class AppNavigator {
AppNavigator._();
static void startLogin() {
Get.offAllNamed(AppRoutes.login);
}
static void startBackLogin() {
Get.until((route) => Get.currentRoute == AppRoutes.login);
}
static void startMain({bool isAutoLogin = false, List<ConversationInfo>? conversations}) {
Get.offAllNamed(
AppRoutes.home,
arguments: {'isAutoLogin': isAutoLogin, 'conversations': conversations},
);
}
static void startSplashToMain({bool isAutoLogin = false, List<ConversationInfo>? conversations}) {
Get.offAndToNamed(
AppRoutes.home,
arguments: {'isAutoLogin': isAutoLogin, 'conversations': conversations},
);
}
static void startBackMain() {
Get.until((route) => Get.currentRoute == AppRoutes.home);
}
static startOANtfList({required ConversationInfo info}) {
return Get.toNamed(AppRoutes.oaNotificationList, arguments: info);
}
static Future<T?>? startChat<T>({
required ConversationInfo conversationInfo,
bool offUntilHome = true,
String? draftText,
Message? searchMessage,
}) async {
GetTags.createChatTag();
final arguments = {
'draftText': draftText,
'conversationInfo': conversationInfo,
'searchMessage': searchMessage,
};
return offUntilHome
? Get.offNamedUntil(
AppRoutes.chat,
(route) => route.settings.name == AppRoutes.home,
arguments: arguments,
)
: Get.toNamed(
AppRoutes.chat,
arguments: arguments,
preventDuplicates: false,
);
}
static startMyQrcode() => Get.toNamed(AppRoutes.myQrcode);
static startFavoriteMange() => Get.toNamed(AppRoutes.favoriteManage);
static startAddContactsMethod() => Get.toNamed(AppRoutes.addContactsMethod);
static startScan() => Permissions.camera(() => Get.to(
() => const QrcodeView(),
transition: Transition.cupertino,
popGesture: true,
));
static startAddContactsBySearch({required SearchType searchType}) => Get.toNamed(
AppRoutes.addContactsBySearch,
arguments: {"searchType": searchType},
);
static startUserProfilePane({
required String userID,
String? groupID,
String? nickname,
String? faceURL,
bool offAllWhenDelFriend = false,
bool offAndToNamed = false,
bool forceCanAdd = false,
}) {
GetTags.createUserProfileTag();
final arguments = {
'groupID': groupID,
'userID': userID,
'nickname': nickname,
'faceURL': faceURL,
'offAllWhenDelFriend': offAllWhenDelFriend,
'forceCanAdd': forceCanAdd,
};
return offAndToNamed
? Get.offAndToNamed(AppRoutes.userProfilePanel, arguments: arguments)
: Get.toNamed(
AppRoutes.userProfilePanel,
arguments: arguments,
preventDuplicates: false,
);
}
static startPersonalInfo({
required String userID,
}) =>
Get.toNamed(AppRoutes.personalInfo, arguments: {
'userID': userID,
});
static startFriendSetup({
required String userID,
}) =>
Get.toNamed(AppRoutes.friendSetup, arguments: {
'userID': userID,
});
static startSetFriendRemark() => Get.toNamed(AppRoutes.setFriendRemark, arguments: {});
static startSendVerificationApplication({
String? userID,
String? groupID,
JoinGroupMethod? joinGroupMethod,
}) =>
Get.toNamed(AppRoutes.sendVerificationApplication, arguments: {
'joinGroupMethod': joinGroupMethod,
'userID': userID,
'groupID': groupID,
});
static startGroupProfilePanel({
required String groupID,
required JoinGroupMethod joinGroupMethod,
bool offAndToNamed = false,
}) =>
offAndToNamed
? Get.offAndToNamed(AppRoutes.groupProfilePanel, arguments: {
'joinGroupMethod': joinGroupMethod,
'groupID': groupID,
})
: Get.toNamed(AppRoutes.groupProfilePanel, arguments: {
'joinGroupMethod': joinGroupMethod,
'groupID': groupID,
});
static startMyInfo() => Get.toNamed(AppRoutes.myInfo);
static startEditMyInfo({EditAttr attr = EditAttr.nickname, int? maxLength}) =>
Get.toNamed(AppRoutes.editMyInfo, arguments: {'editAttr': attr, 'maxLength': maxLength});
static startAccountSetup() => Get.toNamed(AppRoutes.accountSetup);
static startBlacklist() => Get.toNamed(AppRoutes.blacklist);
static startLanguageSetup() => Get.toNamed(AppRoutes.languageSetup);
static startUnlockSetup() => Get.toNamed(AppRoutes.unlockSetup);
static startChangePassword() => Get.toNamed(AppRoutes.changePassword);
static startAboutUs() => Get.toNamed(AppRoutes.aboutUs);
static startChatSetup({
required ConversationInfo conversationInfo,
}) =>
Get.toNamed(AppRoutes.chatSetup, arguments: {
'conversationInfo': conversationInfo,
});
static startGroupChatSetup({
required ConversationInfo conversationInfo,
}) =>
Get.toNamed(AppRoutes.groupChatSetup, arguments: {
'conversationInfo': conversationInfo,
});
static startGroupManage({
required GroupInfo groupInfo,
}) =>
Get.toNamed(AppRoutes.groupManage, arguments: {
'groupInfo': groupInfo,
});
static startEditGroupName({required EditNameType type, String? faceUrl}) =>
Get.toNamed(AppRoutes.editGroupName, arguments: {
'type': type,
'faceUrl': faceUrl,
});
static Future<T?>? startGroupMemberList<T>({
required GroupInfo groupInfo,
GroupMemberOpType opType = GroupMemberOpType.view,
}) =>
Get.toNamed(AppRoutes.groupMemberList, preventDuplicates: false, arguments: {
'groupInfo': groupInfo,
'opType': opType,
});
static startSearchGroupMember({
required GroupInfo groupInfo,
GroupMemberOpType opType = GroupMemberOpType.view,
}) =>
Get.toNamed(AppRoutes.searchGroupMember, arguments: {
'groupInfo': groupInfo,
'opType': opType,
});
static startGroupQrcode() => Get.toNamed(AppRoutes.groupQrcode);
static startFriendRequests() => Get.toNamed(AppRoutes.friendRequests);
static startProcessFriendRequests({
required FriendApplicationInfo applicationInfo,
}) =>
Get.toNamed(AppRoutes.processFriendRequests, arguments: {
'applicationInfo': applicationInfo,
});
static startGroupRequests() => Get.toNamed(AppRoutes.groupRequests);
static startProcessGroupRequests({
required GroupApplicationInfo applicationInfo,
}) =>
Get.toNamed(AppRoutes.processGroupRequests, arguments: {
'applicationInfo': applicationInfo,
});
static startFriendList() => Get.toNamed(AppRoutes.friendList);
static startGroupList() => Get.toNamed(AppRoutes.groupList);
static startSearchFriend() => Get.toNamed(AppRoutes.searchFriend);
static startSearchGroup() => Get.toNamed(AppRoutes.searchGroup);
static startSelectContacts({
required SelAction action,
List<String>? defaultCheckedIDList,
List<dynamic>? checkedList,
List<String>? excludeIDList,
bool openSelectedSheet = false,
String? groupID,
String? ex,
}) =>
Get.toNamed(AppRoutes.selectContacts, arguments: {
'action': action,
'defaultCheckedIDList': defaultCheckedIDList,
'checkedList': IMUtils.convertCheckedListToMap(checkedList),
'excludeIDList': excludeIDList,
'openSelectedSheet': openSelectedSheet,
'groupID': groupID,
'ex': ex,
});
static startSelectContactsFromFriends() => Get.toNamed(AppRoutes.selectContactsFromFriends);
static startSelectContactsFromGroup() => Get.toNamed(AppRoutes.selectContactsFromGroup);
static startSelectContactsFromSearchFriends() => Get.toNamed(AppRoutes.selectContactsFromSearchFriends);
static startSelectContactsFromSearchGroup() => Get.toNamed(AppRoutes.selectContactsFromSearchGroup);
static startSelectContactsFromSearch() => Get.toNamed(AppRoutes.selectContactsFromSearch);
static startCreateGroup({
List<UserInfo> defaultCheckedList = const [],
}) async {
final result = await startSelectContacts(
action: SelAction.crateGroup,
defaultCheckedIDList: defaultCheckedList.map((e) => e.userID!).toList(),
);
final list = IMUtils.convertSelectContactsResultToUserInfo(result);
if (list is List<UserInfo>) {
return Get.toNamed(
AppRoutes.createGroup,
arguments: {'checkedList': list, 'defaultCheckedList': defaultCheckedList},
);
}
return null;
}
static startGlobalSearch() => Get.toNamed(AppRoutes.globalSearch);
static startExpandChatHistory({
required SearchResultItems searchResultItems,
required String defaultSearchKey,
}) =>
Get.toNamed(AppRoutes.expandChatHistory, arguments: {
'searchResultItems': searchResultItems,
'defaultSearchKey': defaultSearchKey,
});
static startRegister() => Get.toNamed(AppRoutes.register);
static void startVerifyPhone({
String? phoneNumber,
String? email,
required String areaCode,
required int usedFor,
String? invitationCode,
}) =>
Get.toNamed(AppRoutes.verifyPhone, arguments: {
'phoneNumber': phoneNumber,
'email': email,
'areaCode': areaCode,
'usedFor': usedFor,
'invitationCode': invitationCode,
});
static void startSetPassword({
String? phoneNumber,
String? email,
required String areaCode,
required int usedFor,
required String verificationCode,
String? invitationCode,
}) =>
Get.toNamed(AppRoutes.setPassword, arguments: {
'phoneNumber': phoneNumber,
'email': email,
'areaCode': areaCode,
'usedFor': usedFor,
'verificationCode': verificationCode,
'invitationCode': invitationCode
});
static void startSetSelfInfo({
String? phoneNumber,
String? email,
String? account,
required String areaCode,
required password,
required int usedFor,
required String verificationCode,
String? invitationCode,
}) =>
Get.toNamed(AppRoutes.setSelfInfo, arguments: {
'phoneNumber': phoneNumber,
'email': email,
'account': account,
'areaCode': areaCode,
'password': password,
'usedFor': usedFor,
'verificationCode': verificationCode,
'invitationCode': invitationCode
});
static startForgetPassword() => Get.toNamed(AppRoutes.forgetPassword);
static void startResetPassword({
String? phoneNumber,
String? email,
String? account,
required String areaCode,
required String verificationCode,
}) =>
Get.toNamed(AppRoutes.resetPassword, arguments: {
'phoneNumber': phoneNumber,
'email': email,
'account': account,
'areaCode': areaCode,
'usedFor': 2,
'verificationCode': verificationCode,
});
static startSelectContactsFromTag() => Get.toNamed(AppRoutes.selectContactsFromTag);
}