如何防止IndexedStack中的子项被重建?

时间:2020-09-19 05:10:59

标签: flutter flutter-layout

我有一个IndexedStack,有4个孩子,可以更改4个标签。所有其他3个简单的子程序都运行良好,但是如果切换到第4个子程序,则正在对其进行重建。如何预防呢?

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

我希望它的滚动位置保持在选项卡之间切换时的位置。可能是什么原因?顺便说一句,我尝试将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();
      },
    );
  }

1 个答案:

答案 0 :(得分: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