我有一个接口,它从实现它的活动传递到视图模型。然后在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()
}
}
首先你说你在上下文中遇到了问题。因此,您可以通过在 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}")