Flutter调用API获取长字符串时应用卡顿无响应求助
问题描述
数据库中存储了一段约1042字符的长字符串,调用API获取该内容时出现如下差异:
- 在Postman中发起请求,可正常获取完整响应
- 在Flutter项目中调用相同接口,应用直接冻结卡顿,控制台无任何错误输出
关联的Flutter请求代码:
@override Future<ResponseAPI> getPrivacyPolicy() async { try { Dio http = await dio(); Response response = await http.get("/setting/type", queryParameters: { "type": 7, }); final data = response.data; return ResponseAPI.fromJson(data); } on DioException catch (e) { if (e.response?.statusCode == 403) { return ResponseAPI( message: e.response?.data['message'], statusCode: 403, ); } else { return const ResponseAPI( message: "出现异常,请稍后重试", statusCode: 500, ); } } catch (e) { return const ResponseAPI( message: "出现异常,请稍后重试", statusCode: 500, ); } }
Postman响应截图:
排查与解决建议
定位卡顿核心环节
先注释掉return ResponseAPI.fromJson(data),改成直接打印response.data并返回空模型,验证应用是否还卡顿。如果不再卡顿,说明问题出在JSON转模型的解析逻辑上:- 检查
ResponseAPI的fromJson方法,尤其是对应长字符串的字段,是否存在循环引用、无限递归(比如某个字段的解析调用了自身的fromJson方法) - 确认模型字段和API返回的JSON结构完全匹配,避免因字段不匹配导致解析过程中出现死循环
- 检查
检查UI线程阻塞情况
确认调用getPrivacyPolicy()的地方是否在UI线程同步执行了耗时操作:- 比如在
setState里直接等待Future完成,或者没有用async/await正确处理异步逻辑,导致UI线程被卡死 - 建议用
FutureBuilder处理异步请求的UI渲染,或者在initState中异步调用接口,避免阻塞UI
- 比如在
调整Dio响应处理方式
可能是Dio默认的响应解析编码和API返回不匹配,导致长字符串解析卡顿。可以尝试强制指定响应类型为纯文本后再手动解析:Response response = await http.get("/setting/type", queryParameters: {"type": 7}, options: Options(responseType: ResponseType.plain) ); // 手动解析JSON final data = jsonDecode(response.data); return ResponseAPI.fromJson(data);开启Dio日志排查
添加日志拦截器,查看请求和响应的完整流程,确认卡顿发生在哪个阶段:// 在初始化Dio时添加日志拦截器 http.interceptors.add(LogInterceptor(responseBody: true, requestBody: true));
内容的提问来源于stack exchange,提问作者Ikhsan Arfian Nugraha
相关产品推荐
相关产品推荐

