Как передать объект или список объектов в навигаторе маршрутов Fluro или Flutter?

Я использовал пакет Fluro внутри своего приложения Flutter, и я реализовал все свои маршруты с помощью такого обработчика, как пример этого пакета. Не могли бы вы сообщить мне, как правильно передавать объект или список объектов между маршрутами?


person Erfan Jazeb Nikoo    schedule 17.07.2018    source источник
comment
вы можете преобразовать список в строку JSON и передать ее, см. stackoverflow.com/a/49773862/2863386   -  person Shyju M    schedule 18.07.2018
comment
@ShyjuMadathil Спасибо за ваш ответ, я тестирую ваше решение, я сообщу вам, как только увижу какие-либо результаты   -  person Erfan Jazeb Nikoo    schedule 18.07.2018
comment
Что мне не нравится в подходе @ShyjuM, так это то, что у вас есть накладные расходы на кодирование и декодирование строк json. Не уверен, почему это кажется единственным способом   -  person Mauricio Pastorini    schedule 19.03.2019
comment
@MauricioPastorini Кроме того, это может сломаться, если преобразованный json имеет косую черту (/)   -  person Chirag Mittal    schedule 12.05.2020
comment
@ErfanJazebNikoo Если вы нашли надежное решение, напишите ответ.   -  person Chirag Mittal    schedule 12.05.2020
comment
@ChiragMittal Я думаю, что нашел надежное решение. Разместил ответ ниже.   -  person Florian    schedule 15.08.2020


Ответы (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);
});

person Nuts    schedule 30.08.2020

Решение, представленное на странице Как передать ответ JSON другому представлению работает, если ваш объект не имеет строки (или декодированного 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");
}
person Rafael Ruiz Muñoz    schedule 16.07.2020

Просто боролся с этим и нашел решение. Ты можешь сделать это:

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 этого нет, это решение не совсем ужасное.

person Florian    schedule 15.08.2020

Раньше я передавал данные в виде закодированного формата JSON и String, как и все другие решения в этом вопросе. Недавно плагин 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 используйте этот ссылка или проверьте следующий подход.

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.',
      ),
    );
person Erfan Jazeb Nikoo    schedule 08.03.2021