Flutter / Firestore - 如何访问 Firebase 上的嵌套元素?

Posted

技术标签:

【中文标题】Flutter / Firestore - 如何访问 Firebase 上的嵌套元素?【英文标题】:Flutter / Firestore - How can I reach nested elements on Firebase? 【发布时间】:2021-08-13 19:41:54 【问题描述】:

我正在开发一个英语词汇学习应用程序。 我创建了一些数据类来创建不同的对象: 以下是其中两个:

class CarnetWords 
  int? iD;
  int? wrong;
  int? right;
  double? mastery;
  CarnetWords(
      @required this.iD,
      @required this.wrong,
      @required this.right,
      @required this.mastery);


class VocList 
  String? ref;
  String? titre;
  DateTime? creation;
  DateTime? modification;
  DateTime? firstSession;
  DateTime? latestSession;
  double? mastery;
  List<CarnetWords>? wordId;
  VocList(
      @required this.ref,
      @required this.titre,
      @required this.creation,
      @required this.modification,
      @required this.firstSession,
      @required this.latestSession,
      @required this.mastery,
      @required this.wordId);

我的问题是我需要将这些元素上传到 firebase。 它工作正常:我设法将我的对象“转换”为地图等......这是在 firebase 上的样子:

现在我需要检索这些元素,但我不知道如何进入“mots”列表并创建我的对象列表。 到目前为止,这是我的代码。我尝试使用 ['id']... 显然不起作用...

final _fireStore3 = FirebaseFirestore.instance
        .collection('familyAccounts')
        .doc(id)
        .collection('users')
        .doc('user2')
        .collection('vocList');
    await _fireStore3.get().then((QuerySnapshot querySnapshot) 
      querySnapshot.docs.forEach((doc) 
        _carnetVoc2.add(
          VocList(
            ref: doc['ref'],
            titre: doc['titre'],
            creation: doc['dateCreation'].toDate(),
            modification: doc['dateModification'].toDate(),
            firstSession: doc['firstSession'].toDate(),
            latestSession: doc['latestSession'].toDate(),
            mastery: doc['mastery'].toDouble(),
            wordId: [
              CarnetWords(
                  iD: doc['mots']['id'],
                  wrong: doc['mots']['wrong'],
                  right: doc['mots']['right'],
                  mastery: doc['mots']['mastery'].toDouble())
            ],
          ),
        );
      );
    );

【问题讨论】:

我认为您只是忘记了数组 ID,您的“mots”将地图存储在数组中,您还必须传递要从中获取数据的数组的索引;我不能告诉你如何准确地访问它,因为我也是 firestore 的菜鸟,但这应该是你面临的问题 是的,感觉那里应该有某种附加循环......但我不知道如何在那里实现它...... ***.com/questions/50808513/… 看这里 【参考方案1】:

也许是这样工作的,首先你遍历列表的元素,然后将列表添加到对象中,

await _fireStore3.get().then((QuerySnapshot querySnapshot) 
  querySnapshot.docs.forEach((doc) 
    List<CarnetWords> carnetWords = [];
    Map mots = doc['mots'];
    
    mots.forEach((index, value)
      carnetWords.add(CarnetWords(id: value.id, wrong: value.wrong, right: value.wrong, mastery: value.mastery.toDouble()));
    );
    
    _carnetVoc2.add(
      VocList(
        ref: doc['ref'],
        titre: doc['titre'],
        creation: doc['dateCreation'].toDate(),
        modification: doc['dateModification'].toDate(),
        firstSession: doc['firstSession'].toDate(),
        latestSession: doc['latestSession'].toDate(),
        mastery: doc['mastery'].toDouble(),
        wordId: carnetWords,
      ),
    );
  );

【讨论】:

感谢您的帮助。我还没有尝试过,但我相信它会奏效。我设法使用循环解决了这个问题。见上面的答案。我相信您使用 forEach 方法的代码也会这样做。我总是在使用 foreach 方法编写代码时遇到问题。例如在你给我的代码中:什么是“索引”?什么是“价值”? 所以,你下面的解决方案和我在这里做的一样,索引(在 mox 树中,索引是数字 0、1、2,每个都有值),值是内容在里面,就像在下面的代码中一样,您调用了 indivMots。很高兴你成功了。 再次感谢您的建议。它看起来比我的更简洁:)【参考方案2】:

我设法解决了这样的问题:

await _fireStore3.get().then((QuerySnapshot querySnapshot) 
      querySnapshot.docs.forEach((doc) 
        List<dynamic> mots = doc['mots'].toList();
        List<CarnetWords> wordId = [];
        for (Map indivMots in mots) 
          wordId.add(
            CarnetWords(
                iD: indivMots['id'],
                wrong: indivMots['wrong'],
                right: indivMots['right'],
                mastery: indivMots['mastery']),
          );
        

【讨论】:

以上是关于Flutter / Firestore - 如何访问 Firebase 上的嵌套元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何从flutter中的firestore文档字段中获取数据?

如何在flutter中从云Firestore中获取数据?

Flutter:Google Maps 如何从 Firestore 设置图标

如何在flutter中获取firestore文档的documentid?

如何使用 Flutter 配置 Firebase Firestore 设置

Flutter / Firestore - 如何访问 Firebase 上的嵌套元素?