#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
цикла для его сборки .