Flutter передать аргумент напрямую с именованными маршрутами навигации
Я искал все ответы здесь, чтобы передать аргументы при выполнении именованной навигации по маршруту, но они кажутся старыми или не работают.
Из того, что было написано, это должно работать, но, похоже, ничего не делает, поэтому я не уверен, где моя ошибка.
Вот как у меня это настроено:
Main.dart (с моей настройкой названных маршрутов):
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primaryColor: Colors.white,
),
initialRoute: HomePageScreen.id,
routes: {
HomePageScreen.id: (context) => HomePageScreen(),
AddItemScreen.id: (context) => AddItemScreen(),
AdvertiseScreen.id: (context) => AdvertiseScreen(),
HomePageFilterScreen.id: (context) => HomePageFilterScreen(),
HomePageResultsScreen.id: (context) => HomePageResultsScreen(),
ItemPageProfileScreen.id: (context) => ItemPageProfileScreen(),
ItemPageProfileSuggestUpdateScreen.id: (context) => ItemPageProfileSuggestUpdateScreen(),
ItemPageWhereToBuyAddStoreToDatabaseScreen.id: (context) => ItemPageWhereToBuyAddStoreToDatabaseScreen(),
ItemPageWhereToBuyMapScreen.id: (context) => ItemPageWhereToBuyMapScreen(),
ItemPageWhereToBuyScreen.id: (context) => ItemPageWhereToBuyScreen(),
MenuScreen.id: (context) => MenuScreen(),
NotAvailableScreen.id: (context) => NotAvailableScreen(),
TermsScreen.id: (context) => TermsScreen(),
}
);
}
}
HomePageResultsScreen.dart (При нажатии кнопки я использую push named для перехода на следующую страницу, это работает, потому что открывается новая страница ItemPageProfileScreen):
onTap: () {
Navigator.pushNamed(context, ItemPageProfileScreen.id, arguments: 'MyTestString');
}
ItemPageProfileScreen.dart (я пытался использовать MaterialApp onGenerateRoute для получения аргументов и печати на экране для тестирования, но он не работает):
class ItemPageProfileScreen extends StatefulWidget {
static const String id = 'item_page_profile_screen';
@override
_ItemPageProfileScreenState createState() => _ItemPageProfileScreenState();
}
class _ItemPageProfileScreenState extends State<ItemPageProfileScreen> {
@override
Widget build(BuildContext context) {
MaterialApp(
onGenerateRoute: (routeSettings){
final arguments = routeSettings.arguments;
print(arguments.toString());
},
);
return Scaffold(),
Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ Вторая попытка:
class ItemPageProfileScreen extends StatefulWidget {
final String argument;
ItemPageProfileScreen(this.argument);
static const String id = 'item_page_profile_screen';
@override
_ItemPageProfileScreenState createState() => _ItemPageProfileScreenState();
}
class _ItemPageProfileScreenState extends State<ItemPageProfileScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: <Widget>[
Text(widget.argument),
0 ответов
Есть официальная статья о том, как передавать аргументы с помощью именованной маршрутизации. https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
Основная идея довольно проста: передать аргументы в конструктор виджета экрана.
В официальных документах (по ссылке выше) фактически использовались оба подхода с именованной маршрутизацией и с обычной маршрутизацией, хотя в статье говорилось об именованной маршрутизации.
В любом случае. Сосредоточьтесь на конструкторе и аргументах.
Где вы можете получить доступ к конструктору вашего экрана с именованной маршрутизацией, если вы передадите только имя маршрута при навигации? ВonGenerateRoute
метод. Давай сделаем это.
Перезаписать
onGenerateRoute
в вашем верхнем экране MyApp (вот где была ваша ошибка). И если вы это сделаете, вам не нужноroutes: {}
там (ваша вторая ошибка)class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primaryColor: Colors.white, ), initialRoute: HomePageScreen.id, onGenerateRoute: (settings) { if(settings.name == ItemPageProfileScreen.id) { String msg = settings.arguments; return MaterialPageRoute(builder: (_) => ItemPageProfileScreen(msg)); } else if(... },
Получите аргументы от конструктора виджета:
class ItemPageProfileScreen extends StatefulWidget { final String argument; ItemPageProfileScreen(this.argument); static const String id = 'item_page_profile_screen'; @override _ItemPageProfileScreenState createState() => _ItemPageProfileScreenState(); } class _ItemPageProfileScreenState extends State<ItemPageProfileScreen> { @override Widget build(BuildContext context) { String msg = widget.argument; ...
И отправка аргументов по крану:
onTap: () {Navigator.pushNamed(context, ItemPageProfileScreen.id, arguments: 'MyTestString');}
Надеюсь это поможет.