【问题标题】:Cloud Firestore addOnSuccessListener crashes with NPE [duplicate]Cloud Firestore addOnSuccessListener 与 NPE 崩溃 [重复]
【发布时间】:2022-01-03 16:17:07
【问题描述】:

每次更新某些文档字段后应用程序崩溃。这些字段按预期更新,但在回调addOnSuccessListener 中出现崩溃。当我删除 OnSuccessListener 时,它工作正常。有什么建议吗?

更新:我发现我所有的 Firestore 调用都会导致应用程序在 addOnSuccessListener 中崩溃,因此原因更加全球化。同样使用 addOnCompleteListener 而不是 addOnSuccessListener 可以按预期工作。

更新2:Issue discussion and solution

fun setAppointmentStatus(docId: String, status: String, callback: (succeed: Boolean) -> Unit) {    
        db.collection(path)
                .document(docId)
                .update("status", status, "updatedAt", FieldValue.serverTimestamp())
                .addOnSuccessListener {
                    callback(true)
                }
}

堆栈跟踪:

2022-01-03 18:25:50.654 9378-9378/com.project.provider E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.project.provider, PID: 9378
    java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter it
        at com.biosensics.nula.cloud.AppointmentCloudHelper$setAppointmentStatus$1.onSuccess(Unknown Source:2)
        at com.biosensics.nula.cloud.AppointmentCloudHelper$setAppointmentStatus$1.onSuccess(Unknown Source:2)
        at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.0:1)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

【问题讨论】:

  • 您在哪一行代码中获得了 NPE?
  • @AlexMamo 我猜这是 Firestore SDK 内部崩溃,所以记录器不显示行号
  • 您可以编辑您的问题以显示整个堆栈跟踪吗?
  • 堆栈跟踪显示错误来自您自己的代码。你确定callback 不是null
  • 来自错误消息:“指定为非空的参数为空:方法kotlin.jvm.internal.Intrinsics.checkNotNullParameter,参数它”这里似乎需要it,而你'没有指定它(原文如此)。我还不足以成为 Kotlin 专家,无法确切了解如何在您的代码中解决此问题,但是从 setAppointmentStatus$1.onSuccess(Unknown Source:2) 来看,错误的来源没有太多空间。

标签: android google-cloud-firestore


【解决方案1】:

要实现您想要做的事情,似乎是add a timestamp 到您的文档,您可以执行以下操作:

// If you're using custom Kotlin objects in Android, add an @ServerTimestamp
// annotation to a Date field for your custom object classes. This indicates
// that the Date field has to be treated as a server timestamp by the object mapper.
val docRef = db.collection("objects").document("some-id") 

// Update the timestamp field with the value from the server
val updates = hashMapOf<String, Any>(
        "timestamp" to FieldValue.serverTimestamp()
)

docRef.update(updates).addOnCompleteListener { }

您只需替换您自己的应用所需的变量。将“objects”更改为path,将“some-id”更改为docId


Get File Metadata你可以试试这个:

// Create a storage reference from our app
val storageRef = storage.reference

// Get reference to the file
val forestRef = storageRef.child("images/forest.jpg")

forestRef.metadata.addOnSuccessListener { metadata ->
    // Metadata now contains the metadata for 'images/forest.jpg'
}.addOnFailureListener {
    // Uh-oh, an error occurred!
}

如果您想了解有关tasks 的更多信息,我建议您阅读此blog entrykotlin 示例,其中建议添加OnFailureListener 以获得特定异常,因为NPE 可以有多种原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2019-11-07
    • 2020-01-29
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多