You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:33:39