#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. Генераторы для маршрутов ищутся в следующем порядке:
- Для маршрута «/» используется свойство «home», если оно не равно нулю.
- В противном случае используется таблица «маршруты», если в ней есть запись для маршрута.
- В противном случае вызывается onGenerateRoute . Он должен возвращать ненулевое значение для любого допустимого маршрута, не обработанного «home» и «routes».
- Наконец, если все остальное терпит неудачу, вызывается onUnknownRoute . К сожалению, onUnknownRoute не был установлен.
…
Ответ №1:
Это
return CupertinoApp(
home: IOSHomeScreen(),
);
не знает никаких маршрутов, вам нужно предоставить свои маршруты как в materialapp, так и в cupertinoapp, просто сделайте
return CupertinoApp(
routes: {
AnotherPageView.anotherPage: (context) {
return AnotherPageView();
}
},
home: IOSHomeScreen(),
);