Я использовал пакет Fluro внутри своего приложения Flutter, и я реализовал все свои маршруты с помощью такого обработчика, как пример этого пакета. Не могли бы вы сообщить мне, как правильно передавать объект или список объектов между маршрутами?
Как передать объект или список объектов в навигаторе маршрутов Fluro или Flutter?
Ответы (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);
});
Решение, представленное на странице Как передать ответ 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");
}
Просто боролся с этим и нашел решение. Ты можешь сделать это:
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 этого нет, это решение не совсем ужасное.
Раньше я передавал данные в виде закодированного формата 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 Chirag Mittal   schedule 12.05.2020