FutureBuilder - 在构建错误期间调用了 setState() 或 markNeedsBuild()

时间:2021-01-17 00:24:44

标签: flutter flutter-futurebuilder

我有以下 FutureBuilder 条目。

FutureBuilder(
                future: _checkConn,
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  switch (snapshot.connectionState){
                    case ConnectionState.none:
                      Navigator.pushReplacementNamed(context, NoConnView);
                      break;
                    case ConnectionState.active:
                    case ConnectionState.waiting:
                    case ConnectionState.done:
                      if(snapshot.data=='OK'){
                        initialfbget();
                        break;
                      } else {
                        Navigator.pushReplacementNamed(context, NoConnView);
                        break;
                      }
                  }
                  return SizedBox.expand(
                    child: FittedBox(
                      fit: BoxFit.fill,
                      child: SizedBox(
                        width: _vcontroller.value.size?.width ?? (MediaQuery.of(context).size.width),
                        height: _vcontroller.value.size?.height ?? (MediaQuery.of(context).size.height),
                        child: VideoPlayer(_vcontroller),
                      ),
                    ),
                  );

                }
            ),

以下是完整的 initstate 部分:

void initState()  {
    super.initState ();

    _vcontroller = VideoPlayerController.asset("assets/testimages/sukiitestanimation.mp4")
      ..initialize().then((_) {
        // Once the video has been loaded we play the video and set looping to true.
        _vcontroller.play();
        _vcontroller.setLooping(false);
        // Ensure the first frame is shown after the video is initialized.
      });

    _checkConn = checkConn();
    Firebase.initializeApp();
  }

以下是 checkconn 段:

Future<String> checkConn() async {
    var connresponse = await http.get(connurl).timeout(const Duration(seconds: 10));
    log('connresponse is: ${connresponse.statusCode}');
    if(connresponse.statusCode!=200) {
      return "BAD";
    } else {
      return "OK";
    }
  }

一直收到以下错误。

setState() 或 markNeedsBuild() 在构建期间调用。

非常感谢您对此的任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

实际上,我不知道您的 _checkConn = checkConn(); 中的 initState() 是做什么用的,因为您已经在 checkConn() 处声明了 futureBuilder。 我只能建议您使用以下 3 个选项来解决您的问题:

1.在 initState 中删除您的等待

只需删除您的_checkConn = checkConn();

2.在构建 Widget 期间删除 setState()

根据我的经验,当您在构建小部件期间调用 setState() 时,可能会发生我在下面写的错误。

<块引用>

setState() 或 markNeedsBuild() 在构建期间调用。

所以,我假设您的构建中有一些 setState() 没有任何事件。

3.安装时使用

await 语法在 initState() 中构建时可能会出错,您可以使用一些 StatefulWidget() lifecycle 中的 1 个来构建它,即 { {1}}。