#flutter #dart #exception #try-catch #flutter-http
#flutter #dart #исключение #try-catch #flutter-http
Вопрос:
Я попадаю в это странное исключение, которое продолжает приходить и замораживать мое приложение.
Я пытаюсь обработать исключения SocketException и TimeoutException в http-пакете с помощью пакета поставщика.
class Auth with ChangeNotifier{
..........
Future<User> getUser(String id) async {
try {
final user = (await http.post("${Domain.ADDRESS}/user",
headers: {"auth-token": _token}, body: {"userId": id}))
.body;
} on SocketException {
throw HttpException("DISCONNECTED");
} on TimeoutException {
throw HttpException("TIMEOUT");
} catch (error) {
print(error);
throw HttpException("SOMETHING_WENT_WRONG");
}
notifyListeners();
return userdata;
}
......
}
когда интернет в не подключенном приложении зависает при
on SocketException {
throw HttpException("DISCONNECTED"); <------------ Exception has occurred.
HttpException (DISCONNECTED)
Но я справляюсь с этим на следующем экране
@override
Future<void> didChangeDependencies() async {
......
setState(() {
isLoading = true;
});
try{
user= await Provider.of<Auth>(context)
.getUser(Provider.of<Auth>(context).userId);
if (this.mounted) {
setState(() {
isLoading = false;
});
}
}on HttpException catch(error){
if(error.toString().contains("DISCONNECTED")){
Scaffold.of(context).showSnackBar(SnackBar(content: Text("Please check your internet
connection"),));
}
}catch(error){
print(error);
}
super.didChangeDependencies();
}
Пользовательское исключение HttpException.dart
class HttpException implements Exception {
final String message;
HttpException(this.message);
@override
String toString() {
return message;
}
}
Ответ №1:
Итак, если я вас правильно понимаю, ваша среда IDE приостанавливается при возникновении исключения, даже если вы его правильно перехватили.
Можете ли вы сказать мне, что происходит после возобновления / приостановки используемой IDE, ведет ли она себя так, как ожидалось, и печатает это?
if(error.toString().contains("DISCONNECTED")){
Scaffold.of(context).showSnackBar(SnackBar(content: Text("Please check your internet
connection"),));
Потому что, если это так, это означает, что у вас, вероятно, установлены точки останова для всех исключений, а не только для неперехваченных исключений.
Комментарии:
1. Да, я понял. и еще одна вещь. Я могу перехватить исключение в следующем блоке catch, а не в следующем
on HttpException catch(error){ }
, мне не нужно писать эти строки.2. Ах да, я вижу, кстати, можете ли вы отметить мой ответ как решение, чтобы я мог получить очки ^^
Ответ №2:
У меня также была эта проблема, и я узнал, что это было связано с ошибочной версией flutter beta / dev, которая у меня была.
Решение
Я исправил это, изменив канал на стабильный и обновив до последней версии.
flutter channel stable
flutter upgrade
Если вы хотите, вы также можете изменить канал на master, чтобы использовать новейшие функции flutter. Но я бы действительно предложил использовать стабильный канал, поскольку он более стабилен и потому, что недавно была выпущена новая стабильная сборка.
Вот ссылка на проблему, с которой вы столкнулись:
https://github.com/flutter/flutter/issues/66488
Комментарии:
1. Он не работает после выполнения этих инструкций, а также ссылки на эту проблему в устройстве ISO. но я использую Android. Есть ли какие-либо проблемы в коде?
2. Я написал новое предложение