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

Flutter发布版中MongoDB Atlas的create()函数报错求助

问题描述
  • Flutter项目使用MongoDB Atlas访问数据库,Debug构建运行正常,Release构建调用Db.create()实例化数据库对象时出错
  • 已在AndroidManifest.xml中添加INTERNET权限,问题仍存在
  • Release构建错误日志:
E/flutter (14697): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Failed host lookup: ‘dns.google.com’
E/flutter (14697): #0 IOClient.send (package:http/src/io_client.dart:94)
E/flutter (14697):
E/flutter (14697): #1 BaseClient._sendUnstreamed (package:http/src/base_client.dart:93)
E/flutter (14697):
E/flutter (14697): #2 HttpUtils._get (package:basic_utils/src/HttpUtils.dart:24)
E/flutter (14697):
E/flutter (14697): #3 HttpUtils.getForJson (package:basic_utils/src/HttpUtils.dart:49)
E/flutter (14697):
E/flutter (14697): #4 DnsUtils.lookupRecord (package:basic_utils/src/DnsUtils.dart:33)
E/flutter (14697):
E/flutter (14697): #5 decodeDnsSeedlist (package:mongo_dart/src/database/utils/dns_lookup.dart:19)
E/flutter (14697):
E/flutter (14697): #6 Db.create (package:mongo_dart/src/database/db.dart:271)
E/flutter (14697):
E/flutter (14697): #7 MongoDb.connect (package:student_portal/services/mongo_db.dart:21)
E/flutter (14697):
E/flutter (14697): #8 main (package:student_portal/main.dart:13)
  • 相关代码:
    • mongo_db.dart第21行:
      _db = await Db.create(mongoURL);
      
    • main.dart中调用的connect方法:
      Future connect() async {
      _db = await Db.create(mongoURL);
      await _db!.open(secure: true);
      }
      
解决方案

1. 确认权限与混淆规则

  • 检查AndroidManifest.xml中权限声明位置,确保在<manifest>标签下:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • 若开启代码混淆,在proguard-rules.pro中添加豁免规则,避免网络相关库被破坏:
    -keep class com.github.epalm.basic_utils.** { *; }
    -keep class com.github.epalm.mongo_dart.** { *; }
    

2. 跳过DNS SRV解析

错误核心是DNS lookup失败,直接使用非SRV格式的MongoDB连接字符串:

  • 登录MongoDB Atlas控制台,进入集群的「Connect」→「Connect your application」,关闭「Use SRV record」选项,获取包含直接IP的连接字符串
  • 将mongoURL替换为该格式,示例:
    const mongoURL = "mongodb://<用户名>:<密码>@cluster0-shard-00-00.example.mongodb.net:27017,cluster0-shard-00-01.example.mongodb.net:27017,cluster0-shard-00-02.example.mongodb.net:27017/?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true&w=majority";
    

3. 临时禁用代码压缩排查

若上述方法无效,可先禁用Release构建的代码压缩,确认是否为压缩导致的问题:
在android/app/build.gradle中修改release构建配置:

buildTypes {
    release {
        minifyEnabled false
        shrinkResources false
        signingConfig signingConfigs.release
    }
}

问题解决后,再逐步调整混淆规则,而非长期禁用压缩。

4. 验证设备网络环境

确保测试Release包的设备能正常访问公共DNS服务器(如dns.google.com),部分内网环境会屏蔽公共DNS,可切换移动数据或其他网络测试。

内容的提问来源于stack exchange,提问作者Divyanshu Naugai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:22:53