android 我的FutureBuilder在我的主屏幕上不断重新加载(但只有当在其他屏幕上)?

fiei3ece  于 2022-11-03  发布在  Android
关注(0)|答案(2)|浏览(121)

我的FutureBuilder在主屏幕上遇到了一个非常奇怪的问题,只有当我导航到其他页面时才会出现,然后它一直在重新加载(我已经通过在主屏幕上设置断点进行了验证)。
我相当肯定这不是未来构建者应该如何行动,甚至 * 为什么 * 它在一个循环中重新加载 * 只有 * 远离我的主屏幕?

概念:

1.我加载我的应用
1.主屏幕上的FutureBuilder按预期工作。它接收它的future,构建应用程序,就这样
1.我导航到另一个屏幕
1.我的主屏幕上的FutureBuilder突然又开始工作了,而且停不下来
我的主屏幕代码,这是一个Stateful小工具:

@override
  Widget build(BuildContext context) {
    generateLayout(); // Assigns padding/spacing based on screen size
    return MaterialApp(
      title: 'Home Screen',
      // This builder is here for routes needing an up-the-tree context
      home: Builder(builder: (context) { 
        Future.delayed(Duration.zero, () {
          // Shows disclosure on location usage
          return showLocationDisclosureDetermination(context); 
        });
        return Scaffold(
          appBar: AppBar(
            title: startScreenTitle('Location Alerts'),
          ),
          body: FutureBuilder(
              future: initFunctions(),
              builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
                if (snapshot.hasData) {
                  return startScreenBody(context);
                } else {
                  return const Center(
                      child: CircularProgressIndicator(
                    color: Color(s_darkSalmon),
                  ));
                }
              }),
        );
      }),
    );
  }

我的initFunctions()代码:

Future<bool> initFunctions() async {
    await sharedPreferencesLookUp();     // Getting Shared Preferences vars
    await databaseLookUp();              // Doing a Firestore query
    await locationServicesLookUp();      // Getting location services info
    return true;
  }

最后,我如何离开主屏幕:

return ElevatedButton(
    onPressed: () async {
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => const SpecificScreen()),
      );
    },
    child: Text('Go Right'));
wfveoks0

wfveoks01#

您可以尝试使用FutureBuilder连接状态:

FutureBuilder(
    future: initFunctions(),
    builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
      switch (snapshot.connectionState) {
        case ConnectionState.done:
          if (snapshot.hasData) {
            return startScreenBody(context);
          } else {
            return const Center(child: Text("no data"));
          }
        case ConnectionState.waiting:
          return const Center(
              child: CircularProgressIndicator(
            color: Color(s_darkSalmon),
          ));

        default:
          return const Center(
              child: CircularProgressIndicator(
            color: Color(s_darkSalmon),
          ));
      }
    });
46scxncf

46scxncf2#

请注意,这是一个黑客/变通方法,我是OP

对于任何在未来遇到这个问题的人,我找到了一个黑客/变通方法,希望能帮助你。注意,这并不能解决FutureBuilder反复触发的问题,但确实对用户隐藏了这种行为。
我在主屏幕上添加了一个bool,名为_on_this_page,让FutureBuilder函数initFunctions()知道什么时候执行。下面是我在Navigator中如何做到这一点的,以使事情保持整洁。

bool _on_this_page = true; // Instantiation in Stateful widget before build()

return ElevatedButton(
    onPressed: () async {
      _on_this_page = false; // for when you leave
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => const SpecificScreen()),
      ).then((value) => setState(() {
            _on_this_page = true; // for when you come back
            ;
          }));
    },
    child: Text('Go Right'));

相关问题