android Firebase Firestore:示例已初始化后无法调用useEmulator()

yws3nbqq  于 2023-04-18  发布在  Android
关注(0)|答案(3)|浏览(150)

我正在使用Firebase Emulator Suite来测试我的Firebase Cloud Functions,然后再将它们部署到生产环境中。
探索this方法来从我的Andriod设备触发可调用的firebase云函数。
我的应用程序在运行时崩溃。

错误:

java.lang.IllegalStateException:示例已初始化后无法调用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示例之前调用它?

r1zhe5dt

r1zhe5dt1#

我也遇到了同样的问题,我解决它的方法是将firestore.useEmulator("192.168.1.102", 8080) Package 在try catch块中,如下所示:

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

        }
3hvapo4f

3hvapo4f2#

这可能是因为Firebase状态在测试之间保持不变。然后针对同一个Firebase应用示例调用useEmulator两次,引发错误。至少,这是在测试期间发生在我身上的事情。
检查firestore示例中嵌套的“host”属性的方法(描述为in this answer)对我来说很有效。

pod7payv

pod7payv3#

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

相关问题