我有以下 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() 在构建期间调用。
非常感谢您对此的任何帮助。
提前致谢。
答案 0 :(得分:0)
实际上,我不知道您的 _checkConn = checkConn();
中的 initState()
是做什么用的,因为您已经在 checkConn()
处声明了 futureBuilder
。
我只能建议您使用以下 3 个选项来解决您的问题:
只需删除您的_checkConn = checkConn();
根据我的经验,当您在构建小部件期间调用 setState()
时,可能会发生我在下面写的错误。
setState() 或 markNeedsBuild() 在构建期间调用。
所以,我假设您的构建中有一些 setState()
没有任何事件。
await
语法在 initState()
中构建时可能会出错,您可以使用一些 StatefulWidget()
lifecycle 中的 1 个来构建它,即 { {1}}。