【问题标题】:How to pass object or list of objects in the Fluro or Flutter route navigator?如何在 Fluro 或 Flutter 路由导航器中传递对象或对象列表?
【发布时间】:2018-12-24 20:32:03
【问题描述】:

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

【问题讨论】:

  • 您可以将列表转换为JSON字符串并传递,参考stackoverflow.com/a/49773862/2863386
  • @ShyjuMadathil 感谢您的回复,我正在测试您的解决方案,我会在看到任何结果后立即通知您
  • 我不喜欢 @ShyjuM 方法的地方在于,您需要对 json 字符串进行编码和解码。不知道为什么它似乎是唯一的方法
  • @MauricioPastorini 另外,如果转换后的 json 有斜线(/),这样做可能会中断
  • @ErfanJazebNikoo 如果您找到任何可靠的解决方案,请发布答案。

标签: dart flutter flutter-dependencies


【解决方案1】:

How to pass JSON response to another view 提出的解决方案有效,除非您的对象有一个字符串(或解码的 JSON 包含)/,正如@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");
}

【讨论】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-29
          • 1970-01-01
          • 2013-11-16
          • 2015-03-06
          • 2016-08-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多