Flutter应用连接Azure MySQL服务器超时问题求助
Flutter连接Azure MySQL服务器的解决方案
1. 重构DbHelper为可复用服务类
将原来的入口代码改为可调用的连接与查询封装类,避免直接使用main方法:
// DbHelper.dart import 'package:mysql1/mysql1.dart'; class DbHelper { // 私有方法:获取数据库连接 static Future<MySqlConnection> _getConnection() async { final connSettings = ConnectionSettings( host: 'hostname.mysql.database.azure.com', port: 3306, user: 'user', password: 'password', db: 'db', // Azure MySQL强制要求SSL连接,必须配置 sslSettings: const SslSettings(enabled: true), timeout: const Duration(seconds: 30), ); return await MySqlConnection.connect(connSettings); } // 封装用户信息查询方法 static Future<List<Map<String, dynamic>>> fetchUserInfo() async { late MySqlConnection conn; try { conn = await _getConnection(); final results = await conn.query('SELECT * FROM your_user_table'); // 将查询结果转为Map列表,方便后续UI处理 return results.map((row) => row.fields).toList(); } catch (e) { rethrow; } finally { // 确保连接最终关闭,避免资源泄漏 await conn.close(); } } }
2. 在main.dart中调用封装方法
直接调用DbHelper的查询方法,并处理异常:
// main.dart Future<void> fetchUserInfo() async { try { final userList = await DbHelper.fetchUserInfo(); // 处理查询到的用户数据,比如更新UI print('查询到用户数据:$userList'); } catch (e) { print('连接/查询失败:$e'); // 可添加错误提示逻辑,如弹窗告知用户 } }
3. 配置Azure MySQL服务器权限
单独运行DbHelper能连接但移动端超时,核心原因是移动端IP不在Azure防火墙允许列表:
- 登录Azure门户,进入你的MySQL服务器
- 打开「连接安全性」页面
- 将「允许访问Azure服务」设置为「是」
- 添加防火墙规则:起始IP填
0.0.0.0,结束IP填255.255.255.255(开发阶段临时用,生产环境需限制为固定IP段) - 确认「强制SSL连接」为「启用」(默认开启,对应代码中的SSL配置)
4. 配置移动端网络权限
Android
在android/app/src/main/AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
iOS
在ios/Runner/Info.plist中添加ATS例外配置(允许连接Azure MySQL的非HTTPS端口):
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>mysql.database.azure.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> </dict> </dict> </dict>
5. 依赖版本检查
确保pubspec.yaml中mysql1依赖为最新稳定版:
dependencies: flutter: sdk: flutter mysql1: ^0.20.0
内容的提问来源于stack exchange,提问作者Samet Artan
相关产品推荐
相关产品推荐

