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.

Error de navegación de getx. Se ha utilizado el operador de verificación nula en un valor nulo.

Necesito que cuando el usuario haga clic en el botón para agregar datos a Firebase, aparezca la barra de serpiente con un mensaje de éxito y luego regrese. Pero NO ocurre ninguna navegación.

El error ocurre cuando uso el navegador:

Error: Operador de comprobación de nulidad utilizado en un valor nulo

El código es:

class AddProductController extends GetxController {

  addProduct() async {
    if ((addProductFormKey.currentState?.validate() ?? false) && pickedPhoto != null) {
      String docID = FirebaseFirestore.instance.collection('products').doc().id;
      var url = "";
      try {
        UploadTask uploadTask = FirebaseStorage.instance
        .ref('users/products/$docID/')
        .putFile(pickedPhoto!);
        uploadTask.whenComplete(() async {
          url = await FirebaseStorage.instance
              .ref('users/products/$docID/')
              .getDownloadURL();
          await FirebaseFirestore.instance
              .collection("products")
              .doc(docID)
              .set({
            "imgUrl": url,
          }, SetOptions(merge: true));
          Get.snackbar(
            "Éxito",
            "Su producto ha sido agregado",
            snackPosition: SnackPosition.BOTTOM,
          );
        }).catchError((onError) {
          print(onError);
        });

        return Get.toNamed(Routes.PRODUCTS); // => no funciona
      } catch (e) {
        print("\n Error $e \n");
      }
    }
  }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr la funcionalidad deseada sin navegación, necesitamos eliminar la línea donde ocurre la navegación, que es Get.toNamed(Routes.PRODUCTS). Esto evitará el error del operador nulo que se utiliza en un valor nulo durante la navegación.

    El código actualizado será:

    class AddProductController extends GetxController {
    
      addProduct() async {
        if ((addProductFormKey.currentState?.validate() ?? false) &&
            pickedPhoto != null) {
          String docID = FirebaseFirestore.instance.collection('products').doc().id;
          var url = "";
          try {
            UploadTask uploadTask = FirebaseStorage.instance
                .ref('users/products/$docID/')
                .putFile(pickedPhoto!);
            uploadTask.whenComplete(() async {
              url = await FirebaseStorage.instance
                  .ref('users/products/$docID/')
                  .getDownloadURL();
              await FirebaseFirestore.instance
                  .collection("products")
                  .doc(docID)
                  .set({
                "imgUrl": url,
              }, SetOptions(merge: true));
              Get.snackbar(
                "Éxito",
                "Su producto se ha añadido",
                snackPosition: SnackPosition.BOTTOM,
              );
            }).catchError((onError) {
              print(onError);
            });
    
            //Eliminar la línea de navegación
          } catch (e) {
            print("\n Error $e \n");
          }
        }
      }
    }
    

    Ahora, el mensaje de éxito se mostrará utilizando el método Get.snackbar, y no ocurrirá ninguna navegación, evitando el error.

Comments are closed.