【问题标题】:How to destroy current screen completely while navigating to previous screen on back press in Flutter?如何在 Flutter 中按回导航到上一个屏幕时完全破坏当前屏幕?
【发布时间】: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


【解决方案1】:

我不确定我是否理解你的问题,但据我所知,flutter 给了你一个有用的错误消息。

就像它在错误文本中所说的那样,您可以停止收听 dispose() 中的流(或暂停或关闭它或其他方式),或者您可以在调用 setState() 之前检查 .mounted 值(这在我看来将是最好的解决方案)。因此,与其立即调用setState(),不如将​​setState() 包装在另一个函数中,如果在调用setState() 之前挂载了Widget,则返回。

我真的希望我能帮上忙,请不要太苛刻,这是我的第一篇文章。

【讨论】:

  • 我确实收到了错误消息,也确实使用了挂载的。它对我有点用,但我想知道它发生的原因。
猜你喜欢
  • 2018-11-28
  • 2021-03-31
  • 2023-02-17
  • 2021-04-21
  • 1970-01-01
  • 2010-11-09
  • 2020-03-06
  • 2021-07-02
  • 2018-10-06
相关资源
最近更新 更多