

そこで入力されたUserIDのdocumentが存在すればエラーを返すというコードを書きました。  
しかし、  
➀のコードだとdbErrorの変数が更新されずにnullのまま返されてしまいます  
➁のコードだとreturn文でエラーが出てしまいます

どこを改善すればエラーを返すことができるのでしょうか？

* * *

①のコード

[code]

    private fun dbCheck(userid:String):String?{
        var dbError:String? = null
        val db = FirebaseFirestore.getInstance()
        val docRef = db.collection("Users").document(userid)
            docRef.get().addOnSuccessListener { document->
                dbError = if(document.exists()){
                    "既に利用されているIDです"
                }else {
                    null
                }
            }
         return dbError
    }
    
[/code]

②のコード

[code]

    private fun dbCheck(userid:String){
        var dbError:String? = null
        val db = FirebaseFirestore.getInstance()
        val docRef = db.collection("Users").document(userid)
            docRef.get().addOnSuccessListener { document->
                dbError = if(document.exists()){
                    "既に利用されているIDです"
                }else {
                    null
                }
                return@addOnSuccessListener dbError //ここがエラーになる
            }
    }
    
[/code]


CC BY-SA 4.0
2020-08-16T13:07:42.167
69608
2022-12-30T10:07:45.903
2020-08-16T16:38:09.713
3060
41255
question
android firebase kotlin
Kotlinのreturn文について


`docRef.get().addOnSuccessListener`でaddしているリスナー `{ document ->
...`は非同期で実行されます。  
ですので①のコードだと、docRef.get().addOnSuccessListenerを実行した後すぐに`return
dbError`が実行されることになるのでnullが返ることになります。

対応策としては、

  1. doCheckメソッドがdocumentが正常に取得できた場合、エラーの場合のそれぞれのコールバック関数を引数として受け取るか
  2. あるいはcoroutineで非同期処理に対応した実装にする

などがあると思います。

1の場合のサンプルです。

[code]

    private fun dbCheck(userid:String, onSuccess:()->Unit, onError:() -> Unit) {
        ...
        ...
        if(document.exists()){
            onError()
        }else {
            onSuccess()
        }
        ....
    
[/code]

（この実装だとメソッド名と実行している内容が噛み合ってないですが・・）

2の非同期処理は少々長くなるので、次の記事等が参考になるかと思います。  
<https://qiita.com/amay077/items/54deb0de587baae47732>


CC BY-SA 4.0
2020-08-18T01:17:02.183
69642
2020-08-18T01:17:02.183
9608
69608
answer