在我的应用中,我需要在调用Navigator.push
之前执行代码。但是问题是,如果用户在执行代码之前按下返回按钮,则会出现错误:
E / flutter(8415):[错误:flutter / lib / ui / ui_dart_state.cc(148)] 未处理的异常:查找停用的窗口小部件的祖先是 不安全。 E / flutter(8415):这时小部件的状态 元素树不再稳定。 E / flutter(8415):安全参考 到控件的祖先的dispose()方法中,保存对 通过调用窗口小部件的InheritFromFromWidgetOfExactType()来祖先 didChangeDependencies()方法。
问题是代码仍在执行,并且即使用户按下了返回按钮(在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'));
}
}
答案 0 :(得分:0)
您可以执行几项操作,具体取决于您想要什么:
Navigator.pushReplacement(...)
Scaffold
,并设置onWillPop
属性返回Future.value(false)
。AppBar(...,automaticallyImplyLeading: false,...)
。仍然可以通过按Android中的“后退”按钮或按iOS中的滑动手势来返回。