flutter的路由工具类

路由工具类

直接代码

class NavigatorUtil {
  /// 跳转页面
  static push(BuildContext context, Widget page) async {
    final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => page));
    return result;
  }

  /// 跳转页面
  static pushNamed(BuildContext context, String routeName, {Object arguments,}){
    Navigator.pushNamed(context, routeName, arguments: arguments);
  }

  /// 跳转并有返回值
  static Future<T> getValuePush<T extends Object>(BuildContext context, Widget page, {bool isAnimate = true}) {
    Completer<T> completer = Completer();
    Navigator.push<T>(context, (isAnimate) ? MaterialPageRoute(builder: (context) => page) : AutoRoute(builder: (context) => page)).then((value) {
      completer.complete(value);
    });
    return completer.future;
  }

  /// 跳转并有返回值,根据路由name
  static Future<T> getValuePushName<T extends Object>(BuildContext context, String newPage, {Object arguments,}) {
    Completer<T> completer = Completer();
    Navigator.pushNamed<T>(context, newPage, arguments: arguments).then((value) {
      completer.complete(value);
    });
    return completer.future;
  }

  /// 替代路由,pushReplacement和popAndPushNamed类似,有小差别
  /// pushReplacementNamed:当用户成功登录并且现在在 HomeScreen 上时,您不希望用户还能够返回到 LoginScreen。
  /// 因此,登录应完全由首页替换。另一个例子是从 SplashScreen 转到 HomeScreen。 它应该只显示一次,用户不能再从 HomeScreen 返回它。
  /// 在这种情况下,由于我们要进入一个全新的屏幕,我们可能需要借助此方法。
  ///
  /// popAndPushNamed:假设您正在有一个 Shopping 应用程序,该应用程序在 ProductsListScreen 中显示产品列表,用户可以在 FiltersScreen 中应用过滤商品。
  /// 当用户单击“应用筛选”按钮时,应弹出 FiltersScreen 并使用新的过滤器值推回到 ProductsListScreen。
  /// 这里 popAndPushNamed 显然更为合适。
  /// screen3 screen4
  /// screen2 screen2
  /// screen1 screen1
  static pushReplacement<TO>(BuildContext context, Widget newPage, {TO result}) {
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => newPage,), result: result);
  }

  static pushReplacementNamed<TO>(BuildContext context, String newName, {TO result, Object arguments,}) {
    Navigator.pushReplacementNamed(context, newName, result: result, arguments: arguments);
  }

  /// 替代路由,popAndPushNamed和pushReplacement,有小差别
  /// screen3 screen4
  /// screen2 screen2
  /// screen1 screen1
  static popAndPushNamed<TO>(BuildContext context, String newName, {TO result, Object arguments,}) {
    Navigator.popAndPushNamed(context, newName, result: result, arguments: arguments);
  }

  /// 跳转到指定界面,弹出中间部分
  /// screen4
  /// screen3
  /// screen2 screen5
  /// screen1 screen1 loginScreen
  /// predicate参数 (Route<dynamic> route) => false 能够确保删除先前所有实例,比如上面的loginScreen; ModalRoute.withName('/screen1') 跳转到直到哪个界面停止
  static pushAndRemoveUtil(BuildContext context, Widget newPage, RoutePredicate predicate){
    Navigator.pushAndRemoveUntil(context, new MaterialPageRoute(builder: (_) => newPage), predicate);
  }

  static pushNamedAndRemoveUntil(BuildContext context, String newRouteName, RoutePredicate predicate, {Object arguments,}){
    Navigator.pushNamedAndRemoveUntil(context, newRouteName, predicate, arguments: arguments);
  }

  /// 反复执行pop 直到该函数的参数predicate返回true为止。
  /// screen3
  /// screen2
  /// screen1 screen1
  static popUntil(BuildContext context, String name){
    Navigator.popUntil(context, ModalRoute.withName(name));
  }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值