State.initState() must be a void method without an `async` keyword错误解析

devtools/2024/9/23 21:52:10/

在这里插入图片描述

文章目录

  • 报错问题
    • 报错的代码
  • 错误原因
  • 解决方法
    • 解析
  • 另外的方法

报错问题

State.initState() must be a void method without an `async` keyword

如下图:
image.png

报错的代码

报错的代码如下:

  keyword">void initState() keyword">async{keyword">super.initState();keyword">await getConfig("exerciseMusic").then((value) => {_selectedExerciseMusic = value ?? '默认音乐'});keyword">await getConfig("restMusic").then((value) => {_selectedRestMusic = value ?? '默认音乐'});keyword">await getConfig("finishMusic").then((value) => {_selectedFinishMusic = value ?? '默认音乐'});}

错误原因

State.initState() 方法是 Flutter 中 StatefulWidget 类的生命周期方法之一,用于初始化小部件的状态。该方法必须是一个 void 方法,不能使用 async 关键字。这是因为 initState() 方法会在小部件创建后立即调用,负责初始化小部件的状态。而 async 关键字用于指示一个方法是异步的,这意味着它会返回一个 Future 对象,而不是立即完成。然而,initState() 方法不能是异步的,因为它必须在小部件的构建方法被调用之前完成。

解决方法

要解决此错误,需要从 initState() 方法中删除 async 关键字,并将任何异步操作放在单独的方法中。然后,可以从 initState() 方法中调用该单独的方法。

  Future<keyword">void> _loadData() keyword">async {// Perform asynchronous operations herekeyword">await Future.delayed(Duration(seconds: 2));setState(() {// Update state after asynchronous operations are complete});}keyword">void initState() {keyword">super.initState();_loadData();}

解析

Future _loadData() async 是一个异步函数,它会返回一个 Future 对象,并在将来某个时候完成。但是,在 initState() 方法中调用它时,不会阻塞主线程。这是因为 initState() 方法是在主线程中调用的,而异步函数是在后台线程中执行的。

当在 initState() 方法中调用 _loadData() 方法时,它会立即返回一个 Future 对象。然后,主线程会继续执行 initState() 方法的其余部分,并最终调用 build() 方法来构建小部件。

与此同时,异步函数 _loadData() 会在后台线程中执行。当它完成时,它会调用 setState() 方法来更新小部件的状态。这会导致小部件重新构建,并反映异步操作的结果。

因此,即使 _loadData() 是一个异步函数,也不会阻塞 initState() 方法或导致小部件延迟构建。这是因为异步函数是在后台线程中执行的,不会影响主线程。

修改后的代码如下:

Future<keyword">void> _loadData() keyword">async {// Perform asynchronous operations here// await Future.delayed(Duration(seconds: 2));keyword">await getConfig("exerciseMusic").then((value) =>{_selectedExerciseMusic = value ?? '默认音乐'});keyword">await getConfig("restMusic").then((value) =>{_selectedRestMusic = value ?? '默认音乐'});keyword">await getConfig("finishMusic").then((value) =>{_selectedFinishMusic = value ?? '默认音乐'});setState(() {// Update state after asynchronous operations are complete});}keyword">void initState(){keyword">super.initState();_loadData();}

这些修改就不会报错了。

另外的方法

这个场景获得的数据小,时间短也可以使用FutureBuilder来实现。


Widget build(BuildContext context) {keyword">return FutureBuilder(future: doSomeAsyncStuff(),builder: (context, snapshot) {keyword">if (!snapshot.hasData) {// Future hasn't finished yet, return a placeholderkeyword">return Text('Loading');}keyword">return Text('Loading Complete: ${snapshot.data}');});
}

结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!


http://www.ppmy.cn/devtools/28145.html

相关文章

C++ 抽象机制

抽象机制 1. 虚函数 使用关键字virtual 声明的函数&#xff0c;意思是可能随后在其派生类中重新定义。 纯虚函数 在声明的末尾使用0 的函数&#xff0c;说明是纯虚函数。 抽象类 含有纯虚函数多的类称为抽象类(abstract class). 多态类型 如果一个类负责为其他一些类提供接…

STM32 工程移植 LVGL:一步一步完成

STM32 工程移植 LVGL&#xff1a;一步一步完成 LVGL&#xff0c;作为一款强大且灵活的开源图形库&#xff0c;专为嵌入式系统GUI设计而生&#xff0c;极大地简化了开发者在创建美观用户界面时的工作。作为一名初学者&#xff0c;小编正逐步深入探索LVGL的奥秘&#xff0c;并决…

【yolov8】yolov8剪枝训练流程

yolov8剪枝训练流程 流程&#xff1a; 约束剪枝微调 一、正常训练 yolo train model./weights/yolov8s.pt datayolo_bvn.yaml epochs100 ampFalse projectprun nametrain二、约束训练 2.1 修改YOLOv8代码&#xff1a; ultralytics/yolo/engine/trainer.py 添加内容&#…

spring boot 自定义starter示例

springboot 约定规范 Starter项目的命名规范 建议自定义的starter 以 xxx-spring-boot-starter 命名&#xff0c;官方的Starter一般都是以spring-boot-starter-为前缀。这样做的目的是为了避免与官方或其他第三方提供的Starter产生冲突或混淆。 Starter项目的结构规范(重要) …

【OpenGauss源码学习 —— (ALTER TABLE(ATRewriteTable))】

ALTER TABLE&#xff08;ATRewriteTable&#xff09; 概述ExecRewriteRowTable 函数ATRewriteTable 函数ATRewriteTableInternal 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用…

机器人技术概述_2.机器人4.0的核心技术

机器人4.0主要有以下几个核心技术&#xff1a;包括云-边-端的无缝协同计算、持续学习与协同学习、知识图谱、场景自适应和数据安全。 1.云-边-端的无缝协同计算 由于目前网络带宽和延迟的制约&#xff0c;当前机器人主要采用以机器人本身进行运算为主&#xff0c;云端处理非实…

Anaconda-用conda创建python虚拟环境常用命令

查看安装了哪些包 conda list查看当前存在哪些虚拟环境 conda env list conda info -e检查更新当前conda conda update condaPython创建虚拟环境 conda create -n your_env_name pythonx.xanaconda命令创建python版本为x.x&#xff0c;名字为your_env_name的虚拟环境。you…

6.k8s中的secrets资源-初识secret

目录 一、Secret 二、创建secrets资源 1.创建工作目录 2.尝试使用base64进行编码 3.声明式创建secrets资源 4.响应式创建secret 三、pod引用secret资源 1.pod资源env环境变量引用 2.pod资源volume存储卷引用secret资源 3.pod资源清单指定key引用secret 四、secret类型…