同网络下Flutter通过mysql1拉取电脑端MySQL数据问题求助
同局域网下Flutter模拟器访问本地MySQL实操方案
1. 先配置本地MySQL允许外部访问
默认MySQL只允许本机回环访问,要先改配置:
- 找到MySQL配置文件:Windows下为MySQL安装目录/ProgramData目录下的
my.ini,macOS/Linux下为/etc/mysql/my.cnf或/usr/local/mysql/etc/my.cnf - 找到配置里的
bind-address项,把默认值127.0.0.1改成0.0.0.0,保存后重启MySQL服务 - 给测试账号开放远程访问权限,登录本地MySQL命令行执行以下SQL,把占位符换成你自己的账号密码:
-- 测试环境用%允许所有IP访问没问题,生产环境禁止这么配置 CREATE USER 'test_user'@'%' IDENTIFIED BY 'your_test_pwd'; GRANT ALL PRIVILEGES ON *.* TO 'test_user'@'%'; FLUSH PRIVILEGES;
- 临时关闭本地电脑防火墙,或者在防火墙入站规则里放开3306端口的TCP访问权限,避免被拦截。
2. 选对模拟器访问宿主机的IP地址
模拟器自身的127.0.0.1指向的是模拟器本身,不是你跑MySQL的电脑,不同模拟器对应地址不一样:
- Android Studio官方模拟器:固定用
10.0.2.2,这是官方做的宿主机映射地址,不需要额外配置 - 第三方安卓模拟器(雷电、夜神、MuMu等):优先试
172.16.0.1,如果不通就查你电脑当前在局域网的实际IPv4地址(Windows执行ipconfig、macOS/Linux执行ip a查看对应网卡的IPv4,一般是192.168.x.x段) - iOS模拟器:直接用
127.0.0.1即可,iOS模拟器和宿主机共用网络栈,不需要特殊地址
3. Flutter端mysql1连接代码示例
直接替换对应参数即可使用:
import 'package:mysql1/mysql1.dart'; Future<MySqlConnection> initDb() async { final connSettings = ConnectionSettings( host: '10.0.2.2', // 替换成上一步查到的对应IP port: 3306, user: 'test_user', // 替换成你自己的数据库账号 password: 'your_test_pwd', // 替换成对应密码 db: 'your_target_db', // 替换成要访问的数据库名 timeout: const Duration(seconds: 10) ); return await MySqlConnection.connect(connSettings); }
调用时执行final dbConn = await initDb();拿到连接实例,就可以正常执行SQL拉取数据。
常见问题排查
- 连接超时先测网络通断:打开模拟器自带浏览器,访问
http://你配置的IP:3306,如果页面有响应(哪怕是乱码)说明网络层通,问题出在账号权限或连接参数;如果完全无响应,回头查防火墙、MySQL监听配置 - MySQL8.0+版本如果报认证插件错误,执行以下SQL调整用户认证方式即可:
ALTER USER 'test_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_test_pwd'; FLUSH PRIVILEGES;
- 重要提醒:直连MySQL的方式仅适用于本地调试,正式上线的应用必须通过后端服务接口中转访问数据库,禁止把数据库账号直接写在客户端代码里,否则会有严重的数据泄露风险。
内容的提问来源于stack exchange,提问作者Emir
相关产品推荐
相关产品推荐

