码迷,mamicode.com
首页 > 其他好文 > 详细

解决:setState() called after dispose() 内存泄漏问题

时间:2020-11-23 12:48:08      阅读:29      评论:0      收藏:0      [点我收藏+]

标签:obj   unless   ini   状态   sso   his   col   currently   ror   

一、问题场景

网络请求成功前退出了页面,该 State 被从对象树卸载掉,而这时回调了网络请求的方法,方法中带有 setState 的调用,也就导致了该问题。

二、问题原因

State 对象被从对象数卸载释放之后再次调用 setState 就会报 setState() called after dispose()。

二、解决方案

State 的 mounted 源码:

/// Whether this [State] object is currently in a tree.
  ///
  /// After creating a [State] object and before calling [initState], the
  /// framework "mounts" the [State] object by associating it with a
  /// [BuildContext]. The [State] object remains mounted until the framework
  /// calls [dispose], after which time the framework will never ask the [State]
  /// object to [build] again.
  ///
  /// It is an error to call [setState] unless [mounted] is true.
  bool get mounted => _element != null;

注释中说得很清楚:判断 State 对象现在还在不在对象数中。

So,解决方案就是在 setState 之前先判断一下该 State 是否已经被释放:

 /// 更新用户状态
  void updateState(fn){
    if (mounted) {
      setState(fn);
    }

搞定!

 

解决:setState() called after dispose() 内存泄漏问题

标签:obj   unless   ini   状态   sso   his   col   currently   ror   

原文地址:https://www.cnblogs.com/maqingyuan/p/14005745.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!