5

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

4

4 回答 4

4

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

于 2020-08-30T05:11:47.327 回答
2

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

我正在提供我的解决方案,因为我的对象内部有一个 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");
}
于 2020-07-16T18:22:15.233 回答
2

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

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

于 2020-08-15T13:03:08.013 回答
2

我曾经像这个问题中的所有其他解决方案一样将数据作为编码的 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 navigator 而不是 Fluro 插件,请使用此链接或检查以下方法。

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.',
      ),
    );
于 2021-03-08T13:24:44.493 回答