Unity中使用FirebaseFirestore触发InvalidOperationException:实例使用后无法修改设置
Unity中使用FirebaseFirestore触发InvalidOperationException:实例使用后无法修改设置
我之前也碰到过这个问题,其实这是Firebase Firestore的一个核心限制:一旦Firestore实例的非静态方法被调用,或者实例已经完成初始化/被处置,就再也不能修改它的设置了。
你当前的代码里直接调用FirebaseFirestore.DefaultInstance,这个静态属性在首次访问时,Firebase内部可能已经悄悄完成了实例的初始化(甚至可能项目里其他脚本在更早的生命周期比如Awake里就访问过它),等你再去修改firestore.Settings.PersistenceEnabled时,实例已经处于不可修改设置的状态,自然就抛出了这个异常。
解决方法:提前配置设置再创建实例
不要直接使用DefaultInstance,而是先创建并配置好FirebaseFirestoreSettings,再通过FirebaseFirestore.GetInstance()方法传入设置来获取实例,这样就能确保设置在实例初始化时就生效,不会触发异常。
修改后的代码如下:
private async void Start() { var dependencyResult = await FirebaseApp.CheckAndFixDependenciesAsync(); if(dependencyResult == DependencyStatus.Available) { _app = FirebaseApp.DefaultInstance; // 先创建并配置Firestore设置 var firestoreSettings = new FirebaseFirestoreSettings(); firestoreSettings.PersistenceEnabled = false; // 使用配置好的设置获取Firestore实例 FirebaseFirestore firestore = FirebaseFirestore.GetInstance(_app, firestoreSettings); OnFirebaseInitialized.Invoke(); } else { Debug.LogError("Failed to initialize Firebase with reason: " + dependencyResult); } }
额外注意事项
- 检查项目中所有脚本,确保没有其他地方在
Awake或者更早的时机访问FirebaseFirestore.DefaultInstance,也不要在初始化前调用任何Firestore的非静态方法(比如查询、写入文档),这些操作都会提前激活实例,导致设置无法修改。 - 如果你确实需要使用
DefaultInstance,那必须在第一次访问它之前就完成设置修改,但这种方式风险很高,因为很容易被项目中其他代码无意中提前触发实例初始化,所以更推荐上面的自定义实例方式。
备注:内容来源于stack exchange,提问作者Waxx
相关产品推荐
相关产品推荐

