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

在这里插入图片描述

报错问题

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

如下图:
image.png

报错的代码

报错的代码如下:

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

错误原因

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

解决方法

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

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

  
  void initState() {
    super.initState();
    _loadData();
  }

解析

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

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

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

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

修改后的代码如下:

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

  
  void initState(){
    super.initState();
    _loadData();
  }

这些修改就不会报错了。

另外的方法

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


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

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

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值