5

我可以看到该MaterialApp应用程序可以接收路线。

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.有什么区别?

4

1 回答 1

13

答案更多在于你的架构而不是任何东西。

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

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

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

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

  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);
于 2020-08-02T19:18:53.623 回答