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");

还有像onGenerateRouteinitialRoute这样的其他参数让我更加困惑。

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 上从静态路由到动态路由的优势的主要内容,如果未能解决你的问题,请参考以下文章

路由基础

浅析静态BGP和动态BGP

配置动态路由的注意事项

华为防火墙静态路由结合多出口选路

静态路由优缺点

动态路由协议(RIP)