我的应用程序中有两个屏幕。
屏幕A在打开时会执行计算量大的操作,并在dispose()调用时通过取消对数据库的动画/订阅来正确处理,以防止内存泄漏。
dispose()
从屏幕A,您可以打开另一个屏幕(屏幕B)。
当我使用时Navigator.pushNamed,dispose()即使现在显示了屏幕B ,屏幕A仍保留在内存中,并且不会被调用。
Navigator.pushNamed
有没有办法在不可见的情况下强制丢弃屏幕A?
永远不会丢弃第一条路线的示例代码:
import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( title: 'Navigation Basics', home: FirstRoute(), )); } class FirstRoute extends StatefulWidget { @override _FirstRouteState createState() => _FirstRouteState(); } class _FirstRouteState extends State<FirstRoute> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('First Route'), ), body: RaisedButton( child: Text('Open route'), onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => SecondRoute()), ); }, ), ); } @override void dispose() { // Never called print("Disposing first route"); super.dispose(); } } class SecondRoute extends StatefulWidget { @override _SecondRouteState createState() => _SecondRouteState(); } class _SecondRouteState extends State<SecondRoute> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Second Route"), ), body: RaisedButton( onPressed: () { Navigator.pop(context); }, child: Text('Go back!'), ), ); } @override void dispose() { print("Disposing second route"); super.dispose(); } }
我知道有些晚了,但是我认为您应该重写此deactivate方法。由于我们正在更改页面,因此实际上并没有在破坏它,这就是为什么dispose未调用the的原因。
deactivate
dispose
如果您需要更多信息,此页面列出了有状态窗口小部件的生命周期。
从链接:
当从树中删除State时,将调用“ deactivate()”,但可能会在当前帧更改完成之前重新插入它。之所以存在此方法,是因为状态对象可以从树中的一个点移动到另一点。