我曾经像这个问题中的所有其他解决方案一样将数据作为编码的 JSON 和字符串格式传递。最近,Fluro 插件提供了一种将参数作为类对象在路由之间传递的方式,就像 Flutter 导航器一样。
使用自定义RouteSettings 推送路由后,您可以使用BuildContext.settings 扩展名来提取设置。通常这将在Handler.handlerFunc 中完成,因此您可以将RouteSettings.arguments 传递给您的屏幕小部件。
/// Push a route with custom RouteSettings if you don't want to use path params
FluroRouter.appRouter.navigateTo(
context,
'home',
routeSettings: RouteSettings(
arguments: MyArgumentsDataClass('foo!'),
),
);
/// Extract the arguments using [BuildContext.settings.arguments] or [BuildContext.arguments] for short
var homeHandler = Handler(
handlerFunc: (context, params) {
final args = context.settings.arguments as MyArgumentsDataClass;
return HomeComponent(args);
},
);
如果使用 Flutter 导航器而不是 Fluro 插件,请使用 link 或检查以下方法。
Navigator 提供了使用通用标识符从应用程序的任何部分导航到命名路由的能力。在某些情况下,您可能还需要将参数传递给命名路由。例如,您可能希望导航到 /user 路由并将有关用户的信息传递到该路由。
要传递不同的数据,请创建一个存储此信息的类。
// You can pass any object to the arguments parameter.
// In this example, create a class that contains a customizable
// title and message.
class ScreenArguments {
final String title;
final String message;
ScreenArguments(this.title, this.message);
}
现在您需要使用ModalRoute 定义一个处理程序:
static Handler _screenHandler = Handler(
handlerFunc: (BuildContext context, Map<String, dynamic> params) {
final ScreenArguments args = ModalRoute
.of(context)
.settings
.arguments;
return PassArgumentsScreen(args?.title);
});
然后导航:
Navigator.pushNamed(
context,
"/screen",
arguments: ScreenArguments(
'Class Arguments Screen',
'This message is extracted in the build method.',
),
);