如果服务器无法访问颤动,如何显示错误
Posted
技术标签:
【中文标题】如果服务器无法访问颤动,如何显示错误【英文标题】:How to show error if server is unreachable flutter 【发布时间】:2021-03-30 07:16:52 【问题描述】:我还是很陌生。我有一个要执行的网络调用。但在此之前,我需要检查设备是否具有互联网连接以及服务器是否是 api 服务器是否可以访问。我已设法检查互联网连接是否可用,但无法显示何时无法访问服务器
这是我到目前为止所做的:
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);
,
)
每当我切换服务器并单击登录时,应用程序都会卡在显示登录的进度条。如何显示与服务器没有连接的警报?
【问题讨论】:
如果服务器出现问题而不是您的 http 响应状态码应该与 500 相关,因此对于状态码 500 会抛出错误消息。 嗨@SaifulIslam 如何将错误映射到警报对话框? 显示你调用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的init方法中调用它。
@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);
,
),
],
);
;
,
);
【讨论】:
谢谢@Sandeep,如何将消息映射到alerdialog? @blackbird 请投票,当任何答案对您有用时。谢谢【参考方案2】:我认为您可以使用此链接http status code的http代码请求来检查api调用的响应代码
您可以像这样检查来自 json 的响应:
Future<String> checkServerResponse() await
http.Response response =
await http.get('server_link'):
print(response.statusCode);
现在你可以看到基于 http 状态码的服务器响应码。
【讨论】:
以上是关于如果服务器无法访问颤动,如何显示错误的主要内容,如果未能解决你的问题,请参考以下文章