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метод. Давай сделаем это.

  1. Перезаписать 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(...
     },
    
  2. Получите аргументы от конструктора виджета:

    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;
           ...
    
  3. И отправка аргументов по крану:

     onTap: () {Navigator.pushNamed(context, ItemPageProfileScreen.id, arguments: 'MyTestString');}
    

Надеюсь это поможет.

Другие вопросы по тегам