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

Flutter与Laragon本地数据库连接及数据转换问题求助

问题分析与解决方案

你遇到的核心问题是:使用mysql1库执行查询后,错误地把ResultSet对象当成了HTTP请求的Response对象来调用.body属性——mysql1的query()方法返回的是数据库查询结果集ResultSet,不是HTTP响应,自然没有.body属性。

解决步骤

1. 正确处理ResultSet转换

ResultSet里的每一条记录是Row类型,你可以把每个Row转成Map<String, dynamic>,再用你的User.fromJson方法生成对象。修改_fetch方法如下:

void _fetch() async {
  var settings = ConnectionSettings(
    host: '10.0.2.2', 
    port: 3306,
    user: 'raf',
    password: '123',
    db: 'bd'
  );
  var conn = await MySqlConnection.connect(settings);
  var results = await conn.query('select * from posts');
  
  // 用完数据库连接后关闭,避免资源泄漏
  await conn.close();

  // 将结果集中的行转换为Map,再生成User列表
  setState(() {
    users = results.map((row) {
      // row.assoc() 返回键为数据库列名的Map,适配User.fromJson参数
      return User.fromJson(row.assoc());
    }).toList();
  });
}

2. 关键说明

  • row.assoc()方法会把数据库行转换成键为列名(字符串)、值为对应字段值的Map,刚好匹配User.fromJson需要的Map<String, dynamic>参数。
  • 必须调用await conn.close()关闭连接,否则会造成数据库连接资源泄漏。

额外建议

关于直接连接数据库的安全性

直接在Flutter客户端硬编码数据库账号密码是极高风险操作,任何人反编译APP就能拿到凭证并直接操作数据库。虽然本地项目暂时能用,但绝对不能用于生产环境。

更规范的替代方案(无需大幅改动现有Laravel代码)

既然你已经有Laravel网站,最合理的做法是:

  • 在Laravel中新增简单的API接口(比如/api/posts),负责查询数据库并返回JSON格式数据。
  • Flutter通过http库调用该API,解析返回的JSON生成User列表。

这种方式既安全,又符合前后端分离架构,且仅需在Laravel中添加少量路由和控制器代码,完全不影响你已完成的网站功能。

内容的提问来源于stack exchange,提问作者Rafael Reis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:27:44