【问题标题】:Advantage from static routing to dynamic routing on FlutterFlutter 上从静态路由到动态路由的优势
【发布时间】: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.有什么区别?

【问题讨论】:

    标签: flutter flutter-routes


    【解决方案1】:

    答案更多在于您的架构。

    1.在管理项目复杂性方面,静态路由是两者中的佼佼者。路线定义清晰,供多个开发者理解,导航代码也简单多了,Navigator.of(context).pushNamed('your-route'); vs

    Navigator.push(
       context,
       MaterialPageRoute(builder: (context) => SecondRoute()),
     );
    

    2。动态页面 通常用于教程等以减少样板代码。它只是导航的快捷方式。这样做的缺点是变得难以管理路线,因此应仅限于简短的教程。

    3. Generated Routes 还有第三个选项,在我看来是两者中最好的,那就是 Generated Routes。这是最干净和最容易维护的结构。有一个很棒的教程here 关于它。这是纲要:

    1. 声明路线:
    class RoutePaths {
      static const Start = '/';
      static const SecondScreen = 'second'
    }
    
    1. 声明您的路由器:
    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}'),
                      ),
                    ));
        }
      }
    }
    
    
    1. 在 main.dart 中声明
    initialRoute: RoutePaths.Start,
    onGenerateRoute: Router.generateRoute,
    
    1. 导航
    // arguments: event is an optional parameter to send to secondScreen
    Navigator.of(context).pushNamed(RoutePaths.SecondScreen, arguments: event);
    

    【讨论】:

    • 感谢您的回答
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多