import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; import 'package:router/my_router_history_manager.dart'; enum LaunchModel { standard, //默认模式 singleTop, //检查栈顶 singleTask, //检查全栈 } extension GetRouterNavigation on GetInterface { /// 查询指定的RouterName是否存在自己的路由栈中 bool isRouteExist(String routerName) { return MyRouterHistoryManager().isRouteExist(routerName); } /// 查询指定的RouterName是否存在自己的路由栈顶 bool isTopRouteExist(String routerName) { return MyRouterHistoryManager().isTopRouteExist(routerName); } /// 跳转页面SingleTask模式 void _toNamedSingleTask( String routerName, { dynamic arguments, bool preventDuplicates = false, void Function(dynamic value)? cb, Map? parameters, }) { if (isRouteExist(routerName)) { Get.until((route) => route.settings.name == routerName); } else { Get.offNamed( routerName, arguments: arguments, parameters: parameters, preventDuplicates: preventDuplicates, )?.then((value) => { if (cb != null) {cb(value)} }); } } /// 跳转页面SingleTop模式 void _toNamedSingleTop( String routerName, { dynamic arguments, bool preventDuplicates = false, void Function(dynamic value)? cb, Map? parameters, }) async { if (isTopRouteExist(routerName)) { Get.until((route) => route.settings.name == routerName); } else { Get.toNamed( routerName, arguments: arguments, parameters: parameters, preventDuplicates: preventDuplicates, )?.then((value) => { if (cb != null) {cb(value)} }); } } /// 默认的跳转方式,带自己的回调 void _toNamedStandard( String routerName, { dynamic arguments, bool preventDuplicates = false, void Function(dynamic value)? cb, Map? parameters, }) { Get.toNamed( routerName, arguments: arguments, parameters: parameters, preventDuplicates: preventDuplicates, )?.then((value) => { if (cb != null) {cb(value)} }); } /* * 启动新页面 */ void start( String routerName, { LaunchModel launchModel = LaunchModel.standard, dynamic arguments, bool preventDuplicates = false, //默认多实例 void Function(dynamic value)? cb, Map? parameters, }) { //检查栈顶 if (launchModel == LaunchModel.singleTop) { _toNamedSingleTop( routerName, arguments: arguments, cb: cb, parameters: parameters, preventDuplicates: preventDuplicates, ); //检查全栈 } else if (launchModel == LaunchModel.singleTask) { _toNamedSingleTask( routerName, arguments: arguments, cb: cb, parameters: parameters, preventDuplicates: preventDuplicates, ); //默认启动 } else { _toNamedStandard( routerName, arguments: arguments, cb: cb, parameters: parameters, preventDuplicates: preventDuplicates, ); } } /* * 关闭当前启动新页面 */ void startWithPop( String routerName, { dynamic arguments, bool preventDuplicates = false, //默认多实例 void Function(dynamic value)? cb, Map? parameters, }) { Get.offNamed( routerName, arguments: arguments, parameters: parameters, preventDuplicates: preventDuplicates, )?.then((value) => { if (cb != null) {cb(value)} }); } /* * 关闭页面,调用Get的back方法 */ void pop({ T? result, bool closeOverlays = false, bool canPop = true, int? id, }) { Get.back(result: result, closeOverlays: closeOverlays, canPop: canPop, id: id); } /// 通知栏点击跳转到指定页面 void toNamedByNotification( String routerName, { dynamic arguments, void Function(dynamic value)? cb, Map? parameters, }) async { if (MyRouterHistoryManager().routeNames.isEmpty) { //冷启动 if (!kReleaseMode){ print('应用没启动,使用LaunchUrl的方式'); } // String url = 'app://router?name=$routerName'; // if (await canLaunch(url)) { // await launch(url); // } else { // Log.d('无法启动此scheme-host'); // } } else { //正常跳转 if (!kReleaseMode){ print('应用已启动,使用默认路由方式'); } _toNamedSingleTask(routerName); } } }