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
相关产品推荐
相关产品推荐

