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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:37:46