gpt4 book ai didi

dart - 导航到新路线时处理小部件

转载 作者:IT王子 更新时间:2023-10-29 07:22:00 26 4
gpt4 key购买 nike

我的应用中有两个屏幕。

屏幕 A 在打开时运行计算量大的操作,并在调用 dispose() 时通过取消动画/订阅数据库来正确处理以防止内存泄漏。

从屏幕 A,您可以打开另一个屏幕(屏幕 B)。

当我使用 Navigator.pushNamed 时,屏幕 A 保留在内存中,并且不会调用 dispose(),即使现在显示屏幕 B。

有没有办法在屏幕 A 不在 View 中时强制销毁它?

永远不会处理第一条路线的示例代码:

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 的原因。

如果您想了解更多信息 this page lists有状态小部件的生命周期。

来自链接:

'deactivate()' is called when State is removed from the tree, but it might bereinserted before the current frame change is finished. This method exists basicallybecause State objects can be moved from one point in a tree to another.

关于dart - 导航到新路线时处理小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55140674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com