当我单击凸起的按钮时,时间选择器显示出来。现在,如果我等待5秒钟,例如,然后确认时间,将出现以下错误:在dispose()之后调用setState()
我真的在控制台看到flutter是如何更新父控件的,但是为什么呢?我什么也没做-我只是等了5秒钟?!下面的例子将在一个普通的项目中工作,然而在我的项目中,这是相当复杂的,它不会工作,因为Flutter正在更新状态,而我正在等待...我做错了什么?有没有人猜到Flutter在我更复杂的项目中而不是在一个简单的项目中随机更新的原因?
**[更新]**我又看了一下,发现它是从我的TabBar
和TabBarView
所在的级别更新的。它是否与我需要的TabBarView
的“with TickerProviderStateMixin”有关?它是否会导致应用程序定期和随机刷新?
class DateTimeButton extends State<DateTimeButtonWidget> {
DateTime selectedDate = new DateTime.now();
Future initTimePicker() async {
final TimeOfDay picked = await showTimePicker(
context: context,
initialTime: new TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute),
);
if (picked != null) {
setState(() {
selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute);
});
}
}
@override
Widget build(BuildContext context) {
return new RaisedButton(
child: new Text("${selectedDate.hour} ${selectedDate.minute}"),
onPressed: () {
initTimePicker();
}
);
}
}
9条答案
按热度按时间j13ufse21#
在调用
setState()
之前,只需检查小部件的state类的布尔属性mounted
。或者更干净的方法在
StatelfulWidget
类中重写setState
方法。krugob8w2#
如果这是
Future
在小部件已被释放时完成的预期行为,则可以使用bvuwiixz3#
只在
setState()
前写一行然后
nfeuvbwi4#
我遇到了同样的问题,我解决了在
initState()
上更改超级构造函数调用顺序的问题:错误代码:
右侧代码:
wmvff8tz5#
要防止发生错误,可以使用
State
类的mounted
属性来确保在设置小部件的状态之前已挂载小部件:sd2nnvve6#
试试这个
wf82jlnq7#
要防止出现此错误,请使用MountedState,而不要使用State
dbf7pr2w8#
当我错误地在变量之前调用super.initState时,我遇到了这个错误。
应固定为
isr3a4wc9#
当您在有状态小部件中执行长时间异步操作时,可能会在操作完成之前关闭/处置该小部件,此时可能会出现此问题。
Dart中的future不是抢占式的,因此唯一的方法是在调用setState之前检查是否挂载了一个小部件。
如果您有很多具有异步特性的小部件,那么添加大量的
if (mounted)
检查是非常繁琐的,扩展方法可能会很有用