Flutter 路由跳转

Flutter跳转

void main() => runApp(new TestOne());

class TestOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "主页",
      routes: {
        "/": (context) => MainPage(),
        "/NewRoutePage": (context) => NewRoutePage(),
        "/NewRouteParameterPage": (context) => NewRouteParameterPage(),
        "/NewRouteAndReplacePage": (context) => NewRouteAndReplacePage(),
        "/NewRouteAndRemoveUntilPage": (context) => NewRouteAndRemoveUntilPage(),
      },
      onGenerateRoute: (RouteSettings settings){
        WidgetBuilder builder;
        switch(settings.name){
          case '/signup/personal_info':
            builder = (BuildContext _) => NewRouteOnGeneratePage();
            break;
          default:
            throw Exception('Invaild route  ${settings.name}');
            break;
        }
        return MaterialPageRoute(builder: builder, settings: settings);
      },
    );
  }
}

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("主页"),),
      body: Column(
        children: <Widget>[
          RaisedButton(onPressed: () async {
            Navigator.pushNamed(context, "/NewRoutePage");
          },
            child: Text("不带参数路由跳转"),
          ),
          RaisedButton(onPressed: () async {
            Navigator.pushNamed(context,
                "/NewRouteParameterPage",
                arguments: <String, String>{
                  'srt1': '我是参数',
                });
            // 带参数的路由跳转,并且监听返回
            // Navigator.push(context,
            //     new MaterialPageRoute(
            //     builder: (context) =>  NewRouteParameterPage(),
            // )).then((rse){
            //   //获取返回处理
            // });
            //Navigator.of(context).pop({"res" : "parameter"});
          }, child: Text("带参数路由跳转"),
          ),
          RaisedButton(onPressed: () async {
            Navigator.pushReplacementNamed(context, "/NewRouteAndReplacePage");
          }, child: Text("跳转新页面并且替换,比如登录跳转主页"),
          ),
          RaisedButton(onPressed: () async {
            Navigator.pushNamedAndRemoveUntil(context,
                "/NewRouteAndRemoveUntilPage",
                //关闭给定路由之前的有所路由
                // ModalRoute.withName("you keep stack parameter")

                //true 保留跳转的当前栈
                (route) => false,
              arguments: {"parameter" : "you parameter"}
            );
            },
            child: Text("跳转到新的路由,并且关闭给定路由之前的有所路由"),
          ),
          RaisedButton(onPressed: () async {
            Navigator.pushNamed(context, "/signup/personal_info");
          }, child: Text("onGenerateRoute"),
          ),
        ],
      ),
    );
  }
}

pushAndRemoveUntil:
如何保留哪个栈之前的还要后续再看看

 @optionalTypeArgs
  Future<T> pushAndRemoveUntil<T extends Object>(Route<T> newRoute, RoutePredicate predicate) {
    assert(!_debugLocked);
    assert(() {
      _debugLocked = true;
      return true;
    }());

    // The route that is being pushed on top of
    final Route<dynamic> precedingRoute = _history.isNotEmpty ? _history.last : null;
    final OverlayEntry precedingRouteOverlay = _currentOverlayEntry;

    // Routes to remove
    //需要移除的route列表
    final List<Route<dynamic>> removedRoutes = <Route<dynamic>>[];
    while (_history.isNotEmpty && !predicate(_history.last)) {
      final Route<dynamic> removedRoute = _history.removeLast();
      assert(removedRoute != null && removedRoute._navigator == this);
      assert(removedRoute.overlayEntries.isNotEmpty);
      removedRoutes.add(removedRoute);
    }

    // Push new route
    assert(newRoute._navigator == null);
    assert(newRoute.overlayEntries.isEmpty);
    final Route<dynamic> newPrecedingRoute = _history.isNotEmpty ? _history.last : null;
    newRoute._navigator = this;
    newRoute.install(precedingRouteOverlay);
    _history.add(newRoute);

    newRoute.didPush().whenCompleteOrCancel(() {
      if (mounted) {
        for (Route<dynamic> removedRoute in removedRoutes) {
        //移除
          for (NavigatorObserver observer in widget.observers)
            observer.didRemove(removedRoute, newPrecedingRoute);
          removedRoute.dispose();
        }

        if (newPrecedingRoute != null)
          newPrecedingRoute.didChangeNext(newRoute);
      }
    });

    // Notify for newRoute
    newRoute.didChangeNext(null);
    for (NavigatorObserver observer in widget.observers)
      observer.didPush(newRoute, precedingRoute);

    assert(() {
      _debugLocked = false;
      return true;
    }());
    _afterNavigation(newRoute);
    return newRoute.popped;
  }

demo地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值