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

news/2024/9/23 21:52:08/

在这里插入图片描述

文章目录

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

报错问题

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/news/1442821.html

相关文章

Jenkins CI/CD 持续集成专题三 Jenkins 使用shell脚本打包组件配置流程

第一步 新建任务 第二步 输入项目名称和选择自由风格的软件项目点击确定 第三步 配置下项目地址和账号密码 第四步 配置 build steps 选择 shell 脚本 第五步 shell 配置 &#xff08;注意shell 必须以#!/bin/sh开头&#xff0c;否则会报 找不到shell 命令的错&#xff09; …

【网络原理】TCP协议的连接管理机制(三次握手和四次挥手)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 【网络…

wpf 按钮禁用样式

在WPF中&#xff0c;要为按钮创建一个禁用样式&#xff0c;需要在资源字典中定义一个Style&#xff0c;该样式将应用于Button控件的IsEnabled属性为False时的状态。 以下是一个简单的例子&#xff1a; <Style TargetType"Button" x:Key"NormalButtonStyle&…

基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的甘肃旅游服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

Axios的使用教程

AXIOS Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 使用npm等包管理工具下载axios np…

020Node.js的FS模块使用fs.mkdir创建目录

Node.js的FS模块使用fs.mkdir创建目录 //fs.mkdir 创建目录 /*path 将创建的目录路径mode 目录权限&#xff08;读写权限&#xff09;&#xff0c;默认777callback 回调&#xff0c;传递异常参数err*/ const fsrequire(fs);fs.mkdir(./css,(err)>{if(err){console.log(err)…

PhotosCollage for Mac:优雅且实用的照片拼贴软件

PhotosCollage for Mac是一款优雅且实用的照片拼贴软件&#xff0c;为Mac用户提供了一个便捷、高效的平台&#xff0c;以创建精美、个性化的照片拼贴作品。 PhotosCollage for Mac v1.4.1激活版下载 该软件界面简洁直观&#xff0c;操作便捷。用户只需将想要拼贴的照片拖入“照…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…