[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();
    });
  }
}
相关推荐
web加加5 分钟前
vue3 +vite项目页面防f12,防打开控制台
前端·javascript·vue.js
A尘埃1 小时前
大模型应用python+Java后端+Vue前端的整合
java·前端·python
遥遥晚风点点2 小时前
Spark导出数据文件到HDFS
前端·javascript·ajax
克里斯蒂亚L2 小时前
开发一个计时器组件
前端·浏览器
克里斯蒂亚诺更新2 小时前
微信小程序 点击某个marker改变其大小
开发语言·前端·javascript
天才奇男子3 小时前
从零开始搭建Linux Web服务器
linux·服务器·前端
长空任鸟飞_阿康3 小时前
AI 多模态全栈应用项目描述
前端·vue.js·人工智能·node.js·语音识别
Mintopia3 小时前
🌐 实时协同 AIGC:多人在线 Web 创作的技术架构设计
前端·人工智能·trae
Mintopia3 小时前
🔥 “Solo Coding”的近期热度解析(截至 2025 年末)
前端·人工智能·trae
顾安r4 小时前
11.14 脚本网页游戏 猜黑红
前端·javascript·游戏·flask·html