Firebase Firestore:实例初始化后,无法调用useEmulator()



在将Firebase Emulator Suite部署到生产环境之前,我正在使用它们测试Firebase Cloud功能。

探索这种方法,从我的Andriod设备触发可调用的firebase云函数。

我的应用程序在运行时崩溃。

错误:

java.lang.IollegalStateException:实例初始化后无法调用useEmulator((。

错误源-FirebaseFirestore.java:

/**
* Modifies this FirebaseDatabase instance to communicate with the Cloud Firestore emulator.
*
* <p>Note: Call this method before using the instance to do any database operations.
*
* @param host the emulator host (for example, 10.0.2.2)
* @param port the emulator port (for example, 8080)
*/
public void useEmulator(@NonNull String host, int port) {
if (this.client != null) {
throw new IllegalStateException(
"Cannot call useEmulator() after instance has already been initialized.");
}
this.emulatorSettings = new EmulatedServiceSettings(host, port);
this.settings = mergeEmulatorSettings(this.settings, this.emulatorSettings);
}

Firestore使用以下方法注入:(在我的项目中使用Hilt(

@Provides
fun provideFirebaseFirestore(): FirebaseFirestore {
val firebaseFirestoreSettings = FirebaseFirestoreSettings.Builder()
firebaseFirestoreSettings.isPersistenceEnabled = false
val firestore = FirebaseFirestore.getInstance()
firestore.useEmulator("192.168.1.102", 8080)
firestore.firestoreSettings = firebaseFirestoreSettings.build()
return firestore
}

我怀疑FirebaseFirestore.java中的useEmulator()不是一个静态方法
在创建Firebase Firestore实例之前,如何调用它?

我有同样的问题,我解决它的方法将firestore.useEmulator("192.168.1.102", 8080)封装在像这样的try-catch块中

try {
firestore.useEmulator("192.168.1.102", 8080)
} catch (e: IllegalStateException) {
}

这可能是因为Firebase状态在测试之间保持不变。然后对同一个firebase应用程序实例调用useEmulator两次,从而引发错误。至少,我在考试中就是这样。

检查嵌套";主机";这个答案中描述的firestore实例中的属性对我有效

将@Singleton添加到函数provideFirebaseFirestore()中为我解决了这个问题,因为它确保了类只实例化一次。

我对com.google.firebase:firebase-bom:32.0.0也有同样的问题

正如useEmulator()方法的文档所说:

注意:在使用实例执行任何数据库操作之前,请调用此方法。

在依赖项注入过程中第一次使用之前,我就调用了这些方法,这就是问题的原因。

无论如何通过将对MainActivityonCreate方法的调用提升为来解决

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (USE_EMULATOR) {
Firebase.auth.useEmulator(HOST, AUTH_PORT)
Firebase.firestore.useEmulator(HOST, FIRESTORE_PORT)
}
setContent { MainContent() }
}
}

最新更新