Flutter Firestore - 如何读写对象数组

7

我一直在使用Flutter读写Firestore中的对象数组时遇到了困难。在写入时,该数组从未在Firestore中更新,我不知道原因。我已经尝试过:

.updateData({"tasks": FieldValue.arrayUnion(taskList.tasks)});

并且

.updateData(taskList.toMap());

但似乎两者都没有做任何事情。

阅读时,我通常会收到错误消息type 'List<dynamic>' is not a subtype of type 'List<Task>'。我相信这与我的类结构有关,但我无法弄清楚。我尝试了许多不同的方法来将数据作为任务列表,但所有尝试都失败了。这是我当前错误的代码:

TaskList.dart

class TaskList {
  String name;
  List<Task> tasks;

  TaskList(this.name, this.tasks);

  Map<String, dynamic> toMap() => {'name': name, 'tasks': tasks};

  TaskList.fromSnapshot(DocumentSnapshot snapshot)
      : name = snapshot['name'],
        tasks = snapshot['tasks'].map((item) {
          return Task.fromMap(item);
        }).toList();

}

Task.dart

class Task {
  String task;
  bool checked;

  Task(this.task, this.checked);

  Map<String, dynamic> toMap() => {
        'task': task,
        'checked': checked,
      };

  Task.fromMap(Map<dynamic, dynamic> map)
      : task = map['task'],
        checked = map['checked'];
}

感谢您的帮助和建议!


请看一下这个答案:https://dev59.com/JK7la4cB1Zd3GeqPXh_u#53149420 - Shyju M
看看这个答案,这个解决了我的问题。 - w461
看看这个答案,这已经为我解决了问题。 - w461
2个回答

8
我最终将任务列表设置为动态类型,这解决了大部分的阅读问题,但我仍然不明白原因。
List<Task> tasks;

对于编写代码,我只是将fromMap()更改为toMap()以初始化任务。

'tasks': tasks.map((item) {
      return item.toMap();
    }).toList(),

Flutter官网提供了与此类似的文档,详情请查看:https://flutter.dev/docs/development/data-and-backend/json#serializing-json-inside-model-classes - Matthew Rideout

0

从Firebase获取一个数组,您可以使用查询快照来获取ArrayList

QuerySnapshot querySnapshot =
            await FirebaseFirestore.instance.collection('EnglishQuotes').get();
// for a specific field
final allData =  querySnapshot.docs.map((doc) => doc.get('item_text_')).toList();
print("length = ${allData.length}");
print("all data = ${allData}");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接