配置routes参数
final routes = {
'/': (context) => HomePage(),//根视图
'/takePage': (context, {arguments}) => TakephotoPage(specModel: arguments,),
'/EditPhotoPage': (context, {arguments}) => EditPhotoPage(params: arguments,),
};
// 路由拦截器,只有在MaterialApp的routes属性没有赋值的情况下,才会每次创建页面都触发
// 如果指定了routes属性,那只有routes中查不到的时候才会触发
Route<dynamic> onGenerateRoute(RouteSettings settings) {
String? routeName = settings.name;
// 控制台输出当前拦截的路由名称,方便清晰的理解路由创建流畅
print('当前访问路由名:$routeName');
// 为了避免报错,将在命名路由列表查不到的都指向首页(根页)
if (!routes.containsKey(routeName)) routeName = '/';
// 获取页名对应的类
final Function pageContentBuilder = routes[routeName] as Function;
if (settings.arguments != null) {
// 如果带有参数,则调用该类的时候,需要将参数传递过去
return MaterialPageRoute(
builder: (context) => pageContentBuilder(context, arguments: settings.arguments),
// 这一行是命名路由顺畅应用的关键,否则新创建的页面压入路由栈的将不是自己定义的名字
// 主要是使用 settings.name 的作用,为新创建的页面命名
settings: settings,
);
} else {
// 如果没有带参数,则调用该类的时候,不需要传递参数
return MaterialPageRoute(
builder: (context) => pageContentBuilder(context),
settings: settings,
);
}
}
main函数:
void main() {
runApp(const MYApp());
}
class MYApp extends StatelessWidget {
const MYApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MainPage(),
onGenerateRoute: onGenerateRoute,
);
}
}
使用
单参数
Navigator.pushNamed(context, '/takePage', arguments:"参数");
多参数
String temp = json.encode({
'file':cropedFile,
'specModel':widget.specModel,
});
Navigator.pushNamed(context, '/EditPhotoPage', arguments: temp);
//在下一个页面解码
String params;
//然后赋值
Map<String, dynamic> data = json.decode(widget.params);
网友评论