【发布时间】:2021-04-18 02:23:01
【问题描述】:
我正在尝试在 LoginFragment 和重置密码对话框片段 DialogFragment 之间进行通信。
在DialogFragment 中,当某个任务成功时,对话框关闭,我想告诉LoginFragment 制作一个小吃店。
我现在的做法是在LoginFragment 和DialogFragment 和MutableLiveData 之间使用共享ViewModel。
SharedViewModel:
class LoginViewModel(private val state: SavedStateHandle) : ViewModel() {
// used to notify the user when dialog fragment closes with onSuccessListener
// that the email has been sent using a snackbar
val snackbarMessageLiveData = MutableLiveData<String>()
val loginDetailsBundleLiveData = state.getLiveData<Bundle>("login_bundle")
}
DialogFragment:
task?.let {
// email sent successfully
it.addOnSuccessListener {
// update user that an email has been sent
viewModel.snackbarMessageLiveData.postValue(getString(R.string.password_recovery_email_sent))
// closes the fragment
dialog?.dismiss()
}
登录片段:
viewModel.snackbarMessageLiveData.observe(viewLifecycleOwner, {
makeSnackbar(it)
})
这是我用来更新 livedata 的行:
viewModel.snackbarMessageLiveData.postValue(getString(R.string.password_recovery_email_sent))
但是,这会带来一些错误:
每次我导航到另一个片段然后导航回LoginFragment,loginDetailsBundleLiveData 观察者调用makeSnackbar。
我发现了一个丑陋的解决方法......但我希望有一个不使用 livedata 的解决方案
*注意:我使用导航组件来调用对话框
val action = fragmentDirections.actionLoginFragmentToDialogPasswordRecoveryFragment()
binding.btnForgotPassword.setOnClickListener {
findNavController().navigate(action)
}
我想知道是否有更好的方法来做到这一点?也许使用接口?
提前致谢!
【问题讨论】:
-
已更新......在对话框内创建接口,然后在活动中实现它或将其创建为变量,然后创建一个公共方法“showSnackbar”并在接口被触发时调用它
标签: android kotlin android-dialogfragment