首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NullPointerException从Kotlin活动启动Firebase身份验证UI活动

NullPointerException从Kotlin活动启动Firebase身份验证UI活动
EN

Stack Overflow用户
提问于 2019-07-10 02:55:38
回答 1查看 408关注 0票数 0

我有一个带有androidx导航功能的java android应用程序(supportbar +导航抽屉),它会启动Firebase UI让用户登录。然后,我决定使用AS转换器将活动代码迁移到Kotlin,并对导航设置进行一些手动操作。

尽管我努力了,但它仍然与这个堆栈分离

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gabrielcalero.familytree, PID: 20260
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gabrielcalero.familytree/com.firebase.ui.auth.KickoffActivity}: java.lang.NullPointerException: Attempt to invoke super method 'void androidx.fragment.app.FragmentActivity.onPanelClosed(int, android.view.Menu)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2793)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:156)
    at android.app.ActivityThread.main(ActivityThread.java:6524)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)
 Caused by: java.lang.NullPointerException: Attempt to invoke super method 'void androidx.fragment.app.FragmentActivity.onPanelClosed(int, android.view.Menu)' on a null object reference
    at androidx.appcompat.app.AppCompatActivity.onPanelClosed(AppCompatActivity.java:505)
    at androidx.lifecycle.LiveData.observe(LiveData.java:172)
    at com.firebase.ui.auth.KickoffActivity.onCreate(KickoffActivity.java:35)
    at android.app.Activity.performCreate(Activity.java:6910)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6524) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831) 

奇怪的是,堆栈后面的异常是onPanelClosed,这意味着Super值为空。这怎麽可能?

@Override
public void onPanelClosed(int featureId, Menu menu) {
    super.onPanelClosed(featureId, menu);
}

更新:以下是活动代码

package com.gabrielcalero.familytree.ui
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupWithNavController
import com.firebase.ui.auth.AuthUI
import com.gabrielcalero.familytree.R
import com.gabrielcalero.familytree.ServiceLocator
import com.gabrielcalero.familytree.entity.Constants
import com.gabrielcalero.familytree.ui.picasso.CropCircleTransformation
import com.google.android.material.navigation.NavigationView
import com.google.firebase.auth.FirebaseAuth
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener, FirebaseAuth.AuthStateListener {

private var mUserPicture: ImageView? = null
private var mUserNameTextView: TextView? = null
private var mAuth: FirebaseAuth? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setupNavigation()

    mUserPicture = navView.getHeaderView(0).findViewById(R.id.picture)
    mUserNameTextView = navView.getHeaderView(0).findViewById(R.id.display_name)

    mAuth = FirebaseAuth.getInstance().apply { addAuthStateListener { this } }

    launchSignInUI()
}

override fun onStart() {
    super.onStart()
    updateLoggedInUser()
}

private fun updateLoggedInUser() {
    val currentUser = mAuth!!.currentUser
    if (currentUser == null) {
        mUserPicture!!.setImageResource(R.drawable.anonymous)
        mUserNameTextView!!.text = getString(R.string.not_logged_in)
        navView.menu.findItem(R.id.signout).isVisible = false
        navView.menu.findItem(R.id.signin).isVisible = true
        navView.menu.findItem(R.id.personFragment).isEnabled = false
        navView.menu.findItem(R.id.peopleListFragment).isEnabled = false
    } else {
        // show signout
        mUserNameTextView!!.text = currentUser.displayName
        Picasso.with(this)
                .load(currentUser.photoUrl)
                .placeholder(R.drawable.anonymous)
                .error(R.drawable.anonymous)
                .transform(CropCircleTransformation())
                .resize(resources.getDimension(R.dimen.profile_picture_width).toInt(),
                        resources.getDimension(R.dimen.profile_picture_height).toInt())
                .into(mUserPicture)
        navView.menu.findItem(R.id.signout).isVisible = true
        navView.menu.findItem(R.id.signin).isVisible = false
        navView.menu.findItem(R.id.personFragment).isEnabled = true
        navView.menu.findItem(R.id.peopleListFragment).isEnabled = true
    }
}

private fun setupNavigation() {
    setSupportActionBar(toolbar)

    supportActionBar!!.setDisplayShowHomeEnabled(true)
    supportActionBar!!.setDisplayHomeAsUpEnabled(true)

    val navController : NavController = findNavController(R.id.nav_host_fragment)
    val appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
    toolbar.setupWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
    navView.setNavigationItemSelectedListener(this)
}

private fun launchSignInUI() {
    // Choose authentication providers
    val providers = Arrays.asList(
            AuthUI.IdpConfig.EmailBuilder().build(),
            AuthUI.IdpConfig.GoogleBuilder().build())

    // Create and launch sign-in intent
    startActivityForResult(
            AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setAvailableProviders(providers)
                    .setLogo(R.drawable.logo)
                    .build(),
            Constants.REQUEST_CODE_SIGN_IN)
}


override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    //updateLoggedInUser()
}

override fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    when (menuItem.itemId) {
        R.id.signout -> signout()
        R.id.signin -> launchSignInUI()
        R.id.personFragment -> {
            navController.popBackStack(R.id.peopleListFragment, false)
            navController.navigate(R.id.personFragment)
            drawerLayout?.closeDrawers()
            return true
        }
        else -> {
            navController.popBackStack(R.id.peopleListFragment, false)
            drawerLayout?.closeDrawers()
            return true
        }
    }
    drawerLayout?.closeDrawers()
    return true
}

private fun signout() {
    val navController = findNavController(R.id.nav_host_fragment)

    AuthUI.getInstance()
            .signOut(this)
            .addOnCompleteListener {
                navView.menu.findItem(R.id.signout).isVisible = false
                navController.popBackStack(R.id.peopleListFragment, false)
            }

}

override fun onAuthStateChanged(firebaseAuth: FirebaseAuth) {
    ServiceLocator.getRepository(application).setCurrentUserId(firebaseAuth.uid)
    updateLoggedInUser()
}

}
EN

回答 1

Stack Overflow用户

发布于 2019-07-11 03:23:26

这个问题出现在Java到Kotlin的转换中。在本例中,我通过删除未使用的依赖项来修复它

implementation "androidx.core:core-ktx:+"

我猜当我完成所有java类的转换后,我将不得不用它们的-ktx对应项替换所有androidx依赖项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56959039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档