You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 06:06:01