簡體   English   中英

如何使用 Riverpod 包從 Flutter 中的 firebase 集合中獲取所有文檔?

[英]How to fetch all documents from a firebase collection in Flutter using the Riverpod package?

我正在使用 provider 包並有一個提供者,它從一個全局變量 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();
});

現在我該怎么做? 我的其余代碼依賴於 ideaListProvider,所以我必須以某種方式向它提供來自 firebase 上的想法集合的文檔列表。

好消息,你在正確的軌道上。 首先,您想要做的很可能是將您的 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()),
              );
            },
          );
        },
      ),
    );
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM