我的应用程序中有两个屏幕.
屏幕A在打开时运行计算量很大的操作,并在调用dispose()
时通过取消对数据库的动画/订阅来正确处理,以防止内存泄漏.
从屏幕A可以打开另一个屏幕(屏幕B).
当我使用Navigator.pushNamed
时,屏幕A保留在内存中,并且不调用dispose()
,即使现在显示了屏幕B.
有没有办法在屏幕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();
}
}