【问题标题】:The argumnet type 'Null Funcion(DataSnapshot)' cnt be assigned to the parameter type 'Future Or <dynamic> Function(DataBaseEvent)'参数类型“Null Function(DataSnapshot)”不能分配给参数类型“Future Or <dynamic> Function(DataBase Event)”
【发布时间】:2022-01-04 21:16:32
【问题描述】:

我的这个函数给了我一个错误。

getCurrentOnLineUserInfo 函数正在尝试从当前登录用户的 Firebase 数据库中读取数据。

参数类型“Null Function(DataSnapshot)”不能分配给“Future Or Function(DataBaseEvent)”类型的参数

我正在学习一年前的教程,所以问题可能是代码太旧了。我可能需要新的语法什么的。

static void getCurrentOnLineUserInfo() async {
    firebaseUser = await FirebaseAuth.instance.currentUser;
    String userId = firebaseUser!.uid;
    DatabaseReference reference =
        FirebaseDatabase.instance.ref().child("user").child(userId);

    print("getCurrentOnLineUser info executed!");

    print('${firebaseUser!.email}${firebaseUser!.displayName}');
    
    // errors below this

    reference.once().then((DataSnapshot dataSnapshot) {
      if (dataSnapShot!.value != null) {
        userCurrentInfo = Users.fromSnapshot(dataSnapshot);
      }
    });

  }
}

这是我分配数据的班级。这个类没有给出错误

class Users {
  String? id;
  String? email;
  String? phone;
  String? name;

  Users({this.id, this.email, this.phone, this.name});

  Users.fromSnapshot(DataSnapshot dataSnapshot) {
    id = dataSnapshot.key!;

    var data = dataSnapshot.value as Map?;

    if (data != null) {
      email = data?["email"];
      name = data?["name"];
      phone = data?["phone"];
    }
  }
}

【问题讨论】:

    标签: firebase flutter firebase-realtime-database


    【解决方案1】:

    once 方法返回 DatabaseEvent,而不是 DataSnapshotDatabaseEvent是一个封装了DataSnapshotANDDatabaseEventType的类,要提取快照,必须使用DatabaseEvent.snapshot

    reference.once().then((event) {
      final dataSnapshot = event.snapshot;
      if (dataSnapShot!.value != null) {
        userCurrentInfo = Users.fromSnapshot(dataSnapshot);
      }
    });
    

    这是我认为可以满足您的要求的另一种解决方案:

    // async methods should return a future
    static Future<void> getCurrentOnLineUserInfo() async {
        firebaseUser = await FirebaseAuth.instance.currentUser;
        String userId = firebaseUser!.uid;
        DatabaseReference reference =
            FirebaseDatabase.instance.ref().child("user").child(userId);
    
        final snapshot = await reference.get(); // you should use await on async methods
        if (snapshot!.value != null) {
          userCurrentInfo = Users.fromSnapshot(snapshot);
        }
      }
    }
    

    【讨论】:

    • 感谢您的帮助.. 错误消失但仍然无法读取数据
    • 仍然收到错误 userCurrentInfo is null...
    • @mobdev991 对不起,我对实时数据库一无所知,因此我的答案只能来自我所拥有的知识和阅读文档,无论如何,我已经编辑了我的答案以显示不同的可能解决方案,你能检查一个是否有效吗?
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2021-10-10
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多