我有这个初始化状态方法:
@override
void initState() {
super.initState();
getNumber(index).then((number) {
if (number> 1000) {
number = number/ 1000;
setState(() {
flag = true;
_num = number.toInt().toString();
});
} else {
setState(() {
_num = number.toInt().toString();
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
如果您对不再出现在窗口小部件树中的窗口小部件(例如,其父窗口小部件在其构建中不再包含该窗口小部件)的状态对象调用 setState() ,则会发生此错误。当代码从计时器或动画回调调用 setState() 时,可能会发生此错误。首选的解决方案是取消计时器或停止监听 dispose() 回调中的动画。另一种解决方案是在调用 setState() 之前检查此对象的“mounted”属性,以确保该对象仍在树中。
如果调用 setState() ,则此错误可能表示内存泄漏,因为另一个对象在从树中删除后仍保留对此 State 对象的引用。为避免内存泄漏,请考虑在 dispose() 期间中断对此对象的引用。
我如何以正确的方式使用处置?
Geo*_*rge 15
我无法解释这是一个标准,但在我的代码中,我通常会mounted在每个Future事件中进行检查;无论是.then,.catchError或.whenComplete回调。
@override
void initState() {
super.initState();
getNumber(index).then((number) {
if (!mounted) {
return; // Just do nothing if the widget is disposed.
}
// ...
});
}
Run Code Online (Sandbox Code Playgroud)
使用 Futures 时,我总是重写我的 setState 方法,如下所示,因此您不需要重写代码中的所有位置......
void setState(fn) {
if (mounted) super.setState(fn);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5948 次 |
| 最近记录: |