1

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

以下是它的代码,这是预期的。

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

现在我想要实现的是替换变量idea,而是使用我从firebase上的集合中获得的文档列表。

但我不知道如何从这里开始。

这是获取快照表单 Firestore 的第二个提供程序。

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

现在我该怎么做?我的其余代码依赖于ideasListProvider,因此我必须以某种方式为其提供来自firebase 上的idea 集合的文档列表。

4

1 回答 1

6

好消息,你在正确的轨道上。首先,您想要做的可能是将您的 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()),
        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()),
              );
            },
          );
        },
      ),
    );
  }
}
于 2020-10-22T16:03:02.703 回答