问题描述
我正在侦听流,并在屏幕上完成流时调用setState。
当我按回屏幕时,它消失了,但是在后台它继续工作,并最终进入设置状态,并给我以下错误:
[错误:Flutter / lib / ui / ui_dart_state.cc(157)]未处理的异常:在dispose()之后调用setState():_HotelPriceScreenState#4ec39(生命周期状态:已终止,未安装) E / Flutter(2203):如果您在状态对象上调用了不再出现在窗口小部件树中的窗口小部件(例如,其父窗口小部件不再在其构建中包括该窗口小部件)的setState(),则会发生此错误。当代码从计时器或动画回调中调用setState()时,会发生此错误。
E / Flutter(2203):首选解决方案是取消计时器或停止收听dispose()回调中的动画。另一个解决方案是在调用setState()之前检查此对象的“ mount”属性,以确保该对象仍在树中。 E / Flutter(2203):如果正在调用setState(),则此错误可能表示内存泄漏,因为在从树中删除该State对象后,另一个对象仍保留对该State对象的引用。为避免内存泄漏,请考虑在dispose()期间中断对该对象的引用。
如何解决这种情况并完全停止当前屏幕,以便它停止收听流并且不会调用setState()。
解决方法
我不太确定我是否理解您的问题,但据我所知,颤振为您提供了有用的错误消息。
就像错误文本中所说的那样,您可以停止收听dispose()
中的流(或暂停或关闭它或进行其他操作),也可以在调用{前检查.mounted
的值{1}}(我认为这是最好的解决方案)。因此,与其立即调用setState()
,不如将setState()
包装在另一个函数中,并在调用setState()
之前返回是否挂载了Widget。
我真的希望我能帮上忙,请不要太苛刻,这是我的第一篇文章。