3
votes

I have searched for an answer that would help my code extensively, but the solutions I have found did not work for me.

I get the following error:

    kotlin.TypeCastException: null cannot be cast to non-null 
    type kotlin.collections.Map<kotlin.String, kotlin.Any>

    FATAL EXCEPTION: main
    Process: com.meetHitch.HitchApp, PID: 4021
    kotlin.TypeCastException: null cannot be cast to non-null 
    type kotlin.collections.Map<kotlin.String, kotlin.Any>
      at ... helpers.RestAPIKt$getUserProfile$1 ...
      at com.google.android.gms.tasks.zzj.run(Unknown Source)
      at android.os.Handler.handleCallback(Handler.java:751)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:154)
      at android.app.ActivityThread.main ...
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$Method...
      at com.android.internal.os.ZygoteInit.main

My code is the following:

private val TAG: String
get() = "RestAPI"

private val fUser: FirebaseUser?
get() = FirebaseAuth.getInstance().currentUser

private val uid: String?
get() = fUser?.uid

private val baseDoc: DocumentReference
get() = FirebaseFirestore.getInstance().
        collection("users").document(uid!!)

private val leadsDoc: DocumentReference
get() {
    appUser.currentConference?.id?.let {
        return baseDoc.collection("leads").document(it)
    }
    return baseDoc.collection("leads").document(demoID)
}

private val conferencesCollection: CollectionReference
get() =  FirebaseFirestore.getInstance().
         collection("conferences")

fun getUserProfile(callback: (AppUser) -> Unit) {

  // Source can be CACHE, SERVER, or DEFAULT.
  val source = Source.DEFAULT

  baseDoc.get(source)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                val document = task.result
                if (document != null) {
                    printnLog(TAG, "Loaded profile for User 
                    with UID: $uid successfully!")

                    val user = AppUser(task.result.data as 
                               Map<String, Any>)
                    callback(user)
                } else {
                    println("No profile set. Saving initial 
                             profile...")
                    appUser = AppUser(fUser!!)
                    setUserProfile()
                }
            } else {
                Log.w(TAG, "getUser:onCancelled", 
                      task.exception)
            }
          }
        }

I have referred to kotlin.TypeCastException: null cannot be cast to non-null type com.midsizemango.databasekotlin.Note and none of the solutions have worked, although it could be that I am not implementing ? in the right place. I tried "as? Map" but I get a type mismatch error.

1

1 Answers

4
votes

With the line val user = AppUser(task.result.data as Map<String, Any>), make the Any variable nullable:

val user = AppUser(task.result.data as Map<String, Any?>)