Django Rest Framework返回JSON正常但Flutter应用无法获取数据
问题排查与解决步骤
1. 优先修复安卓HTTP权限限制
安卓9及以上系统默认禁止明文HTTP请求,你当前请求地址http://10.0.2.2:8000属于HTTP协议,会被系统直接拦截,导致请求中断无后续日志输出。
修改android/app/src/main/AndroidManifest.xml配置:
- 在
<manifest>根标签下添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 在
<application>标签中添加明文流量允许属性:
<application android:usesCleartextTraffic="true" ... 其他原有属性 >
2. 配置Django跨域支持
Django默认拦截跨域请求,Flutter端请求会被CORS策略拦截:
- 安装跨域依赖:
pip install django-cors-headers - 修改Django项目
settings.py:- 在
INSTALLED_APPS中添加'corsheaders' - 在
MIDDLEWARE列表最顶部添加'corsheaders.middleware.CorsMiddleware' - 新增配置
CORS_ALLOW_ALL_ORIGINS = True(开发阶段用,生产环境替换为指定允许的域名)
- 在
3. 新增请求异常捕获,定位报错原因
你当前的_retrieveRecord函数没有异常捕获逻辑,请求报错后会直接中断执行,导致print语句完全不运行,替换函数代码如下:
_retrieveRecord() async { try { annSystem = []; final response = await client.get(Uri.parse('http://10.0.2.2:8000/records/?format=json')); // 先判断请求状态码是否正常 if (response.statusCode == 200) { List responseData = json.decode(response.body); responseData.forEach((element) { annSystem.add(AnnSystem.fromMap(element)); }); print(responseData); print("function calling"); // 组件卸载后避免调用setState报错 if (mounted) { setState(() {}); } } else { print("请求失败,状态码:${response.statusCode}"); } } catch (e, stackTrace) { // 打印报错信息和堆栈,方便定位问题 print("请求执行报错:$e"); print("报错堆栈:$stackTrace"); } }
4. 其他代码细节修正
- 下拉刷新的
onRefresh需要等待请求完成,添加await:
onRefresh: () async { await _retrieveRecord(); },
- 浮动按钮的
onPressed不要加括号,否则页面加载时就会直接执行函数:
onPressed: _addRecord,
内容的提问来源于stack exchange,提问作者Mrr Ahmer
相关产品推荐
相关产品推荐

