簡體   English   中英

Flutter Firebase StreamBuilder如何只使用一個特定文件

[英]Flutter Firebase StreamBuilder how to use only one specific document

我的代碼運行正常,但運行 4 次時出現問題,我認為問題出在文檔編號上。 在 Firebase Firestore 中,我有 4 個文檔,但我一次只需要使用一個。 那么我該怎么做。 我找到了一些解決方案,但所有解決方案都是舊的,它們的代碼不起作用,似乎已更改。 這是完整的代碼:

  Widget build(BuildContext context) {
final Stream<QuerySnapshot> _usersStream =
    FirebaseFirestore.instance.collection('catanR').snapshots();
height = MediaQuery.of(context).size.height;
width = MediaQuery.of(context).size.width;

return StreamBuilder<QuerySnapshot>(
  stream: _usersStream,
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    if (snapshot.hasError) {
      return Container(
        color: Colors.white,
        child: Center(
          child: Text(
            'Something went wrong',
            style: TextStyle(fontFamily: 'Cairo', fontSize: 24),
          ),
        ),
      );
    }

    if (snapshot.connectionState == ConnectionState.waiting) {
      return Container(
        color: Colors.white,
        child: Center(
          child: CircularProgressIndicator(),
        ),
      );
    }

    return Material(
      child: ListView(
        children: snapshot.data!.docs.map((DocumentSnapshot document) {
          Map<String, dynamic> data =
              document.data() as Map<String, dynamic>;

          return Container( // THİS PART DOESN'T MATTER

實際的Output是這樣的:

在此處輸入圖像描述

但是,當我因 StreamBuilder 和文檔編號而滾動時,會出現該屏幕數。 正如您猜到的那樣,我只需要一個而無需滾動。

在此處輸入圖像描述

在此處輸入圖像描述

如果你想構建一次,不要返回 ListView 及其從集合文檔生成的子項,只需返回包含你要使用的 data[index] 的容器。

使用null safety更新 2023

嘗試以下代碼示例:

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
          stream:  FirebaseFirestore
                   .instance
                   .collection('users')
                   .doc(FirebaseAuth.instance.currentUser!.uid) // 👈 Your document id change accordingly
                   .snapshots(), 
          builder:
              (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            if (snapshot.hasError) {
              return const Text('Something went wrong');
            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Text("Loading");
            }
            Map<String, dynamic> data =
                snapshot.data!.data()! as Map<String, dynamic>;
            return Text(data['fullName']); // 👈 your valid data here
          },
        ),
      ),
    );
  }

另請參閱: How to use StreamBuilder and FutureBuilder for single and multiple documents

暫無
暫無

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

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