如何在Dio包中处理登录错误并显示Toast提示?
解决Dio登录错误的Toast提示问题
你的代码里print('error')没反应,是因为Dio在请求失败时会直接抛出异常,不会走到else分支。比如网络错误、401/404等状态码,都会触发异常,而不是返回非200的response。下面是具体的解决步骤:
1. 添加Toast依赖
用fluttertoast库实现Toast,先在pubspec.yaml里添加依赖:
dependencies: fluttertoast: ^8.2.4
执行flutter pub get完成安装。
2. 用try-catch捕获Dio异常
修改登录方法,把Dio请求放在try块里,用catch捕获异常后显示Toast:
import 'package:fluttertoast/fluttertoast.dart'; import 'package:dio/dio.dart'; class Loginservice extends ILogin { @override Future<UserModel?> login( String username, String password, BuildContext context) async { SharedPreferences preferences = await SharedPreferences.getInstance(); String api = '$baseUrl/login'; final data = {"username": username, "pwd": password}; final dio = Dio(); try { Response response = await dio.post(api, data: data); // 仅请求成功(状态码200)执行这里 final body = response.data; var username = body['username']; var myToken = body['token']; preferences.setString('username', username); preferences.setBool('isLoggedIn', true); Navigator.push( context, MaterialPageRoute(builder: (context) => MainScreen())); return UserModel( username: username, token: body['token'], ); } on DioError catch (e) { // 捕获Dio请求异常 String errorMsg = ''; if (e.response != null) { // 服务器返回错误响应(如账号密码错误) errorMsg = e.response?.data['msg'] ?? '登录失败,请检查账号密码'; } else { // 网络断开、超时等情况 errorMsg = '网络异常,请检查网络连接'; } // 显示Toast提示 Fluttertoast.showToast( msg: errorMsg, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, ); } catch (e) { // 捕获其他未知异常 Fluttertoast.showToast(msg: '登录失败,请稍后重试'); } return null; } }
关键说明
- Dio异常区分:
e.response != null:服务器正常返回了错误信息(比如400状态码),可从e.response.data中读取后端返回的提示文本。e.response == null:属于网络层面的错误,直接提示用户检查网络。
- Toast自定义:
Fluttertoast.showToast可调整提示位置、时长等参数,按需修改即可。 - 代码解耦建议:尽量不要在Service层直接处理UI操作(Toast、页面跳转),可以把错误信息通过返回值或回调传递给UI层处理,让职责更清晰。
内容的提问来源于stack exchange,提问作者Homerunner
相关产品推荐
相关产品推荐

