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: ¿Por qué la excepción no se captura?

Quiero mostrar un snackbar cuando ocurra un error. La excepción funciona pero no es capturada en main.dart. ¿Puede ver cuál es el problema? Soy nuevo en Flutter así que puede que no sea bueno. Gracias.

main.dart

Future<void> _signInWithPhoneNumber() async {
    try {
      postPhoneInfo(
          tokenValue,
          _packageInfo.appName,
          _packageInfo.version,
          Theme.of(context).platform.toString().substring(15),
          'número de teléfono');
      print('debug : try');
    } catch (e) {
      print('debug : catch');
      // print(e);
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('${e.toString()}')));
    }
  }

Este es postPhoneInfo()

Future<phoneInfo> postPhoneInfo(String token, String appName, String appVersion,
    String platform, String phone) async {
  var queryParameters = {
    'param1': token,
    'param2': appName,
    'param3': appVersion,
    'param4': platform,
    'param5': phone
  };
  var uri =
      Uri.http('~~', '~~', queryParameters);
  final response = await http.post(uri, headers: <String, String>{
    'Content-Type': 'application/json; charset=UTF-8',
  });

if (response.statusCode == 200) {
    final parsedJson = jsonDecode(response.body);

if (parsedJson["Res"] == "1") {
  print("el usuario está registrado");
  return phoneInfo.fromJson(jsonDecode(response.body));
} else {
  print("el usuario no está registrado");
  throw Exception("el usuario no está registrado");
}
} else {
    print(response.statusCode);
    throw Exception('no está conectado');
  }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que la excepción no se está propagando hacia arriba en la función _signInWithPhoneNumber(). Esto puede deberse a que la función postPhoneInfo() se está llamando de forma asíncrona y la excepción se está lanzando en ese contexto, lo que provoca que se maneje allí en lugar de propagarse hacia arriba.

    Para solucionar esto, puedes añadir un bloque try-catch alrededor de toda la llamada a postPhoneInfo() en _signInWithPhoneNumber() o usar un FutureBuilder para manejar la excepción en el árbol de widgets en lugar de hacerlo en el código.

    Para la primera solución, tu código se vería algo así:

    Future<void> _signInWithPhoneNumber() async {
      try {
        await postPhoneInfo(
          tokenValue,
          _packageInfo.appName,
          _packageInfo.version,
          Theme.of(context).platform.toString().substring(15),
          "número de teléfono"
        );
        print("depuración: try");
      } catch (e) {
        print("depuración: catch");
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("${e.toString()}"))
        );
      }
    }
    

    Para la segunda solución, podrías usar un FutureBuilder en tu árbol de widgets para mostrar una barra de snack si hay un error:

    FutureBuilder<phoneinfo>(
    future: postPhoneInfo(...),
    builder: (BuildContext context, AsyncSnapshot<phoneinfo> snapshot) {
    if (snapshot.hasError) {
    ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text("${snapshot.error.toString()}"))
    );
    }
    return ...;
    }
    )

Comments are closed.