Flutter 的路由是透过 Navigator 以栈的方式管理画面上的呈现。
Overlay
处理栈的内容。MaterialPageRoute
。将画面新加到 Navigator 的 stack 上
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return SomeScreen();
}),
);
使用命名路由的方式创建路由设定,就可以使用名称的方式进行切换。
Navigator.pushNamed(context, '/time'),
将 stack 最後的路由设定从 Navigator 上移除
Navigator.pop(context);
使用命名路由的方式在程序架构的维护上会比较清楚
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Welcome to Flutter',
initialRoute: '/',
routes: {
'/': (context) => HomeScreen(),
'/time': (context) => TimeScreen(),
'/text': (context) => TextScreen(),
'/image': (context) => ImageScreen(),
'/icon': (context) => IconScreen(),
'/button': (context) => ButtonScreen(),
'/form': (context) => FormScreen(),
'/layout': (context) => LayoutScreen(),
'/container': (context) => ContainerScreen(),
'/listview': (context) => ListViewScreen(),
'/gridview': (context) => GridViewScreen(),
'/datetimepicker': (context) => DateTimePickerScreen(),
'/sliver': (context) => SliverScreen(),
},
);
}
}
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return SomeScreen(title: "Navigator");
}),
);
pushNamed
的第三个参数可以接收 Object
型别的 arguments
static Future<T?> pushNamed<T extends Object?>(
BuildContext context,
String routeName, {
Object? arguments,
}) {
return Navigator.of(context).pushNamed<T>(routeName, arguments: arguments);
}
使用方式
Navigator.pushNamed(context, '/time', DateTime.now())
@override
Widget build(BuildContext context) {
var args = ModalRoute.of(context)!.settings.arguments;
...
}
使用第二参数回传结果
@optionalTypeArgs
static void pop<T extends Object?>(BuildContext context, [ T? result ]) {
Navigator.of(context).pop<T>(result);
}
回传结果
Navigator.pop(context, false);
使用 await 接收 pop 回来的参数资料
var result = await Navigator.pushNamed(context, '/next')
Navigator 1.0 的使用上很直觉,如果你想要切换路由时使用 push
和 pop
即可,如果使用命名式的路由在维护的管理上会更加统一,也可以使用onGenerateRoute
的 hook 进行建构路由设定前的权限检查。
<<: Day 11 - Using CKEditor + CKFinder WYSIWYG Editor with ASP.NET Web Forms C# 在网页嵌入 WYSIWYG 文字编辑器
今天来学最常用到也最实用的Button按钮元件 我们经常需要点击按钮来做某个或多个事件 这时就需要设...
前言 今天要来讲的是Flex 弹性盒子~,优势就是快速的水平垂直排版、置中,又可以适应不同的萤幕尺寸...
ransack是一个基於Model层级的Gem,使用Ransack,可以将原本的Sql Statem...
今天是最後一天了,每天看这本书《听说做完380个实例,就能成为.NET Core大内高手》,真的里面...
网格机器人改成一周开启一次就好,到周五机器人会自动关闭 ...