切换选项卡时防止StreamBuilder重新加载

时间:2019-07-03 14:10:15

标签: flutter dart

我创建了一个带有两个标签的Flutter应用程序。在第一个标签上,我有一个ListView,它显示来自StreamBuilder的信息。此StreamBuilder通过http获取数据。

问题是:当我切换到第二个选项卡然后又回到第一个选项卡时,ListView将重新加载。

在我将StatefulWidgetAutomaticKeepAliveClientMixin一起使用之前,但现在我正在使用StatelessWidget,所以我不能再使用它了。我认为我的构建方法需要纯粹,但我不知道该怎么做。我看到在StatefulWidget中有initState()方法,但这是相同的问题,我无法使用。

class ListImmeubleTab extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    bloc.fetchAllImmeubles();
    return Scaffold(
        body: StreamBuilder(
            stream: bloc.allImmeubles,
            builder: (context, AsyncSnapshot<List<ImmeubleModel>> snapshot) {
              if (snapshot.hasData) {
                return ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (BuildContext context, int index) {
                      String color;
                      switch(index % 3){
                        case 0:
                          color = "green";
                          break;
                        case 1:
                          color = "blue";
                          break;
                        case 2:
                          color = "red";
                          break;
                      }
                      return ListTile(
                        leading: CircleAvatar(
                          child: Image.asset("assets/houses/house_$color.png"),
                        ),
                        title: Text(snapshot.data[index].numero.toString() + " " + snapshot.data[index].rue),
                        subtitle: Text(snapshot.data[index].zip.toString() + " " + snapshot.data[index].ville),
                      );
                    }
                );
              } else if (snapshot.hasError) {
                return Text(snapshot.error.toString());
              }
              return Center(child: CircularProgressIndicator());
            }
        )
    );
  }
}

1 个答案:

答案 0 :(得分:0)

尝试添加postFrame回调


class Test extends StatelessWidget {

  _callBack(_){

  }

  @override
  Widget build(BuildContext context) {
    WidgetsBinding.instance.addPostFrameCallback(_callBack);
    return Container();
  }
}