在 FutureBuilder 中使用 Get.toNamed() 时在构建期间调用 setState() 或 markNeedsBuild()

时间:2021-04-04 17:07:28

标签: flutter flutter-getx

使用 flutter 2.xGet 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 答案),但没有奏效。

有什么帮助吗?

3 个答案:

答案 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"));