【问题标题】:How to prevent child in IndexedStack get rebuilt?如何防止 IndexedStack 中的子项被重建?
【发布时间】:2021-01-05 23:08:57
【问题描述】:

我有一个IndexedStack 有 4 个孩子,作为可以更改的 4 个选项卡。所有其他 3 个简单的都运行良好,但是如果切换到第 4 个孩子正在重建。如何预防?

孩子是一个自定义的StatefulWidget(我们称之为A),它构建了一个FutureBuilder。如果成功从网上获取数据,则返回另一个自定义的StatfulWidget(我们称之为B)。 B 也有一个 FutureBuilder,最终返回的内容基本上是 Scaffold 中的 NestedScrollView,并且有自己的标签视图。

我希望它的滚动位置在选项卡之间切换时保持在原来的位置。可能的原因是什么?顺便说一句,我尝试将AutomaticKeepAliveClientMixin 添加到我自定义的StatefulWidget 中,还是一样。

可能有帮助的代码: 小部件 A:

@override
  Widget build(BuildContext context) {
    return FutureBuilder<bool>(
      future: MainMgr.instance.isLoggedIn(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting)
          return Center(child: CircularProgressIndicator());
        else if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasError)
            return Text(snapshot.error);
          else {
            if (snapshot.data)
              return Stack(
                children: [
                  UserProfile(
                    MainMgr.instance.selfCOUserID,
                    null,
                    showBackButton: false,
                  ),
                  Positioned(
                    top: 60,
                    child: RaisedButton(
                      child: Text('Log out'),
                      color: Color.fromARGB(255, 29, 161, 242),
                      onPressed: () async {
                        await MainMgr.instance.logout();
                        setState(() {});
                      },
                    ),
                  ),
                ],
              );
            else
              return LoginSignupPage();
          }
        } else
          return Container();
      },
    );
  }

【问题讨论】:

  • 你能把你第四个孩子的代码贴出来吗?
  • initState()每次切换到第4个孩子时调用?
  • @Henok 整个孩子太复杂而无法简化,它几乎占我应用程序代码的 30%。很难简化它。因此,我在问题中描述了我的结构,试图找出可能来自比我更有经验的专业人士的任何潜在原因。
  • 我只是想看看你是如何在 FutureBuilder 中存储你的未来的,如果可以的话在这里评论一下
  • @pskink 孩子本身的initState() 不会每次都被调用。但是内在小孩(B)的initState()被一遍又一遍地调用。

标签: flutter flutter-layout


【解决方案1】:
  //below your class's state
  Future future; 


  //inside your init state add
  future = MainMgr.instance.isLoggedIn();


  //inside your FutureBuilder 
  return FutureBuilder<bool>(
      future: future,//here is whats important
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting)
          return Center(child: Cir
      //rest of the code


【讨论】:

  • 哦!这就是你应该如何使用FutureBuilder,我都弄错了。谢谢,让我在我的应用中试试这个。
  • 是的,@pskink 还建议在 init 状态中初始化你的未来。
猜你喜欢
  • 2014-03-10
  • 1970-01-01
  • 2014-05-30
  • 2019-08-20
  • 1970-01-01
  • 2012-04-29
  • 2012-10-06
  • 1970-01-01
  • 2020-01-24
相关资源
最近更新 更多