我有这个初始化状态方法:
@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();
});
}
});
}
我得到了这个错误:
如果您在State对象的set对象上调用setState(),则会发生此错误。 不再显示在小部件树中的小部件(例如,其父级 小部件不再包含其小部件)。这个错误可以 当代码从计时器或动画调用setState()时发生 打回来。首选解决方案是取消计时器或停止 在dispose()回调中收听动画。另一种解决方案 是在调用之前检查此对象的“ mount”属性 setState()以确保对象仍在树中。
如果正在调用setState(),则此错误可能表示内存泄漏 因为另一个对象保留了对此State对象的引用 从树上将其移除后。为避免内存泄漏, 考虑在dispose()期间中断对该对象的引用。
如何正确使用处置方式?
答案 0 :(得分:1)
在使用 Futures 时,我总是像下面这样覆盖我的 setState 方法,所以你不需要在代码中的任何地方重写...
void setState(fn) {
if (mounted) super.setState(fn);
}
答案 1 :(得分:0)
我不能说这是一个标准,但是在我的代码中,我通常会在每个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.
}
// ...
});
}