【问题标题】:Kotlin function returns null [duplicate]Kotlin 函数返回 null [重复]
【发布时间】:2022-01-03 16:52:13
【问题描述】:

此函数始终返回 null。 t 没有被分配令牌值。有人可以帮忙吗?

fun getToken(): String? {
    var t: String? = ""
    FirebaseMessaging.getInstance().token.addOnSuccessListener { token: String? ->
        Log.i(TAG,"Token: ${token.toString()}")
        t = token
    }.addOnFailureListener { e: Exception? ->
        Log.e(TAG,"Couldn't get token", e)
    }
    return t
  }

【问题讨论】:

  • 此函数返回 null 的唯一方法是在实际分配令牌值时。它恰好是null,原因我不知道。 Firebase 的文档中关于 null 作为令牌值的说法是什么?

标签: kotlin


【解决方案1】:

getToken 正在返回 null,因为此函数在调用成功侦听器之前完成。 getToken 不等待请求完成。它唯一要做的就是设置成功和失败监听器,当请求返回响应时将调用它们。

有几种方法可以解决这个问题:

  • getToken 标记为suspend 并使用FirebaseMessaging.getInstance().token.await() 等待收到响应。
  • 您可以将回调传递给getToken,而不是返回令牌,该回调将在响应到来时被调用。
    fun getToken(onTokenReceive: (String?) -> Unit) {
        FirebaseMessaging.getInstance().token.addOnSuccessListener { token: String? ->
            Log.i(TAG,"Token: ${token.toString()}")
            onTokenReceive(token)
        }.addOnFailureListener { e: Exception? ->
            Log.e(TAG,"Couldn't get token", e)
            onTokenReceive(null)
        }
    }
    
    因此,如果您之前像这样调用函数:
    val token = getToken()
    // using the `token` here
    
    现在您可以将其更改为:
    getToken { token ->
        // use the `token` here
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-10
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多