【发布时间】:2020-12-30 19:18:15
【问题描述】:
我正在收听流并在屏幕中的流完成时调用 setState。
当我按下后屏幕消失但在后台它继续工作并最终调用设置状态并给我以下错误:
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:setState() 在 dispose() 后调用:_HotelPriceScreenState#4ec39(生命周期状态:已失效,未安装) E/flutter (2203):如果您对不再出现在小部件树中的小部件(例如,其父小部件不再在其构建中包含小部件)调用 State 对象上的 setState(),则会发生此错误。当代码从计时器或动画回调中调用 setState() 时,可能会发生此错误。
E/flutter (2203):首选的解决方案是取消计时器或停止在 dispose() 回调中收听动画。另一种解决方案是在调用 setState() 之前检查该对象的“已安装”属性,以确保该对象仍在树中。 E/flutter (2203):如果 setState() 被调用,则此错误可能表示内存泄漏,因为另一个对象在从树中删除后仍保留对此 State 对象的引用。为避免内存泄漏,请考虑在 dispose() 期间中断对此对象的引用。
如何解决这种情况并完全停止当前屏幕,使其停止监听流并且不会调用 setState()。
【问题讨论】:
-
我假设你 @override dispose() 并清理了所有内容?
-
@JonnH 我在 dispose() 上调用 channel.sink.close() 应该关闭流。
-
然后在调用setState()之前检查mounted()
-
怎么称呼?我正在通过网络套接字通道收听流。 StreamBuilder(stream: widget.channel.stream, ) 并在 dispose 方法 channel.sink.close() 中关闭它 - 像这样。我已经把日志。首先调用 dispose,然后调用 done。
标签: android flutter navigation state state-management