在Flutter中route是一个绕不开必须面对并且很常用的东西。
Route就是路由,顾名思义,负责你页面之间的跳转。
路由分静态路由和动态路由。
- 静态路由: 不需要传参的,这样等二路由可以直接定义在MaterialApp/WidgetApp里,这样可以通过Navigator.pushNamed使用。
- 动态路由: 就是传入一个动态路由并且带参数,或者你自定义的。
在这里我们可以使用一个工具类来实现跳转,因为我们在实际项目和开发工程的时候,我们使用到的路由大部分是动态的,也就是需要传参数的,所以工具类中只包含了静态路由
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class RouteHelper{
static Future<T> pushWidget<T>(
BuildContext context,
Widget widget,{
bool replaceRoot = false,
bool replaceCurrent =false,
}){
return pushRoute(
context,
MaterialPageRoute(builder: (context) => widget),
replaceRoot: replaceRoot,
replaceCurrent: replaceCurrent,
);
}
static Future<T> pushRoute<T>(
BuildContext context,
PageRoute<T> route,{
bool replaceRoot = false,
bool replaceCurrent = false,
}){
assert(!(replaceRoot == true && replaceCurrent == true));
if(replaceRoot == true){
return Navigator.pushAndRemoveUntil(
context,
route,
_rootRoute
);
}
if(replaceCurrent == true){
return Navigator.pushReplacement(context, route);
}
return Navigator.push(context, route);
}
}
var _rootRoute = ModalRoute.withName("home");
解读这个类,有两个方法一个是接收PageRoute,一个是接收Widget。
接收Widget的是讲Widget包装MaterialPageRoute,然后传给另一个方法。
另一个方法包含三种情况,一种是替换根节点,一种是替换当前页面,还有一种就是我们最平常的push。
他们会根据传参的不同返回不同的方法。
我们还有一个_rootRoute
变量,这个变量的目的是用于替换根节点“home”
是我们定义在MaterialApp里的initialRoute,这样一一对应才能保证替换根节点。
当然这个类也可以继续扩展,比如将routes定义在内,然后传route name参数,接着通过routes来提取出named对应的Widget/Route接着传入pushRoute方法进行跳转即可。
这个简便的Helper还有另一个好处,就是可以方法后续批量替换Route实现,比如有一天你想自定义一个PageRoute,不适用MaterialPageRoute,那么你只需要替换pushRoute的第二个参数MaterialPageRoute即可。
当然这种方法也是可以接受返回值的。
RouteHelper.pushWidget(context, SecPage(param: '...')).then((value){
print('返回带的参数====>$value');
});
具体使用性如何就看个人了,我个人觉得这样不错,就算是加动画效果我们可以在类里面自己改就好了。而且还不需要任何依赖!!!
这是我认识的一位大佬写的类,有兴趣的可以去读读大作,他的一些开源库在pub的评分超高!!!!
大佬博客地址