Как убрать первый экран из маршрута во Флаттере?
Я создаю загрузочный экран для приложения. Этот экран загрузки является первым экраном, который будет показан пользователю. Через 3 секунды страница перейдет на домашнюю страницу. все работает нормально. Но когда пользователь нажимает кнопку "Назад", снова отображается экран загрузки.
КОД ПЕРВОЙ СТРАНИЦЫ
import 'dart:async';
import 'package:flutter/material.dart';
import 'home_page.dart';
void main() {
runApp(MaterialApp(
home: MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
Future.delayed(
Duration(
seconds: 3,
), () {
// Navigator.of(context).pop(); // THIS IS NOT WORKING
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => HomePage(),
),
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlutterLogo(
size: 400,
),
),
);
}
}
ДОМАШНИЙ КОД
import 'package:flutter/material.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Text('HomePage'),
),
),
);
}
}
Я пытался добавить Navigator.of(context).pop();
до вызова HomePage, но это не работает. Это покажет пустой черный экран.
Есть идеи??
1 ответ
Вам нужно использовать pushReplacement, а не просто метод push. Вы можете прочитать об этом здесь: https://docs.flutter.io/flutter/widgets/Navigator/pushReplacement.html
И чтобы решить вашу проблему, просто сделайте, как описано ниже. Просто замените этот код:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => HomePage(),
),
);
с этим:
Navigator. pushReplacement(
context,
MaterialPageRoute(
builder: (context) => HomePage(),
),
);
Да, я обнаружил ту же проблему, что и вы. Проблема с заменой в том, что она работает только один раз, но я не знаю, почему она не работает должным образом. Для этого после нескольких попыток я прочитал официальное руководство, и этот метод существует: pushAndRemoveUntil (). Фактически, нажмите на другой виджет и одновременно удалите все виджеты позади, включая текущий. Вы должны создать только один класс для управления своим корнем через строку. Вот пример:
class RouteGenerator {
static const main_home= "/main";
static Route<dynamic> generatorRoute(RouteSettings settings) {
final args = settings.arguments;
switch (settings.name) {
case main_home:
return MaterialPageRoute(builder: (_) => MainHome());
break;
}
}
}
Этот класс необходимо добавить в Main в:
MaterialApp(onGenerateRoute: ->RouteGenerator.generatorRoute)
Теперь, чтобы использовать этот метод, просто напишите:
Navigator.of(context).pushNamedAndRemoveUntil(
RouteGenerator.main_home,
(Route<dynamic> route) => false
);