如何解决在 FutureBuilder 中使用 Get.toNamed() 时在构建期间调用 setState() 或 markNeedsBuild()
使用 flutter 2.x
和 Get package
版本 ^4.1.2
。
我有一个像这样的小部件:
class InitializationScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future:
// this is just for testing purposes
Future.delayed(const Duration(seconds: 4)).then((value) => "done"),builder: (context,snapshot) {
if (shouldProceed(snapshot)) {
Get.toNamed("/login");
}
if (snapshot.hasError) {
// handle error case ...
}
return const Center(child: CircularProgressIndicator());
},),);
}
bool shouldProceed(AsyncSnapshot snapshot) =>
snapshot.hasData && snapshot.connectionState == ConnectionState.done;
}
在 Get.toNamed("/login");
中使用的 FutureBuilder
导致此错误:
在构建 FutureBuilder(dirty,state: _FutureBuilderState#b510d) 时抛出了以下断言: 在构建期间调用 setState() 或 markNeedsBuild()。
- 我尝试检查
connectionStatus
(基于 SO 答案),但没有奏效。
有什么帮助吗?
解决方法
build
方法用于呈现 UI。您的逻辑根本没有连接到渲染,因此即使没有错误,将其放入 build
方法也没有意义。
最好将此方法转换为StatefulWidget
,并将逻辑放在initState
中,例如:
Future.delayed(const Duration(seconds: 4))
.then((value) => "done")
.then((_) => Get.toNamed("/login"));
,
试试这个
Future.delayed(Duration.zero,() async {
your set state
});
,
在屏幕初始 setState()
期间立即调用 build()
时会发生此错误。为了避免这种情况,您可以通过将 setState()
放在 Future.delayed
中来解决这个问题,例如:
Future.delayed(Duration(milliseconds: 100),() => Get.toNamed("/login"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。