我收到 java.lang.NullPointerException 我认为不应该是这样。有人可以帮我吗?

问题描述 投票:0回答:1

我有一个接口,它从实现它的活动传递到视图模型。然后在viewmodel中,调用实现的接口方法。在这个方法中,我想做的就是显示一个 Toast,但在尝试访问活动上下文时遇到空错误。我不懂为什么。 需要明确的是,在所有其他重写的方法(例如 onCreate、onStop、OnResume 等)中。如果我显示 toast,它就可以正常工作。仅当在此接口方法内时,活动上下文似乎为空。我完全不知道。

这是刀柄模块

@Module
@InstallIn(SingletonComponent::class)
abstract class ToastListenerModule {
    @Binds
    abstract fun bindToastMessageListener(activity: SplashActivity): ToastMessageListener
}

我的 SplashActivity.kt

@AndroidEntryPoint
class SplashActivity @Inject constructor() : AppCompatActivity(), ToastMessageListener {
    private lateinit var binding: ActivitySplashBinding

    @Inject
    lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        installSplashScreen()
        binding = ActivitySplashBinding.inflate(layoutInflater)

        setContentView(binding.root)
    }

    override fun showToast(message: String) {
        //THIS IS WHERE THE PROBLEM IS WITH THE CONTEXT
        Toast.makeText(this, "MESSAGE", Toast.LENGTH_SHORT)
    }
}

下面是我的 ViewModel:

@HiltViewModel
class AuthenticationViewModel @Inject constructor(
    private val auth: FirebaseAuth,
    private val toastListner: ToastMessageListener,
) : ViewModel() {
    val emailText = ObservableField<String>("")
    val passwordText = ObservableField<String>("")
    val nameText = ObservableField<String>("")

    fun onSubmitClicked(isLogin: Boolean) {
        if (isLogin) {
            val email = emailText.get()
            val password = passwordText.get()

            if (email.isNullOrEmpty() || password.isNullOrEmpty()) {
                println("Email or password is empty")
                return
            }
            auth.signInWithEmailAndPassword(emailText.get() ?: "", passwordText.get() ?: "")
                .addOnCompleteListener() { task ->
                    if (task.isSuccessful) {
                        toastListner.showToast("Login Successful")
                    } else {
                        val exception = task.exception
                        //THIS IS WHERE I CALL showToast
                        //AND YES IT IS GETTING CALLED AND EVERYTHING
                        toastListner.showToast("Login Failed: ${exception?.message}")
                    }
                }
        } else {
            println("SIGN Up BUTTON CLICKED ${emailText.get()} ${passwordText.get()}")
        }
    }

    fun isValidInput(): Boolean {
        val inputEm = emailText.get() ?: return false
        val inputPass = passwordText.get() ?: return false

        return inputEm.isNotEmpty() && inputPass.isNotEmpty()
    }
}
android kotlin nullpointerexception viewmodel dagger-hilt
1个回答
0
投票

首先你说你在上下文中遇到了问题。因此,您可以通过在 viewModel 类中注入应用程序上下文,然后将上下文作为参数传递给函数来解决它。

这里有一个例子供参考。但还是要知道nullPointerException的具体原因。我认为你应该分享错误日志。

@HiltViewModel
class AuthenticationViewModel @Inject constructor(
    private val auth: FirebaseAuth,
    private val toastListner: ToastMessageListener,
    @ApplicationContext private val context: Context
) : ViewModel() {

然后在您的活动中,您可以添加上下文作为参数。

 override fun showToast(context : Context, message: String) {
        Toast.makeText(context, "MESSAGE", Toast.LENGTH_SHORT)
    }

您可以以同样的方式在 viewModel 类中传递该上下文

 toastListner.showToast(context,"Login Failed: ${exception?.message}")
© www.soinside.com 2019 - 2024. All rights reserved.