如何在 Fluro 或 Flutter 路由导航器中传递对象或对象列表?

How to pass object or list of objects in the Fluro or Flutter route navigator?

我在我的 Flutter 应用程序中使用了 Fluro 包,并且我使用一个处理程序实现了我的所有路由,就像这个包的示例一样。 您能否告诉我在路由之间传递对象或对象列表的正确方法是什么?

除非您的对象有一个字符串(或解码的 JSON 包含)/,否则 How to pass JSON response to another view 中提供的解决方案有效,如 @Chirag 所说。

我给出了我的解决方案,因为我的对象内部有一个 URL。

给定路由器:

_router.define("/groups/:group", handler: Handler(handlerFunc: (context, params) {
  String param = params["group"][0];
  GroupAPIModel group = GroupAPIModel.fromJson(decodeJsonDataForFluro(param));
  return GroupDetailsScreen(group);
}));

正在定义:

String encodeJsonDataForFluro(Map<String, dynamic> mapToEncode) {
  return jsonEncode(mapToEncode).replaceAll("/", HtmlEscape().convert("/"));
} 

Map<String, dynamic> decodeJsonDataForFluro(String encodedMap) {
  return jsonDecode(encodedMap.replaceAll(HtmlEscape().convert("/"), "/"));
}

此方法将到达该路线:

void _onGroupClicked(GroupAPIModel group) {
  String bodyJson = encodeJsonDataForFluro(group.toJson());
  router.navigateTo(context: context, path: "/groups/$bodyJson");
}

刚刚为此苦苦挣扎并找到了解决方案。你可以这样做:

Object object = <Your Object>
Navigator.of(context).pushNamed("/page/" + object.id.toString(),
        arguments: object);

然后像这样访问 Fluro 中的自定义对象:

  static void setupRouter() {
    router.define("page/:pageId", handler: _pageHandler);
  }

  static Handler _pageHandler =
      Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    Object object = ModalRoute.of(context).settings.arguments;
    return Widget(object);
  });

虽然 Fluro 没有这个,但这是一个并不完全糟糕的解决方案。

你可以通过 ModalRoute.of(context).settings.arguments

所以如果你有对象:

class ScreenArguments {
  final String title;
  ScreenArguments(this.title);
}

导航方式:

Navigator.of(context).pushNamed("/screen", arguments: ScreenArguments("Title"));

并在处理程序中:

static Handler _screenHandler = Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    final ScreenArguments args = ModalRoute.of(context).settings.arguments;
    return PassArgumentsScreen(args?.title);
});

我曾经像这个问题中的所有其他解决方案一样将数据作为编码 JSON 和字符串格式传递。最近,Fluro 插件提供了一种在路由之间将参数作为 class 对象传递的方法,就像 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 路由并将有关用户的信息传递到该路由。

要传递不同的数据,创建一个 class 来存储这些信息。

// 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.',
      ),
    );