我正在学习使用包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 添加到您的代码中。
删除“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
在您未来的构建器中防止未来崩溃
错误是此 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)
我也有类似类型的问题。
首先,尝试从命令提示符运行项目,看看flutter run
是否出现任何问题。
如果命令提示符显示没有问题并且您的应用程序运行顺利,那么您必须检查 IDE。如果您使用的是 VSCode,则切换到“调试”侧栏,查看“断点”部分中勾选了哪些选项。如果All Exceptions
勾选,则调试器将在每次异常时暂停。取消选中两者All Exceptions
,Uncaught 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)
归档时间: |
|
查看次数: |
36156 次 |
最近记录: |