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

