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

ops/2024/9/23 21:52:09/

在这里插入图片描述

文章目录

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

报错问题

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/ops/28728.html

相关文章

【计算机毕业设计】基于SSM++jsp的社区管理与服务系统【源码+lw+部署文档+讲解】

目录 摘 要 Abstract 第一章 绪论 第二章 系统关键技术 第三章 系统分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3运行可行性 3.1.4法律可行性 3.4.1注册流程 3.4.2登录流程 3.4.3活动报名流程 第四章 系统设计 4.3.1登录模块顺序图 4.3.2添加信息模块顺序图 4.4.1 数据库E-…

【经典算法】LeetCode 108. 将有序数组转换为二叉搜索树(Java/C/Python3/Go实现含注释说明,Easy)

目录 题目描述思路及实现方式一&#xff1a;递归中值法思路代码实现Java版本C语言版本Python3版本Golang版本 复杂度分析 方式二&#xff1a;迭代法思路代码实现Java实现Python实现C实现Go版本 复杂度分析总结 总结相似题目 标签(题目类型)&#xff1a;树&#xff0c;二叉搜索树…

蓝桥杯练习系统(算法训练)ALGO-953 混合积

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 众所周知&#xff0c;人人都在学习线性代数&#xff0c;既然都学过&#xff0c;那么解决本题应该很方便。   宇宙大战中&…

十大排序算法之——冒泡排序算法(Java实现)及思路讲解

冒泡排序是一种简单的排序算法&#xff0c;通过重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。这个算法的名字由来是因为越小的…

机器学习之K-medians聚类

K-medians聚类是一种聚类算法,类似于K-means,但是它使用中位数来确定簇的中心,而不是平均值。这种方法在处理数据中存在离群值或异常值时比较有用,因为中位数对离群值不敏感。K-medians的步骤与K-means类似,但在每次迭代中,它使用中位数来更新簇的中心。 K-medians的算法…

常用设计模式

单例模式 一个类只能创建一个对象&#xff0c;即单例模式&#xff0c;该设计模式可以保证系统中该类只有⼀个实例&#xff0c;并提供⼀个访问它的全局访问点&#xff0c;该实例被所有程序模块共享。比如在某个服务器程序中&#xff0c;该服务器的配置信息存放在⼀个文件中&…

探索PyTorch:开源深度学习框架的魅力

PyTorch作为一款开源深度学习框架&#xff0c;已经在学术界和工业界广泛应用。其简洁易懂的API、动态计算图以及丰富的工具和接口&#xff0c;使得它成为了许多研究人员和工程师的首选。本文将深入探讨PyTorch与深度学习的紧密联系&#xff0c;从其核心特点、应用领域以及未来发…

【PyTorch与深度学习】2、PyTorch张量的运算API(上)

课程地址 最近做实验发现自己还是基础框架上掌握得不好&#xff0c;于是开始重学一遍PyTorch框架&#xff0c;这个是课程笔记&#xff0c;这个课还是讲的简略&#xff0c;我半小时的课听了一个半小时。 1. 张量 1.1 张量操作 &#xff08;1&#xff09;chunk&#xff1a;将一…