考虑您使用Navigator.push()
许多小部件:
// inside widget A:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
// inside widget B:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
// inside widget C:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
现在假设您需要更改您的应用程序并且小部件SecondRoute
需要在其构造函数上接收一个值。现在您遇到了一个问题,因为您在多个位置有相同代码的多个副本,您需要确保更新所有这些副本,这可能很乏味且容易出错:
// inside widget A:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute(
title: 'Title A',
)),
);
// inside widget B:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute(
title: 'Title B',
)),
)),
);
// inside widget C:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute(
title: 'Title A', // ERROR! Forgot to change the variable after a copy/paste
)),
)),
);
现在让我们考虑使用命名路线。
首先,我绝不会建议任何人直接使用该名称进行导航,而是使用static
变量引用,这样如果您将来需要更改它,它的方式会更简单、更安全,因为您不会忘记在任何地方更新它,像这样:
class Routes {
static const String second = '/second';
}
另一种方法是在路由本身内部有一个引用,一个static const String
inside SecondRoute
,所以我们可以将它用作SecondRoute.routeName
。这是个人喜好IMO的问题。
然后您的小部件将使用以下方式导航:
// inside widget A:
Navigator.pushNamed(context, Routes.second); // Routes.second is the same as '/second'
// inside widget B:
Navigator.pushNamed(context, Routes.second);
// inside widget C:
Navigator.pushNamed(context, Routes.second);
现在,如果您需要SecondRoute
在创建时传递一个参数,您MaterialApp
onGenerateRoute
可以使用. 您的代码将更改为:
// inside widget A:
Navigator.pushNamed(context, Routes.second, arguments: 'Title A');
// inside widget B:
Navigator.pushNamed(context, Routes.second, arguments: 'Title B');
// inside widget C:
// You can still make mistakes here, but the chances are smaller.
Navigator.pushNamed(context, Routes.second, arguments: 'Title C');
MaterialApp(
onGenerateRoute: (settings) {
if (settings.name == Routes.second) {
final String title = settings.arguments;
return MaterialPageRoute(
builder: (context) => SecondRoute(title: title),
);
}
},
);
重复代码的数量减少了,但另一方面,onGenerateRoute
当您制作更多路线时,代码变得更加复杂,因为它们的所有创建都将集中在那里,所以恕我直言,这更多的是个人偏好而不是一般准则。