У меня есть интерфейс, который передается в модель представления из действия, в котором он реализован. Затем в модели представления он вызывает реализованный метод интерфейса. Внутри этого метода все, что я хочу сделать, это отобразить Toast, но я получаю нулевую ошибку при попытке доступа к контексту активности. Я не понимаю, почему.
Для ясности: внутри всех других переопределенных методов, таких как onCreate, onStop, OnResume и т. д. Если я показываю всплывающее уведомление, оно работает нормально. Только когда внутри этого метода интерфейса контекст активности кажется нулевым. Понятия не имею.
Это модуль рукояти
@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("")
val passwordText = ObservableField("")
val nameText = ObservableField("")
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()
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... e-the-case