【问题标题】:Flutter Firestore Read specific field from specific document via stream functionFlutter Firestore 通过流函数从特定文档中读取特定字段
【发布时间】:2021-09-15 18:02:38
【问题描述】:

基本上我正在努力在我的database.dart 中创建一个函数,我可以在其中调用此函数来显示特定文档中的特定字段。

例如,我想使用Database.readUserProfileData('Profile', 'surname') 将字符串/alt 显示到小部件。

static Future<QuerySnapshot> readUserProfileData({
    required String docId,
    required String field,
  }) async {
    var ref = _mainCollection.get().then((querySnapshot) {
      querySnapshot.docs.forEach((result) {
        Object? data = result.data();
        print(data);
      });
    });
  }

这是我的database.dart

(请忽略UpdateItem 功能,因为我没有正确配置它,因为我从模板复制了它,或者可能为我更新它,哈哈抱歉;))

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';

final FirebaseFirestore _firestore = FirebaseFirestore.instance;

/* ------------------ Database Reference - Main Collection ------------------ */
final CollectionReference _mainCollection = _firestore.collection('_TestFB');

class Database {
  static String? userUid;

  /* -------------------------- Create User Database -------------------------- */
  static Future<void> createUserDataFile({
    required String uid,
    required String surname,
    required int mobile,
  }) async {
    DocumentReference documentReferencer =
        _mainCollection.doc('UserData').collection(uid).doc('Profile');

    Map<String, dynamic> data = <String, dynamic>{
      "surname": surname,
      "mobile": mobile,
    };

    _mainCollection
        .doc('UserData')
        .collection(uid)
        .limit(1)
        .get()
        .then((snapshot) async {
      if (snapshot.size == 1) {
        print("**User Profile Exists");
      } else {
        await documentReferencer
            .set(data)
            .whenComplete(() => print("**New Profile Created for - " + uid))
            .catchError((e) => print(e));
      }
    });
  }

  /* ------------------------- Read User Profile Data ------------------------- */
  static Future<QuerySnapshot> readUserProfileData({
    required String docId,
    required String field,
  }) async {
    var ref = _mainCollection.get().then((querySnapshot) {
      querySnapshot.docs.forEach((result) {
        Object? data = result.data();
        print(data);
      });
    });
  }

提前致谢

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    如果您已经有了文档 ID,那么只需执行以下操作:

    static Future<DocumentSnapshot> readUserProfileData({
        required String docId,
        required String field,
      }) async {
        var ref = _mainCollection.doc(docId).get().then((snapshot) {
            print(snapshot);
            print(snapshot.data()[field]);
        });
      }
    

    您不需要使用forEach,因为您只检索一个文档,而get() 将有一个返回类型Future&lt;DocumentSnapshot&gt;

    【讨论】:

    • 很遗憾,这并没有真正回答如何从 Firestore 上的特定文档中读取特定字段的问题,而是回答了“在读取并检索到 all 来自特定文档的字段,如何返回特定字段值”。
    • @bsplosion 这回答了 OP 提出的问题。答案中的方法是 OP 已经在使用的方法。他们想要获得一个特定的字段,并且他们已经在读取集合中的所有文档,同时可以访问 docId。所以,我所做的就是向 OP 展示如何访问特定字段,如果您已经拥有 OP 想要的文档 ID。
    • @bsplosion(如果我理解你的意思)你无法从文档中读取特定字段。如果您有文档 ID,唯一的方法是检索文档中的所有字段,然后显示您想要的内容。但是,如果您在一个文档中有 10 个字段,则不能读取一个字段而不能读取其他 9 个字段,您只能在文档级别(意味着将检索所有字段)或集合级别读取。这就是 firebase 在所有平台上的工作方式..
    • 当然同意,从技术上讲,目前甚至无法通过客户端方法直接从 Firestore 中选择一个字段。我更想说的是,不幸的是,这个问题的措辞和标记方式是这样的,这意味着与 Flutter/Firestore/任何特定平台有某种关系。正如所回答的那样,这个问题几乎与它的标签无关。 OP 只是不知道如何动态访问对象属性。
    • @bsplosion 哦,我明白了,在这种情况下你可以编辑它。我已经删除了 android 标签,因为它在这里并没有真正使用。但无论如何,这个问题自 5 个月前以来只有 116 次浏览,所以我认为很多人在执行谷歌搜索时都没有找到这个问题/答案,但尽管如此,请随意编辑,如果一切正常,我可以批准编辑美好的!不幸的是,有许多问题的措辞令人困惑:/
    猜你喜欢
    • 2018-09-04
    • 2021-02-01
    • 1970-01-01
    • 2020-09-20
    • 2021-07-04
    • 2023-02-13
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    相关资源
    最近更新 更多