es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El tipo de argumento ‘Null Funcion(DataSnapshot)’ no puede ser asignado al tipo de parámetro ‘Future Or Function(DataBaseEvent)’.

Tengo esta función que me está dando un error.

La función getCurrentOnLineUserInfo está tratando de leer datos de la base de datos de Firebase del usuario actual que ha iniciado sesión.

El tipo de argumento ‘Null Funcion(DataSnapshot)’ no puede asignarse al parámetro de tipo ‘Future Or Function(DataBaseEvent)’

Estoy siguiendo un tutorial de hace un año, así que el problema podría ser que el código está desactualizado. Es posible que necesite una nueva sintaxis o algo así.

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

    print("¡Se ejecutó getCurrentOnLineUser info!");

    print('${firebaseUser!.email}${firebaseUser!.displayName}');

    // errores a continuación

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

  }
}

y aquí está mi clase que asigna los datos. Esta clase no da errores.

“`dart
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!;

<pre><code>var data = dataSnapshot.value as Map?;

if (data != null) {
email = data?["email"];
name = data?["name"];
phone = data?["phone"];
}
</code></pre>

}
}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la función getCurrentOnLineUserInfo espera un argumento de tipo FutureOr<dynamic> Function(DatabaseEvent), pero está recibiendo un argumento de tipo Null Function(DataSnapshot). Esto significa que la forma en que estás utilizando el método reference.once().then() es incorrecta.

    Para solucionar este error, intenta actualizar el bloque de código con los siguientes cambios:

        static void getCurrentOnLineUserInfo() async {
            final firebaseUser = FirebaseAuth.instance.currentUser;
            if (firebaseUser == null) return;
    
            final String userId = firebaseUser.uid;
            final DatabaseReference reference =
                FirebaseDatabase.instance.ref().child("user").child(userId);
    
            print("¡Se ejecutó getCurrentOnLineUserInfo!");
    
            print('${firebaseUser.email}${firebaseUser.displayName}');
    
            // código actualizado a continuación
            final dataSnapshot = await reference.once();
            if (dataSnapshot.value != null) {
                userCurrentInfo = Users.fromSnapshot(dataSnapshot);
            }
        }
    

    Aquí, en lugar de usar el método then(), estamos utilizando await para esperar a que el método reference.once() devuelva un objeto DataSnapshot. Luego podemos verificar si dataSnapshot.value no es nulo y crear un objeto User utilizando el constructor fromSnapshot.

    Nota: También agregué una verificación de nulos para la variable firebaseUser al comienzo de la función para evitar posibles errores en tiempo de ejecución.

Comments are closed.