Flutter中使用Dio获取数据时出现间歇性FormatException

问题描述 投票:0回答:1

在 Flutter 应用程序中使用 Dio 库从 API 获取数据时,我遇到间歇性 FormatException,并显示消息“意外的输入结束”。此异常并非始终发生;有时我得到正确的数据,有时会出现此错误。

DioException (DioException [unknown]: null
Error: FormatException: Unexpected end of input (at character 3247)
...2024-05-06T15:00:41.000000Z","updated_at":"2024-05-07T08:51:56.000000Z"}}}]

这是我的存储库

  Future<ApiResult<AppointmentsResponse>> getAppointments() async {
final dio = Dio();

dio.interceptors.add(LogInterceptor(responseBody: true));
dio.interceptors.add(LogInterceptor(requestBody: true));

try {
  final prefs = await SharedPreferences.getInstance();
  final String? stored_token = await prefs.getString('token');
  final int? tech_id = await prefs.getInt('tech_id');

  final dio = DioFactory.getDio();

  final response = await dio.get(
      '$baseurl/api/appointments/tech/$tech_id/all',
      options: Options(
        headers: {'Authorization': 'Bearer $stored_token'},
      ));

  debugPrint("Raw API Response: $response");

  debugPrint('Response: ${response.statusCode}');
  debugPrint("response11: ${response.data}");

  // Process your response data here
  Map<String, dynamic> responseData = response.data is Map<String, dynamic>
      ? response.data
      : jsonDecode(response.data);
  return ApiResult.success(AppointmentsResponse.fromJson(responseData));
} catch (e, stacktrace) {
  logger.e("Error: $e, StackTrace: $stacktrace");
  return ApiResult.failure(e.toString());
}

}

我的集团提供商中也有这个

 BlocProvider<AppointmentCubit>(
        create: (BuildContext context) => AppointmentCubit(AppointmentRepo(
            apiService: ApiService(Dio(BaseOptions(
          headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
          },
          followRedirects: false,
          // // will not throw errors
          validateStatus: (status) => true,
        ))))),
      ),
json flutter dart http dio
1个回答
0
投票

所以在看到我们的之后我有一个建议你应该使用这个。

Future<ApiResult<AppointmentsResponse>> getAppointments() async {
final dio = Dio();

dio.interceptors.add(LogInterceptor(responseBody: true));
dio.interceptors.add(LogInterceptor(requestBody: true));

try {
  final prefs = await SharedPreferences.getInstance();
  final String? stored_token = await prefs.getString('token');
  final int? tech_id = await prefs.getInt('tech_id');

  final dio = DioFactory.getDio();

  final response = await dio.get(
      '$baseurl/api/appointments/tech/$tech_id/all',
      options: Options(
        headers: {'Authorization': 'Bearer $stored_token'},
      ));

  debugPrint("Raw API Response: $response");

if (response.statusCode == 200) {
 debugPrint('Response: ${response.statusCode}');
  debugPrint("response11: ${response.data}");
//process your respone data here 

Map <String, dynamic> responseData = responseData is Map<String,  dynamic>

? response.data : jsoneDecode(response.data);
return ApiResult.success(AppointmentsResponse.fromJson(responseData));
} else{
// handle non-200 status code
return ApiResult.failure("failed to get appointments. Status code: ${response.statusCode}");
}
} catch (e, stacktrace) {
  logger.e("Error: $e, StackTrace: $stacktrace");
  return ApiResult.failure(e.toString());
}

我添加了一些内容希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.