Flutter:处理错误 Dio 包(404,400 等)

Zef*_*ndo 18 dart flutter

我正在学习使用包DIO https://pub.dev/packages/dio通过 ID 搜索数据,我的问题是每次输入错误的关键字搜索时,应用程序突然崩溃并显示调试消息404 Not Found

在此处输入图片说明

我知道找不到数据,因为我输入了错误的关键字,但我已经用这段代码处理了这个问题

Widget _searchKeywordMahasiswa() {
    return FutureBuilder<List<Mosque>>(
      future: api.getMahasiswaById(_searchText),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.hasData) {
          return Expanded(
            child: ListView.builder(
              shrinkWrap: true,
              itemCount: snapshot.data.length,
              itemBuilder: (BuildContext context, int index) {
                return Text(snapshot.data[index].id);
              },
            ),
          );
        } else if (!snapshot.data) { <<<<<< IN THIS LINE
          return Center(
            child: Icon(
              Icons.sentiment_very_dissatisfied,
              size: 150.0,
            ),
          );
        }
        return CircularProgressIndicator();
      },
    );
    // return CircularProgressIndicator();
  }
Run Code Online (Sandbox Code Playgroud)
Future<List<Mosque>> getMahasiswaById(String id) async{
    try {
      var apiRespon = await dio.get('${Urls.BASE_API_URL}/mahasiswa/get/id/$id');
      var apiResponJson = apiRespon.data;
      print(apiResponJson);
      return (apiResponJson['data'] as List).map((p)=>Mosque.fromJson(p)).toList();

    }on DioError catch (e) { <<<<< IN THIS LINE
      if(e.response.statusCode == 404){
        print(e.response.statusCode);
      }else{
        print(e.message);
        print(e.request);
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

在同样的情况下,如果我收到错误400 错误请求,我的应用程序也会崩溃,而且我已经处理了这个错误,但无法正常工作。

你能帮我解决这个问题吗?

小智 36

 var response = await dio.delete(
          url,
          data: postData,
          options: Options(
            followRedirects: false,
            validateStatus: (status) {
              return status < 500;
            },
            headers: headers,
          ),
        );
Run Code Online (Sandbox Code Playgroud)

请使用下面的代码兄弟,

将 followRedirects、validateStatus 添加到您的代码中。


Mat*_*att 9

删除“on DioError” - 不幸的是,有一些错误(404、500...)Dio 不会处理也不会捕捉到 - 在我的应用程序中也有类似的问题。然后将代码更改为在下面发布或使用其他一些逻辑来“全部捕获”;)

} catch (e) {

    if (e is DioError) {
    //handle DioError here by error type or by error code

    } else {
    ...
    }
 //return empty list (you can also return custom error to be handled by Future Builder)
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您应该正确处理 Future Builder 状态:snapshot.hasData,清空数据并snapshot.hasError在您未来的构建器中防止未来崩溃


Sha*_*dal 6

错误是此 URL 字符串模式 ${Urls.BASE_API_URL}/mahasiswa/get/id/$id

你不能用。运算符并从 "" 内的任何对象访问内部值。您可以将确切的 url 存储在其他变量中并在该行中使用它。代码应该如下。

Future<List<Mosque>> getMahasiswaById(String id) async{
try {
  var baseURL = Urls.BASE_API_URL;
  var apiRespon = await dio.get('${baseURL}/mahasiswa/get/id/$id');
  var apiResponJson = apiRespon.data;
  print(apiResponJson);
  return (apiResponJson['data'] as List).map((p)=>Mosque.fromJson(p)).toList();

}on DioError catch (e) { <<<<< IN THIS LINE
  if(e.response.statusCode == 404){
    print(e.response.statusCode);
  }else{
    print(e.message);
    print(e.request);
  }
}
}
Run Code Online (Sandbox Code Playgroud)


Ani*_*Das 5

我也有类似类型的问题。

首先,尝试从命令提示符运行项目,看看flutter run是否出现任何问题。

如果命令提示符显示没有问题并且您的应用程序运行顺利,那么您必须检查 IDE。如果您使用的是 VSCode,则切换到“调试”侧栏,查看“断点”部分中勾选了哪些选项。如果All Exceptions勾选,则调试器将在每次异常时暂停。取消选中两者All ExceptionsUncaught Exceptions然后尝试刷新重新启动。

希望这能解决您的问题。

断点截面图


小智 5

我遇到了同样的问题,只是改变了我的拦截器

import 'package:dio/dio.dart';

class CustomInterceptor extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
    print("onRequest");
    return super.onRequest(options, handler);
  }

  @override
  Future onResponse(Response response, ResponseInterceptorHandler handler) {
    print("onResponse");
    return null;
  }

  @override
  Future onError(DioError err, ErrorInterceptorHandler handler) async {
    print("onError: ${err.response.statusCode}");
    return handler.next(err);  // <--- THE TIP IS HERE
  }
}
Run Code Online (Sandbox Code Playgroud)