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

时间:2018-07-17 08:09:18

标签: dart flutter flutter-dependencies

我已经在我的Flutter应用程序中使用了Fluro包,并且使用了类似于该包示例的处理程序来实现了所有路由。 您能否让我知道在路线之间传递对象或对象列表的正确方法是什么?

4 个答案:

答案 0 :(得分:2)

除非您的对象具有@Chirag所说的/字符串(或解码的JSON包含),否则在How to pass JSON response to another view处提出的解决方案是有效的。

我正在提供自己的解决方案,因为我的对象内部有一个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");
}

答案 1 :(得分:1)

为此苦苦挣扎,找到了解决方案。您可以这样做:

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没有此功能,但这并不是一个完全糟糕的解决方案。

答案 2 :(得分:1)

我曾经像这个问题中的所有其他解决方案一样,将数据作为编码的 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.',
      ),
    );

答案 3 :(得分:0)

您可以通过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);
});