这两个错误的原因不同,需要分别处理。

  1. 'setState() or markNeedsBuild() called during build' 这个错误的原因是在widget build的过程中,调用了setState()或markNeedsBuild()方法,这是不允许的。解决方法是使用Future.delayed()方法,将需要setState()或markNeedsBuild()的代码延迟执行到当前build完成之后。例如:
@override
Widget build(BuildContext context) {
  return FutureBuilder(
    future: fetchData(),
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        return Obx(() => Text(controller.text));
      } else {
        return CircularProgressIndicator();
      }
    },
  );
}

Future<void> fetchData() async {
  await Future.delayed(Duration(seconds: 1));
  controller.text.value = 'Data loaded';
}

在上面的代码中,fetchData()方法中的代码会被延迟1秒执行,保证在build完成之后执行,避免了出现'setState() or markNeedsBuild() called during build'的错误。

  1. 'LateInitializationError: Field 'data' has not been initialized.' 这个错误的原因是代码中使用了一个晚期初始化的变量,但是在使用之前没有进行初始化。解决方法是在变量定义的时候进行初始化,或者使用late修饰符来声明晚期初始化变量。例如:
// 在定义时进行初始化
String data = '';

// 使用late修饰符来声明晚期初始化变量
late String data;

在使用晚期初始化变量时,需要注意在使用之前一定要进行初始化,否则会报'LateInitializationError: Field 'data' has not been initialized.'的错误。

[Flutter 错误] setState() or markNeedsBuild() called during build & LateInitializationError: Field 'data' has not been initialized. 解决方法

原文地址: https://www.cveoy.top/t/topic/lImE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录