向Cloud Firestore写入员工数据时遇getToken异常求助
我之前遇到过完全一样的问题,结合你的配置和代码,给你几个可行的解决方案:
1. 升级Firebase相关依赖版本
你的依赖版本都比较老旧,版本不兼容是触发这个错误的常见原因:
更新pubspec.yaml中的Flutter包:
将cloud_firestore和firebase_auth升级到兼容的稳定版本,比如:cloud_firestore: ^3.4.0 firebase_auth: ^3.6.0(可以根据你的Flutter SDK版本调整,确保版本匹配,执行
flutter pub upgrade完成更新)更新Android端gradle配置:
android/build.gradle中的gradle插件和google-services版本太旧,建议升级:dependencies { classpath 'com.android.tools.build:gradle:7.0.4' classpath 'com.google.gms:google-services:4.3.15' }同时记得修改android/gradle/wrapper/gradle-wrapper.properties中的distributionUrl,匹配gradle插件版本,比如:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
2. 确保Auth状态稳定后再写入
这个错误很多时候是因为Firestore需要用户认证(如果你的数据库规则限制了登录才能写入),但写入时用户的认证token发生了变化(比如登录状态还没稳定就执行写入)。建议在确认用户已登录后再调用写入方法:
// 监听Auth状态,确保用户登录稳定 FirebaseAuth.instance.authStateChanges().listen((User? user) async { if (user != null) { // 用户已登录且状态稳定,执行写入 await addEmployee(yourEmployeeData); } else { print('请先完成登录后再尝试写入数据'); } });
3. 简化写入操作(如果不需要事务)
你的代码用了Transaction但只是简单的写入操作,其实可以直接用set方法,避免事务可能带来的token冲突问题:
static Future<void> addEmployee(Map<String, dynamic> snapshot) async { try { await FirebaseFirestore.instance.collection('employee').doc().set(snapshot); print('员工信息写入成功'); } catch (e) { print('写入失败: $e'); } }
(加上异常捕获可以更方便排查问题)
4. 检查Firestore数据库规则
如果你的数据库规则设置了需要认证才能写入,而用户未登录,也会触发相关的token错误。可以先临时修改规则测试:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; // 临时开放权限测试 } } }
如果测试后不再报错,说明是权限规则的问题,记得测试完改回安全的规则(比如allow write: if request.auth != null;)
内容的提问来源于stack exchange,提问作者netlemon

