Flutter 使用 FutureBuilder 检索列表中的数据

Flutter retrieve data in a List with FutureBuilder

目前我正在尝试了解使用 flutter 和 firestore 检索数据的一些基础知识。在我的例子中,我想检索一次数据,所以我决定选择 FutureBuilder 而不是 StreamBuilder

现在,当我在我的小部件树中放置一个打印语句时,我注意到,每次我调用我的函数时,整个树当然都在重建。现在我想使用 Consumer,以便只有我的 Listview.Builder 重新加载,但我无法正常工作。小部件树仍在重建中。希望有人能帮助我。

Consumer<SongProvider>(builder: (context, sProvider, _) {
                  return FutureBuilder(
                      future: songFuture,
                      builder: (context, snapshot) {
                      

                          switch (snapshot.connectionState) {
                            case ConnectionState.none:
                            case ConnectionState.waiting:
                              return Align(
                                alignment: Alignment.center,
                                child: CircularProgressIndicator()
                              );
                            case ConnectionState.done:
                              if (snapshot.hasError) {
                                return Text('Error: ${snapshot.error}');
                              } else {

                                return ListView.builder(
                          itemCount: snapshot.data.length,
                          itemBuilder: (context, index) {
                            return Text(
                                snapshot.data[index]['songName'].toString());
                          });
                              }
                          }

                          
                    }
                  );
            }))
      ],
    )));
  }
}

我怎样才能使 Consumer 正常工作?我想我可能需要用快照替换它,但我不知道我是如何以及从哪里获取数据的。请帮忙

为未来创建一个属性 as Future<dynamic> yourDataFuture; 并在 initState 中将其初始化为

void initState() {
   super.initState();
   yourDataFuture= getData(); // get Data will returns a future
}

然后将此变量作为 future 分配给 FutureBuilder as

...... rest of the code...

future: yourDataFuture,

....... rest of the code....

您还需要处理 ConnectionStates 以防止多次调用。在您的代码中,未来的构建器将调用 3 次。 none 一次,waiting 第二次,done.Read 第三次。因此,当连接状态达到 done

时构建列表