如何从 Flutter 中的路由中删除第一个屏幕?
How to remove the first screen from route in Flutter?
我正在为应用创建加载屏幕。此加载屏幕是向用户显示的第一个屏幕。 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();
,但这不起作用。这将显示一个空白的黑屏。
有什么想法吗??
您需要使用 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(),
),
);
是的,我发现了和你一样的问题。 replace 的问题是它只能工作一次,但我不知道为什么它不能正常工作。为此,经过几次尝试,我阅读了官方指南,发现这个方法是存在的:pushAndRemoveUntil()。其实就是推另一个widget,同时把后面的widget全部移除,包括当前的widget。您必须只创建一个 Class 来通过字符串管理您的根目录。这是示例:
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;
}
}
}
这个 class 必须添加到 Main 中:
MaterialApp( onGenerateRoute: ->RouteGenerator.generatorRoute)
现在要使用这个方法,只需写:
Navigator.of(context).pushNamedAndRemoveUntil(
RouteGenerator.main_home,
(Route<dynamic> route) => false
);
我正在为应用创建加载屏幕。此加载屏幕是向用户显示的第一个屏幕。 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();
,但这不起作用。这将显示一个空白的黑屏。
有什么想法吗??
您需要使用 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(),
),
);
是的,我发现了和你一样的问题。 replace 的问题是它只能工作一次,但我不知道为什么它不能正常工作。为此,经过几次尝试,我阅读了官方指南,发现这个方法是存在的:pushAndRemoveUntil()。其实就是推另一个widget,同时把后面的widget全部移除,包括当前的widget。您必须只创建一个 Class 来通过字符串管理您的根目录。这是示例:
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;
}
}
}
这个 class 必须添加到 Main 中:
MaterialApp( onGenerateRoute: ->RouteGenerator.generatorRoute)
现在要使用这个方法,只需写:
Navigator.of(context).pushNamedAndRemoveUntil(
RouteGenerator.main_home,
(Route<dynamic> route) => false
);