簡體   English   中英

如何使用 Flutter 和 Future Builder 從 Cloud Firestore 正確檢索數據?

[英]How to properly retrieve data from Cloud Firestore using Flutter and Future Builder?

我是 Flutter 的新手,尤其是 Cloud Firestore。 我的數據存儲為 Map,其中包含我收藏中的另一個 Map。 為了盡可能減少對我的數據庫的查詢,我會將數據存儲在一個文檔中,並且只想檢索最新的文檔。 關於獲取數據的代碼:

Future<Map<dynamic, dynamic>> fetchData() async {
  final _firestore = FirebaseFirestore.instance;
  late Map<dynamic, dynamic> data;

  try {
    await _firestore
        .collection('collection')
        .orderBy('timestamp', descending: true)
        .limit(1)
        .get()
        .then((value) => data = value.docs.first.data());
  } catch (e) {
    print(e);
  }
  return data;
}

首先,我想知道是否有更好的方法從我收藏的最新文檔中獲取存儲的 map?

其次,我想等待它完成,然后使用 FutureBuilder 將我的 map 的每個元素顯示為文本,例如。 在稍后階段,我正在考慮使用一個在 initState 中調用的提供程序,它可以將檢索到的數據發送到各種屏幕。 現在,我只是想顯示數據,但似乎我誤解了它是如何工作的:

class Home extends StatefulWidget {
  Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  late Future<Map<dynamic, dynamic>> fixtures;

  @override
  void initState() {
    fixtures = _getData();
    super.initState();
  }

  Future<Map<dynamic, dynamic>> _getData() async {
    return await fetchData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
      child: FutureBuilder(
          future: fixtures,
          builder: (BuildContext context,
              AsyncSnapshot<Map<dynamic, dynamic>> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(child: Text('loading...'));
            } else {
              if (snapshot.hasError) {
                return Center(child: Text('Error: ${snapshot.error}'));
              } else {
                return Center(child: Text('${snapshot.data!['XY']}'));
              }
            }
          }),
    ));
  }
}

它有點像這樣工作,但我覺得它不正確。 我不太明白的是如何從快照中正確訪問數據,如何正確存儲所有數據,以及是否有更好的方法。 文檔總是簡單地說 snapshot.data 但實際上並沒有使用檢索到的數據來執行任何操作。

提前謝謝了。

對我來說看起來不錯,如果可能有點令人費解。

我可能會將您的fetchData簡化為:

Future<Map<dynamic, dynamic>> fetchData() async {
  var value = await FirebaseFirestore.instance
        .collection('collection')
        .orderBy('timestamp', descending: true)
        .limit(1)
        .get()
  return value.docs.first.data();
}

變化:

  • 刪除了catch 由於您並沒有真正處理錯誤,因此最好讓它冒泡並僅在頂層捕獲錯誤,然后您可以在其中集中記錄它們或將它們發送到 Crashlytics。
  • 結合了awaitthen. 使用另一個。

暫無
暫無

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

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