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.

Migración de nulidad segura en Flutter – top_snackbar_flutter

Hice una migración de Dart para actualizar mi proyecto a nulos-seguros. Tengo varios problemas que resolver, ya que se trata de un proyecto antiguo. Sin embargo, hay una cosa que me está confundiendo mucho y no puedo encontrar una solución.

Estoy utilizando el paquete “top_snackbar_flutter” y actualicé a la versión nulos-seguros (última versión 1.0.2).

Tenía el siguiente código:

Widget showTopBarErrorWidget({required context, String? messageArg}) {
  showTopSnackBar(
      context,
      CustomSnackBar.error(
        message: messageArg ??
            "Error al iniciar los planes de sesión. Por favor, inténtelo de nuevo.",
      ),
      displayDuration: Duration(seconds: 5));
}

Widget showTopBarSuccessWidget({required context, String? messageArg}) {
  showTopSnackBar(
    context,
    CustomSnackBar.success(
      message: messageArg ?? "Éxito",
    ),
  );
}

Este código se utiliza en varios lugares para mostrar errores y éxitos. Así que espero solucionar esto y ver desaparecer todos mis errores relacionados con este snackbar.

Aquí tienes un ejemplo de la referencia:

Future verifyIapPurchase({BuildContext? context, Map? body}) async {
    var _data = {"valid": false};
    try {
      final _res = await sl<isubscriptionservice>().verifyPurchase(body: body);
      return (_res != null && _res.data != null) ? _res.data : _data;
    } catch (err) {
      showTopBarErrorWidget(
          context: context,
          messageArg: err.message ?? "Error al verificar la suscripción");
      return _data;
    }
}

Los errores que obtengo son los siguientes:
Imagen de error en VSCode

Me di cuenta de que la función realmente es void,
Imagen de descripción del código
pero necesito devolver un Widget. Intenté agregar un bloque try y catch pero no funcionó.

dart
Widget showTopBarErrorWidget({required context, String? messageArg}) {
try {
showTopSnackBar(
context,
CustomSnackBar.error(
message: messageArg ??
"Error al iniciar los planes de sesión. Por favor, inténtelo de nuevo.",
),
displayDuration: Duration(seconds: 5));
} on Exception catch (e) {
print(e);
rethrow;
}
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solucionando problemas con el paquete top_snackbar_flutter después de migrar a null-safety

    Después de migrar un antiguo proyecto de Flutter a null-safety, es posible que haya algunos problemas que deban abordarse. Uno de estos problemas es con el paquete top_snackbar_flutter. En este caso, el código está generando errores relacionados con la función que tiene un tipo de retorno void en lugar de tipo Widget, que es necesario que se devuelva.

    Para solucionar este problema, puedes envolver el código dentro de un widget Builder que devuelva el Snackbar. Así es como puedes modificar tu código:

    Widget showTopBarErrorWidget({required context, String? messageArg}) {
      return Builder(builder: (BuildContext context) {
        showTopSnackBar(
            context,
            CustomSnackBar.error(
              message: messageArg ??
                  "Error al iniciar los planes de sesión. Por favor, inténtalo de nuevo",
            ),
            displayDuration: Duration(seconds: 5));
        return const SizedBox.shrink();
      });
    }
    
    Widget showTopBarSuccessWidget({required context, String? messageArg}) {
      return Builder(builder: (BuildContext context) {
        showTopSnackBar(
          context,
          CustomSnackBar.success(
            message: messageArg ?? "Éxito",
          ),
        );
        return const SizedBox.shrink();
      });
    }
    

    Al envolver el código dentro del widget Builder, puedes devolver un widget vacío (SizedBox.shrink()) mientras sigues mostrando el Snackbar. Esto debería solucionar el problema con la función void y ahora deberías poder ver que desaparecen todos los errores relacionados con el Snackbar.

    ¡Espero que esto ayude!

Comments are closed.