Flutter 上从静态路由到动态路由的优势
Posted
技术标签:
【中文标题】Flutter 上从静态路由到动态路由的优势【英文标题】:Advantage from static routing to dynamic routing on Flutter 【发布时间】:2020-11-22 22:59:19 【问题描述】:我可以看到MaterialApp
app 可以接收路由。
1。静态路由
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
routes:
'/page1': (context) => Page1(title: "Main page"),
...
并从小部件中显示它们,例如:
myKey.currentState.pushNamed("/page1");
还有像onGenerateRoute
和initialRoute
这样的其他参数让我更加困惑。
2。动态页面
onPressed: ()
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
问题
我想知道这个参数的含义是什么,让MaterialApp
承担这个“责任”,为什么我们应该这样做,可能与内存管理或Widget
生命周期如何工作有关,或者什么?
1.和2.有什么区别?
【问题讨论】:
【参考方案1】:答案更多在于您的架构。
1.在管理项目复杂性方面,静态路由是两者中的佼佼者。路线定义清晰,供多个开发者理解,导航代码也简单多了,Navigator.of(context).pushNamed('your-route');
vs
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
2。动态页面 通常用于教程等以减少样板代码。它只是导航的快捷方式。这样做的缺点是变得难以管理路线,因此应仅限于简短的教程。
3. Generated Routes 还有第三个选项,在我看来是两者中最好的,那就是 Generated Routes。这是最干净和最容易维护的结构。有一个很棒的教程here 关于它。这是纲要:
-
声明路线:
class RoutePaths
static const Start = '/';
static const SecondScreen = 'second'
-
声明您的路由器:
class Router
static Route<dynamic> generateRoute(RouteSettings settings)
switch (settings.name)
case RoutePaths.Start:
return MaterialPageRoute(builder: (_) => YourFirstScreenWidget());
case RoutePaths.SecondScreen:
// you can do things like pass arguments to screens
final event = settings.arguments as Event;
return MaterialPageRoute(
builder: (_) => YourSecondScreenWidget(event: event));
default:
return MaterialPageRoute(
builder: (_) => Scaffold(
body: Center(
child: Text('No route defined for $settings.name'),
),
));
-
在 main.dart 中声明
initialRoute: RoutePaths.Start,
onGenerateRoute: Router.generateRoute,
-
导航
// arguments: event is an optional parameter to send to secondScreen
Navigator.of(context).pushNamed(RoutePaths.SecondScreen, arguments: event);
【讨论】:
感谢您的回答以上是关于Flutter 上从静态路由到动态路由的优势的主要内容,如果未能解决你的问题,请参考以下文章