FutureBuilder — setState() или markNeedsBuild() вызывается при ошибке сборки

#flutter #flutter-futurebuilder

#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. можете ли вы поделиться своим checkConn() и полным initState() методом? это поможет другому добровольцу ответить на этот вопрос

2. «Future<String> checkConn() async { var connresponse = ожидание http.get(connurl).тайм-аут(постоянная длительность (секунды: 10)); log(‘connresponse is: $ {connresponse.StatusCode}’); if(connresponse.StatusCode!=200) { возврат «ОШИБКА»; } else { возвращает «OK»; } }

3. @GilangPratama, повторная вставка запрошенной информации. 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"; } } .

4. 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(); }

Ответ №1:

На самом деле, я не знаю, для чего _checkConn = checkConn(); вы initState() используете, потому что вы объявили свой checkConn() на своем futureBuilder . Я просто могу предложить вам решить вашу проблему с помощью этих 3 вариантов, которые вы можете выбрать ниже:

1. Удалите ожидание в initState

просто удалите свой _checkConn = checkConn();

2. Удалите setState() во время сборки виджета

по моему опыту, ошибка, подобная той, что я пишу ниже, может возникнуть при вызове setState() виджета во время сборки.

setState() или markNeedsBuild(), вызываемые во время сборки.

итак, я предполагаю, что у вас есть некоторые setState() внутри вашей сборки без каких-либо событий.

3. Использовать, если смонтировано

await синтаксис может привести к некоторой ошибке при initState() его сборке, то есть вы можете использовать 1 из некоторого StatefulWidget() жизненного mounted цикла для его сборки .