【问题标题】:Access list field from QueryDocumentSnapshot来自 QueryDocumentSnapshot 的访问列表字段
【发布时间】:2021-11-10 18:06:40
【问题描述】:

我不知道如何从 Flutter 中的 QueryDocumentSnapshot 对象中访问一个字符串列表字段。

如果我像element['tags'][0] 那样直接访问列表中的项目,它会起作用 有没有办法将“标签”字段添加到字符串列表中?或者通过单独获取每个项目来获取列表的大小以重新创建它?

Future<UserData> getUserData() async {
   QuerySnapshot userExpenses = await getUserExpenses();
   List<Expense> expenses = [];
   userExpenses.docs.forEach((element) {
      Expense e = new Expense();
      e.description = element.get('description');
      e.price = element.get('price');
      e.tags = [];
      e.tags.add(element.get('tags')[0]);
      e.id = element.id;
      expenses.add(e);
   });
   ........
}

Future<QuerySnapshot> getUserExpenses() async {
    return FirebaseFirestore.instance
        .collection('expenses')
        .where('uuid', isEqualTo: FirebaseAuth.instance.currentUser?.uid)
        .get();
}

class Expense {
  late String id;
  late String price;
  late String description;
  late List<String> tags;
}

【问题讨论】:

  • 您能否再分享一点,例如您的代码,以及文档在 firebase 中的外观以及您要访问的字符串的屏幕截图。
  • @HuthaifaMuayyad 如何在不知道 firestore 中有多少的情况下填充费用对象中的标签列表?
  • @adi.neag 我的answer 对您的问题有帮助吗?

标签: flutter dart google-cloud-firestore


【解决方案1】:

从我做的测试来看,没有必要使用add()方法将element.get('tags')赋值给e.tags字段。

由于您正在为您的 e Expense 对象初始化一个数组,您可以使用 = 等于运算符立即分配它。

但是,请记住,当您分配一个变量时,分配中的两个元素必须是同一类型,因为如果您执行以下操作:

e.tags = doc.get('tags');

你会得到这个错误:

errors.dart:187 Uncaught (in promise) 错误:需要一个“List”类型的值,但得到一个“List”类型的值

因为List&lt;dynamic&gt; is not a subtype of List&lt;String&gt;

从那里,我们应该cast the List&lt;dynamic&gt; into List&lt;String&gt; 来匹配类型,像这样:

e.tags = List<String>.from(doc.get('tags'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多