如何使用Riverpod软件包从Flutter中的Firebase集合中获取所有文档?

问题描述

我正在使用提供程序包,并有一个提供程序,该提供程序从全局变量的想法中获取其初始值,该想法包含json数据列表且类型为List >。

以下是该代码,可以正常工作。

final ideasListProvider = StateNotifierProvider<IdeaList>((ref) {
  return IdeaList([for (var i in ideas) Idea.fromJson(i)]);
});

现在,我要实现的目标是替换可变主意,而使用从firebase上的集合中获得的文档列表。

但是我不确定如何从这里开始。

这是第二个从Firestore获取快照形式的提供程序。

final firbaseIdeaProvider = StreamProvider.autoDispose((ref) {
  return FirebaseFirestore.instance.collection('ideas').snapshots();
});

我现在该怎么办? 我其余的代码依赖于ideaListProvider,因此我将不得不以某种方式向其提供firebase上idea集合中的文档列表。

解决方法

好消息,您的方向正确。首先,您要做的可能是将Firestore数据映射到数据模型。这可以通过创建一个从Firestore数据流映射的新流来实现:

final firebaseIdeaProvider = StreamProvider.autoDispose<List<Idea>>((ref) {
  final stream = FirebaseFirestore.instance.collection('ideas').snapshots();
  return stream.map((snapshot) => snapshot.docs.map((doc) => Idea.fromJson(doc.data())).toList());
});

现在剩下的就是阅读您的StreamProvider。可以处理加载,错误和新数据状态的示例如下(使用hooks_riverpod):

class IdeasExample extends HookWidget {
  const IdeasExample({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ideas Example'),),body: useProvider(firebaseIdeaProvider).when(
        loading: () => const Center(child: CircularProgressIndicator()),error: (err,stack) => Center(child: Text(err.toString())),data: (ideas) {
          return ListView.builder(
            itemCount: ideas.length,itemBuilder: (_,index) {
              return ListTile(
                title: Text(ideas[index].toString()),);
            },);
        },);
  }
}

不带钩子

class IdeasExample extends ConsumerWidget {
  const IdeasExample({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context,ScopedReader watch) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ideas Example'),body: watch(firebaseIdeaProvider).when(
        loading: () => const Center(child: CircularProgressIndicator()),);
  }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...