У меня в приложении два экрана.
Экран 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();
}
}