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.

Flutter GetX Get.find() devuelve null solo la primera vez.

Estoy siguiendo el proyecto uber_clone en YouTube. La diferencia entre el tutorial y el mío es que estoy usando GetX. Me enfrento al problema de obtener un valor nulo por primera vez cuando uso datos de otro controlador.

dropOffLocation obtiene datos de SeachController y estoy intentando guardar los datos de dropOff en Firebase, pero por primera vez cuando guardo los datos de dropOff, estos son nulos, por lo que en la base de datos de Firebase se almacenan datos nulos de la longitud y latitud de dropOff, pero después de presionar el botón de cancelar que ejecuta el método cancelRideRequest, busco un destino y luego presiono el botón de solicitud que ejecuta el método saveRideRequest, finalmente puedo almacenar los datos de dropOff en la base de datos de Firebase.

¿Por qué sucede esto y cómo puedo resolverlo?

“`
// HomeController
void saveRideRequest() {
Rx<Address> dropOffLocation = SearchController.to.dropOffLocation;

<pre><code>rideRequestRef =
FirebaseDatabase.instance.reference().child("Ride Requests").push();

var pickUp = pickUpLocation.value;
var dropOff = dropOffLocation.value;
print(dropOff.longitude);

Map pickUpLocMap = {
"latitude": pickUp.latitude.toString(),
"logitude": pickUp.longitude.toString(),
};

Map dropOffLocMap = {
"latitude": dropOff.latitude.toString(),
"logitude": dropOff.longitude.toString(),
};

Map rideInfoMap = {
"driver_id": "waiting",
"payment_method": "cash",
"pickup": pickUpLocMap,
"dropoff": dropOffLocMap,
"created_at": DateTime.now().toString(),
"rider_name": userCurrentInfo!.name,
"rider_phone": userCurrentInfo!.phone,
"pickup_address": pickUp.placeName,
"dropoff_address": dropOff.placeName,
};

rideRequestRef!.set(rideInfoMap);
</code></pre>

}

// …
// …

void cancelRideRequest() {
rideRequestRef!.remove();
}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que la variable “dropOffLocation” es inicialmente nula cuando se llama al método “saveRideRequest” por primera vez. Esto se debe a que la variable “dropOffLocation” depende del “SearchController” que puede que no se haya inicializado todavía.

    Una forma de resolver este problema es verificar si “dropOffLocation” es nula y retrasar la ejecución del método hasta que no lo sea. Esto se puede hacer utilizando el método “ever” proporcionado por el paquete “GetX”:

    void saveRideRequest() {
      Rx<address> dropOffLocation = SearchController.to.dropOffLocation;
    
      ever(dropOffLocation, (Address? dropOff) {
        if (dropOff != null) {
          rideRequestRef =
              FirebaseDatabase.instance.reference().child("Ride Requests").push();
    
          var pickUp = pickUpLocation.value;
    
          Map pickUpLocMap = {
            "latitude": pickUp.latitude.toString(),
            "logitude": pickUp.longitude.toString(),
          };
    
          Map dropOffLocMap = {
            "latitude": dropOff.latitude.toString(),
            "logitude": dropOff.longitude.toString(),
          };
    
          Map rideInfoMap = {
            "driver_id": "waiting",
            "payment_method": "cash",
            "pickup": pickUpLocMap,
            "dropoff": dropOffLocMap,
            "created_at": DateTime.now().toString(),
            "rider_name": userCurrentInfo!.name,
            "rider_phone": userCurrentInfo!.phone,
            "pickup_address": pickUp.placeName,
            "dropoff_address": dropOff.placeName,
          };
    
          rideRequestRef!.set(rideInfoMap);
        }
      });
    }
    

    Aquí, estamos utilizando el método “ever” para escuchar cambios en el valor de “dropOffLocation”. Una vez que “dropOffLocation” no sea nulo, se ejecuta la función de devolución de llamada y se guarda la solicitud de viaje en la base de datos.

    Otra solución es utilizar el widget “Obx” proporcionado por el paquete “GetX” para actualizar la interfaz de usuario cada vez que “dropOffLocation” cambie. Esto asegurará que la interfaz de usuario se actualice solo cuando la variable tenga un valor válido:

    void saveRideRequest() {
      Address? dropOff = SearchController.to.dropOffLocation.value;
    
      rideRequestRef =
          FirebaseDatabase.instance.reference().child("Ride Requests").push();
    
      var pickUp = pickUpLocation.value;
    
      Map pickUpLocMap = {
        "latitude": pickUp.latitude.toString(),
        "logitude": pickUp.longitude.toString(),
      };
    
      Map dropOffLocMap = {
        "latitude": dropOff != null ? dropOff.latitude.toString() : "",
        "logitude": dropOff != null ? dropOff.longitude.toString() : "",
      };
    
      Map rideInfoMap = {
        "driver_id": "waiting",
        "payment_method": "cash",
        "pickup": pickUpLocMap,
        "dropoff": dropOffLocMap,
        "created_at": DateTime.now().toString(),
        "rider_name": userCurrentInfo!.name,
        "rider_phone": userCurrentInfo!.phone,
        "pickup_address": pickUp.placeName,
        "dropoff_address": dropOff != null ? dropOff.placeName : "",
      };
    
      rideRequestRef!.set(rideInfoMap);
    }
    

    Aquí, estamos utilizando “Obx” para obtener el valor actual de “dropOffLocation” y actualizando la base de datos solo si no es nulo. También estamos utilizando operadores de comprobación de nulos para evitar errores de nulos.

Comments are closed.