flutter - 如果用户按下后退按钮,则阻止 Navigator.push
问题描述
在我的应用程序中,我需要在 call 之前执行代码Navigator.push
。但问题是如果用户在执行代码之前按下后退按钮,则会出现错误:
E/flutter(8415):[错误:flutter/lib/ui/ui_dart_state.cc(148)]未处理的异常:查找已停用小部件的祖先是不安全的。E/flutter (8415):此时小部件的元素树的状态不再稳定。E/flutter (8415):要在其 dispose() 方法中安全地引用小部件的祖先,请通过在小部件的 didChangeDependencies() 方法中调用 inheritFromWidgetOfExactType() 来保存对祖先的引用。
Navigator.push
问题是即使用户按下后退按钮(在 中) ,代码仍在执行并且正在调用Widget2
。
这是mwe:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Widget1(),
);
}
}
class Widget1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
onPressed: () async {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Widget2(),
));
},
),
),
);
}
}
class Widget2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(body: RaisedButton(
onPressed: () async {
// Press back button before Future complete
await Future.delayed(Duration(seconds: 5));
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Widget3(),
));
},
));
}
}
class Widget3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(child: Text('Widget 3'));
}
}
解决方案
您可以做几件事,具体取决于您到底想要什么:
- 要将当前视图替换为新视图,防止用户导航回上一页,请使用
Navigator.pushReplacement(...)
- 要在应用栏中显示后退按钮,但阻止用户返回
Scaffold
,请使用WillPopScope包装你,并使onWillPop
属性返回一个Future.value(false)
. - 要简单地隐藏后退按钮按钮,请选择:
AppBar(...,automaticallyImplyLeading: false,...)
。用户仍然可以通过按 Android 中的后退按钮或 iOS 中的滑动手势返回。
推荐阅读
- html - 使用 BeautifulSoup,我可以在标签之间获取带有其他字符串的文本以将它们分开吗?
- java - 为什么我无法使用以下代码成功编译?
- android - Android:如何将数据从 Activity 发送到 Fragment(错误:Bundle 为空)
- matlab - 考虑到延迟电位,如何对点源添加随机相位产生的传播波进行动画处理?
- mysql - SqlDelight、MySql 和 Flow:在数据库更改时未调用 Flow 的 collect lambda
- mysql - 如果第二个表具有相同的列值,则联合所有,同时优先考虑第一个表
- c++ - lamda 被隐式删除,因为默认定义格式不正确
- visual-studio-code - 如何更改 vscode json 文件中的预定义变量
- 2sxc - 如何在 2sxc 的 razor 脚本中添加数据作为内容?
- javascript - 如何在类实例JS中设置参数?