最小可复制代码:
void main() => runApp(FooApp());
class FooApp extends StatefulWidget {
@override
_FooAppState createState() => _FooAppState();
}
class _FooAppState extends State<FooApp> {
bool _showPage2 = false;
void _onPressed(bool value) => setState(() => _showPage2 = value);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Navigator(
onPopPage: (route, result) => route.didPop(result),
pages: [
MaterialPage(child: Page1(onPressed: _onPressed)),
if (_showPage2) MaterialPage(child: Page2()),
],
),
);
}
}
class Page1 extends StatelessWidget {
final ValueChanged<bool> onPressed;
const Page1({Key key, this.onPressed}) : super(key: key);
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Page1')),
body: ElevatedButton(
onPressed: () => onPressed(true),
child: Text('Page2'),
),
);
}
}
class Page2 extends StatefulWidget {
@override
_Page2State createState() => _Page2State();
}
class _Page2State extends State<Page2> {
void dispose() {
super.dispose();
print('dispose');
}
Widget build(BuildContext context) => Scaffold(appBar: AppBar(title: Text('Page2')));
}当此函数返回true时,导航器将此路由从历史记录中移除,但尚未调用dispose。相反,调用NavigatorState.finalizeRoute是路由的责任,而后者又将在路由上调用dispose。此序列允许路由在弹出后但在被处理之前执行退出动画(或其他一些视觉效果)。
但在我的示例中,您可以看到无需在NavigatorState.finalizeRoute中调用Page2,dispose方法确实会被调用为自相矛盾的文档。
发布于 2021-02-04 19:01:43
当使用MaterialPage/_PageBasedMaterialPageRoute时,它是在内部完成的。您可以在启动在Navigator类的代码中穿插,这似乎会导致班级。如果你真的想追踪你自己,那不是我在公园散步,你必须密切关注每一节课是如何相关的。
该类具有finishedWhenPopped getter,默认情况下它是true。如果您在getter定义下面查看didPop覆盖实现,当finishedWhenPopped为true时,didPop将在内部调用finalizeRoute。
@protected
bool get finishedWhenPopped => true;
@override
bool didPop(T? result) {
final bool returnValue = super.didPop(result);
assert(returnValue);
if (finishedWhenPopped)
navigator!.finalizeRoute(this);
return returnValue;
}这只适用于至少MaterialPage/_PageBasedMaterialPageRoute。其他实现不一定会这样做。
https://stackoverflow.com/questions/66051297
复制相似问题