Почему Navigator.pushNamed(контекст, «маршрут»); не работает в моем примере кода flutter-cupertino-app?

#flutter #dart

#флаттер #dart

Вопрос:

это мой первый вопрос, и я надеюсь, что он читаем. Я создал пример проекта flutter, в котором я проиллюстрировал проблему, указанную в моем вопросе. Если код выполняется на Android, объект AndroidAppVersion создает приложение Material, которое содержит объект AndroidHomeScreen с красной рамкой и кнопкой с заголовком «Android». Когда пользователь нажимает кнопку, появляется другой объект PageView, содержащий оранжевый каркас. Объект AnotherPageView — это всего лишь пример страницы. Если платформа не Android, (IOS-) Cupertino-приложение будет создано IOSAppVersion-объектом, который содержит IOSHomeScreen с зеленым каркасом и кнопкой с заголовком «IOS». Снова пользователь нажимает кнопку, чтобы создать AnotherPageView-объект.

Итак, вот в чем проблема: когда я использую
Navigator.pushNamed(context, AnotherPageView.anotherPage); Код не работает и выдает ошибку, которую я добавил ниже. Однако это работает, если я использую

 Navigator.push(context,
    CupertinoPageRoute(builder: (context) => AnotherPageView()));
  

но я хотел бы знать, почему это не работает с первым.

Код:

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:io';

void main() {
  runApp(Platform.isAndroid ? IOSAppVersion() : AndroidAppVersion());
}

class AndroidAppVersion extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        AnotherPageView.anotherPage: (context) {
          return AnotherPageView();
        }
      },
      home: AndroidHomeScreen(),
    );
  }
}

class AndroidHomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.red,
      body: MaterialButton(
        onPressed: () {
          Navigator.pushNamed(context, AnotherPageView.anotherPage);
        },
        child: Center(
          child: Text('Android'),
        ),
      ),
    );
  }
}

class IOSAppVersion extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      home: IOSHomeScreen(),
    );
  }
}

class IOSHomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.green,
      body: CupertinoButton(
        child: Center(child: Text('Hallo IOS')),
        onPressed: () {
          Navigator.pushNamed(context, AnotherPageView.anotherPage);
        },
      ),
    );
  }
}

class AnotherPageView extends StatelessWidget {
  static String anotherPage = "anotherPage";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.orange,
    );
  }
}
  

Вот ошибка, которая отображается:

При обработке жеста было выдано следующее утверждение: не удалось найти генератор для RouteSettings маршрута («anotherPage», null) в _WidgetsAppState. Генераторы для маршрутов ищутся в следующем порядке:

  1. Для маршрута «/» используется свойство «home», если оно не равно нулю.
  2. В противном случае используется таблица «маршруты», если в ней есть запись для маршрута.
  3. В противном случае вызывается onGenerateRoute . Он должен возвращать ненулевое значение для любого допустимого маршрута, не обработанного «home» и «routes».
  4. Наконец, если все остальное терпит неудачу, вызывается onUnknownRoute . К сожалению, onUnknownRoute не был установлен.

Ответ №1:

Это

 return CupertinoApp(
  home: IOSHomeScreen(),
);
  

не знает никаких маршрутов, вам нужно предоставить свои маршруты как в materialapp, так и в cupertinoapp, просто сделайте

 return CupertinoApp(
      routes: {
        AnotherPageView.anotherPage: (context) {
          return AnotherPageView();
        }
      },
      home: IOSHomeScreen(),
    );