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');
}
}
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ónpostPhoneInfo()
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 apostPhoneInfo()
en_signInWithPhoneNumber()
o usar unFutureBuilder
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í:
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 ...;
}
)