[Flutter]有的时候调用setState(() {})报错?

先看FlutterSDK的原生类State中有一个变量mounted。

Dart 复制代码
abstract class State<T extends StatefulWidget> with Diagnosticable {
  /// mounted的作用是,此State对象当前是否在树中。
  /// 在创建State对象之后,在调用initState之前,框架通过将State对象与BuildContext的关联来 "mounts" 这个State对象。State对象保持挂载状态,直到框架调用dispose,在此之后,框架将永远不会要求State对象再次构建。
  /// 除非mounted为true,否则调用setState是错误的。
  bool get mounted => _element != null;
}

因此,在State<T extends StatefulWidget>的子类对象中,我们可以在封装了一个刷新界面的方法。特别是在网络数据请求等异步任务的回调中调用这个方法。

Dart 复制代码
class _HomePageState extends State<HomePage>
  void _updateUI() {
    if (mounted) {
      setState(() {});
    }
  }

  void _requestData() {
    RequestUtil.get(
      urlStr: 'urlStr',
      param: null,
      showLoading: false,
    ).then((value) {
      // 注: 回调可能在State对象被dispose之后才执行。
      if (value && value.data is List) {
        _dataList = value.data;
      } else {
        _dataList = [];
      }
      _updateUI();
    });
  }
}
相关推荐
HWL567921 分钟前
Express项目解决跨域问题
前端·后端·中间件·node.js·express
刺客-Andy34 分钟前
React 第三十九节 React Router 中的 unstable_usePrompt Hook的详细用法及案例
前端·javascript·react.js
Go_going_40 分钟前
【js基础笔记] - 包含es6 类的使用
前端·javascript·笔记
浩~~1 小时前
HTML5 浮动(Float)详解
前端·html·html5
AI大模型顾潇2 小时前
[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
前端·数据库·人工智能·语言模型·自然语言处理·prompt·neo4j
九月TTS2 小时前
TTS-Web-Vue系列:Vue3实现内嵌iframe文档显示功能
前端·javascript·vue.js
爱编程的小学究2 小时前
【node】如何把包发布到npm上
前端·npm·node.js
weixin_473894773 小时前
前端服务器部署分类总结
前端·网络·性能优化
LuckyLay3 小时前
React百日学习计划-Grok3
前端·学习·react.js
澄江静如练_3 小时前
小程序 存存上下滑动的页面
前端·javascript·vue.js