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;
}