由于Ffltter在不同的条件下多次调用build方法,为了避免多次获取数据,我将数据初始化为initState.

我想在数据准备好后重新构建小部件.

以下是我的代码:

class Test extends StatefulWidget {

  @override
  _TestState createState() => new _TestState();

}

class _TestState extends State<Test> {

  Data data;
  bool dataReady = false;

  @override
  void initState() {
    super.initState();

    getData(context).then((Data data) async {
      setState(() {
        dataReady= true;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    if (dataReady) {
      return createMainContent(context);
    } else {
      return new Container();
    }
  }

}

但是,它会导致以下例外情况:

inheritFromWidgetOfExactType(_InheritedProvider) or inheritFromElement() was called before _TestState.initState() completed.

我可以知道我做错了什么吗?

当我在getData(上下文)的实现中添加以下行时

     await Future.delayed(new Duration(milliseconds: 300));

例外情况不会发生.

推荐答案

下面是Edit:个最好的答案.


显然,you cannot access 100 during 101个(更具体的:在它完成之前).

因此,我相信原因是getData试图在树中查找InheritedWidget个祖先,但是树才刚刚构建(您的小部件是在父小部件build期间创建的),所以我相信这是因为getData试图在树中查找InheritedWidget个祖先,但是树刚刚构建完成(您的小部件是在父小部件build期间创建的).

显而易见的解决方案是将getData的查找延迟到稍后的时间点.有几种方法可以实现这一点:

  • 将查找延迟到以后的时间.scheduleMicrotask应该可以.
  • 在第一个build电话的时候查一下.您可以将isInitialized字段设置为false,而在您的build中,类似于:

    if (!isInitialized) {
      isInitialized = true;
      // TODO: do the getData(...) stuff
    }
    

Flutter相关问答推荐

类型flatter doctor get zsh:未找到命令:macO中flatter

为什么Riverpod生成器在这种情况下不生成AsyncNotiator?

Flutter 动画列表一次构建所有项目,而不是仅构建可见的项目

如何在扩展其他小部件时访问Ref

ReCAPTCHA Enterprise中的严重安全漏洞

BaseInputfield和Textfield有什么不同?

Flutter GestureDetector单击问题-堆叠外面的按钮不可点击

我如何在Android 13中通过Flutter应用程序打开文件(不是图像、视频或音频)?

构建上下文不能跨异步间隙使用

尽管海拔设置为 0,如何删除 appBar 下的下划线

无法从一个页面导航到下一个页面 (Flutter)

Flutter蓝牙 - 如何通过蓝牙从设备中获取文件?

splash_screen 没有被推送到登录页面

Flutter ImagePicker - 在 onPressed 中异步获取图像显示 lint 警告

升级到 Flutter 3.10 后,Flutter 键盘填充不起作用. Flutter 3.10 如何防止 BottomSheet 被键盘覆盖?

如何在 flutter 中同时使用 ButtonStyle() 和 ElevatedButton.styleFrom() ?

Flutter snapShot.hasData 为假但响应有数据

TextSpan 避免符号字符串组上的换行符

更新未知文档 ID firebase\flutter 中的字段

如何在Flutter 中制作自定义微调器?