使用 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 答案),但没有奏效。有什么帮助吗?
答案 0 :(得分:0)
build
方法用于呈现 UI。您的逻辑根本没有连接到渲染,因此即使没有错误,将其放入 build
方法也没有意义。
最好将此方法转换为StatefulWidget
,并将逻辑放在initState
中,例如:
Future.delayed(const Duration(seconds: 4))
.then((value) => "done")
.then((_) => Get.toNamed("/login"));
答案 1 :(得分:0)
试试这个
Future.delayed(Duration.zero, () async {
your set state
});
答案 2 :(得分:0)
在屏幕初始 setState()
期间立即调用 build()
时会发生此错误。为了避免这种情况,您可以通过将 setState()
放在 Future.delayed
中来解决这个问题,例如:
Future.delayed(Duration(milliseconds: 100), () => Get.toNamed("/login"));