与 firestore 相比,从 firebase 数据库读取数据

read data from firebase database compared to firestore

由于我正在学习的教程使用的是 firestore,因此我尝试使用 firebase 数据库。你能告诉我哪里错了吗,为什么我不能读取我的数据?

以下是 firestore 的教程代码:

  static Stream<List<Todo>> readTodos() => FirebaseFirestore.instance
      .collection('todo')
      .orderBy(TodoField.createdTime, descending: true)
      .snapshots()
      .transform(Utils.transformer(Todo.fromJson));

变压器方法是这样的:

  static StreamTransformer transformer<T>(
          T Function(Map<String, dynamic> json) fromJson) =>
      StreamTransformer<QuerySnapshot, List<T>>.fromHandlers(
        handleData: (QuerySnapshot data, EventSink<List<T>> sink) {
          final snaps = data.docs.map((doc) => doc.data()).toList();
          final objects = snaps.map((json) => fromJson(json)).toList();

          sink.add(objects);
        },
      );

这是我的 firebase 数据库代码:

  static Stream<List<Todo>> readTodos() => FirebaseDatabase.instance
      .ref("todo")
      .orderByChild(TodoField.createdTime)
      .onValue
      .map((todo) => todo.snapshot.children
          .map((e) => Todo.fromJson(e.value as Map<String, dynamic>))
          .toList()
        ..sort((a, b) => b.createdTime.compareTo(a.createdTime)));

这里是 streambuilder:

    StreamBuilder<List<Todo>>(
      stream: FirebaseApi.readTodos(),
      builder: (context, snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return Center(child: CircularProgressIndicator());
          default:
            if (snapshot.hasError) {
              return buildText('Something Went Wrong Try later');
            } else {
              final todos = snapshot.data;
              TodosController todosController = Get.find();
              todosController.setTodos(todos);
              return TodoListWidget();
            }
        }
      },
    ),

这是我的数据结构:

因此,由于文本是“出了点问题,稍后再试”,我假设错误来自正确的地方。请让我知道或分享正确的代码,非常感谢!

问题二: 也请告诉我我是否正确地按 createdTime 对待办事项进行排序,因为对于 firebase 只允许升序,谢谢!(我想为答案付费,因为我真的问了很多,如果堆栈,解决方案总是节省我的时间溢出有这个功能)

如果您的 AsyncSnapshot 中有错误,您应该显示该错误的内容以了解导致问题的原因:

switch (snapshot.connectionState) {
  case ConnectionState.waiting:
    return Center(child: CircularProgressIndicator());
  default:
    if (snapshot.hasError) {
      print('Error: ${snapshot.error}; // 
      return buildText('Something Went Wrong Try later');
    } else {