#flutter #dart
#флаттер #dart
Вопрос:
Я все еще новичок в flutter. У меня есть сетевой вызов, который нужно выполнить. Но перед этим мне нужно проверить, есть ли у устройства подключение к Интернету и доступен ли сервер api server. Мне удалось проверить, доступно ли подключение к Интернету, но я не могу показать, когда сервер недоступен
Это то, что я сделал до сих пор:
login(username, password) async {
final String url = "http://10.0.2.2:8080/api/auth/signin"; // iOS
var responseJson;
try {
final response= await http.post(
url,
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{
'username': username,
'password': password,
}),
);
responseJson = _response(response);
} on SocketException {
throw FetchDataException('No Internet connection');
}
print(responseJson);
SharedPreferences prefs = await SharedPreferences.getInstance();
var parse = jsonDecode(responseJson.body);
await prefs.setString('username', parse["username"]);
await prefs.setString('message', parse["message"]);
await prefs.setString('accessToken', parse["accessToken"]);
return responseJson;
}
dynamic _response(http.Response response) {
switch (response.statusCode) {
case 200:
var responseJson = json.decode(response.body.toString());
print(responseJson);
return responseJson;
case 400:
throw BadRequestException(response.body.toString());
case 401:
case 403:
throw UnauthorisedException(response.body.toString());
case 500:
throw FetchDataException(
'Error occured while Communication with Server with StatusCode : ${response
.statusCode}');
default:
throw FetchDataException(
'Error occured while Communication with Server with StatusCode : ${response
.statusCode}');
}
}
Моя функция кнопки входа в систему
RoundedButton(
text: "LOGIN",
press: () async {
if (_formKey.currentState.validate()) {
progressDialog.show();
await login(
username,
password,
);
SharedPreferences prefs =
await SharedPreferences.getInstance();
String token = prefs.getString("accessToken");
print(token);
if (token == null) {
progressDialog.hide();
showAlertsDialog(context);
} else {
showAlertzDialog(context);
}
}
},
)
Всякий раз, когда я переключаю сервер и нажимаю «Войти», в приложении отображается индикатор выполнения, показывающий вход в систему. Как я могу отобразить предупреждение о том, что нет подключения к серверу?
Комментарии:
1. если на сервере возникла проблема, код состояния вашего http-ответа должен быть связан с 500, поэтому для кода состояния 500 выдается сообщение об ошибке.
2. Привет @SaifulIslam как я могу отобразить ошибку в диалоговом окне предупреждения?
3. покажите мне код, из которого вы вызываете свой
requestGET
метод
Ответ №1:
Вот как вы можете управлять своим вызовом API.
Future<dynamic> requestGET({String url}) async {
try {
final response = await http.get(Uri.parse(url));
switch (response.statusCode) {
case 200:
case 201:
final result = jsonDecode(response.body);
final jsonResponse = {'success': true, 'response': result};
return jsonResponse;
case 400:
final result = jsonDecode(response.body);
final jsonResponse = {'success': false, 'response': result};
return jsonResponse;
case 401:
final jsonResponse = {
'success': false,
'response': ConstantUtil.UNAUTHORIZED
};
return jsonResponse;
case 500:
case 501:
case 502:
final jsonResponse = {
'success': false,
'response': ConstantUtil.SOMETHING_WRONG
};
return jsonResponse;
default:
final jsonResponse = {
'success': false,
'response': ConstantUtil.SOMETHING_WRONG
};
return jsonResponse;
}
} on SocketException {
final jsonResponse = {
'success': false,
'response': ConstantUtil.NO_INTERNET
};
return jsonResponse;
} on FormatException {
final jsonResponse = {
'success': false,
'response': ConstantUtil.BAD_RESPONSE
};
return jsonResponse;
} on HttpException {
final jsonResponse = {
'success': false,
'response': ConstantUtil.SOMETHING_WRONG //Server not responding
};
return jsonResponse;
}
}
Вызовите эту функцию и используйте ответ, который я вызываю в методе инициализации StatefulWidget.
@override
void initState() {
// TODO: implement initState
super.initState();
final result = await requestGET('google.com');
if (result['success'] == false) {
// show the dialog
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Error"),
content: Text(result['response']),
actions: [
FlatButton(
child: Text("OK"),
onPressed: () {
Navigator.pop(context);
},
),
],
);
;
},
);
}
}
Комментарии:
1. Спасибо @Sandeep, как я могу сопоставить сообщение с alerdialog?
2. @blackbird пожалуйста, поддержите, если какой-либо ответ сработает для вас. Спасибо
Ответ №2:
Я думаю, вы можете проверить код ответа из вызова api, используя запрос http-кода по этой ссылке http status code
как вы можете проверить ответ от json следующим образом:
Future<String> checkServerResponse() await
{
http.Response response =
await http.get('server_link'):
print(response.statusCode);
}
теперь, как вы можете видеть, код ответа сервера основан на коде состояния http.