Flutter安卓模拟器无法连接Firebase问题求助
解决Android Studio更新后Flutter Firebase安卓端连接失败问题
嘿,我帮你梳理下这个问题的排查方向——从你描述的情况来看,iOS端正常但安卓端出现no auth token和网络不可用的错误,还伴随插件找不到的警告,大概率是Android Studio更新后Gradle配置、Firebase初始化或者模拟器网络的问题,一步步来:
1. 先解决Plugin project :firebase_core_web not found警告
这个警告是Gradle配置同步出了问题,更新AS后经常会遇到:
- 最简单的方法是用Firebase CLI重新配置项目:在终端运行
flutterfire configure,选择你的Firebase项目,它会自动帮你修复所有Gradle相关的配置文件,包括settings.gradle。 - 如果手动修复的话,打开
android/settings.gradle,确保开头的pluginManagement和plugins配置符合最新Flutter Firebase项目模板规范,并且include ":app"没有遗漏。
2. 排查Firebase认证令牌缺失问题(no auth token for request)
这个是核心错误,说明安卓端没有正确获取到Firebase的认证凭据:
- 检查google-services.json配置:确保这个文件放在
android/app目录下,里面的package_name和你安卓项目的applicationId完全一致(在android/app/build.gradle的defaultConfig里查看),同时project_id、api_key等信息要和Firebase控制台里的项目匹配。 - 确保Firebase Core初始化正确:在main函数里一定要先初始化Firebase,代码示例如下:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 多环境配置记得传入对应options await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); runApp(const MyApp()); } - 测试匿名登录:如果你的Storage规则需要认证,先尝试匿名登录再上传文件,验证是否解决令牌问题:
// 上传操作前添加这段代码 await FirebaseAuth.instance.signInAnonymously();
3. 解决模拟器网络不可用问题
错误里的network unavailable说明模拟器可能连不上网:
- 重启模拟器,进入模拟器设置(右上角三个点→Settings→Proxy),把代理设置为
None,再重启模拟器。 - 检查电脑防火墙是否阻止了模拟器的网络请求,暂时关闭防火墙测试一下。
- 换一个安卓版本的模拟器试试,比如API 33的模拟器,旧版本模拟器的网络适配偶尔会有问题。
4. 更新Firebase插件和Gradle版本
Android Studio更新后,旧版本的Firebase插件可能和新的Gradle版本不兼容:
- 在
pubspec.yaml里把所有firebase相关的依赖更新到最新版本,比如:
然后运行firebase_core: ^2.15.0 firebase_storage: ^11.2.0flutter pub get,再执行flutter clean清理缓存,重新构建项目。 - 检查
android/build.gradle里的classpath版本,确保和Gradle wrapper版本匹配,示例如下:
对应的dependencies { classpath 'com.android.tools.build:gradle:7.4.2' classpath 'com.google.gms:google-services:4.4.0' }gradle/wrapper/gradle-wrapper.properties里的distributionUrl要改成:distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
5. 临时测试Storage规则
如果以上步骤都没解决,可以暂时修改Firebase Storage的规则,允许未认证访问(仅测试用,生产环境一定要改回来):
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth == null; } } }
如果这样能正常上传,说明问题出在认证流程上,再回头排查初始化和登录的代码。
按照这个顺序排查,应该能找到问题所在~
内容的提问来源于stack exchange,提问作者森口万太郎




