【问题标题】:call a function from DialogFragment to Fragment without using LiveData在不使用 LiveData 的情况下从 DialogFragment 调用函数到 Fragment
【发布时间】:2021-04-18 02:23:01
【问题描述】:

我正在尝试在 LoginFragment 和重置密码对话框片段 DialogFragment 之间进行通信。

DialogFragment 中,当某个任务成功时,对话框关闭,我想告诉LoginFragment 制作一个小吃店。

我现在的做法是在LoginFragmentDialogFragmentMutableLiveData 之间使用共享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))

但是,这会带来一些错误:

每次我导航到另一个片段然后导航回LoginFragmentloginDetailsBundleLiveData 观察者调用makeSnackbar

我发现了一个丑陋的解决方法......但我希望有一个不使用 livedata 的解决方案

*注意:我使用导航组件来调用对话框

val action = fragmentDirections.actionLoginFragmentToDialogPasswordRecoveryFragment()
binding.btnForgotPassword.setOnClickListener {
    findNavController().navigate(action)
}

我想知道是否有更好的方法来做到这一点?也许使用接口?

提前致谢!

【问题讨论】:

  • 已更新......在对话框内创建接口,然后在活动中实现它或将其创建为变量,然后创建一个公共方法“showSnackbar”并在接口被触发时调用它

标签: android kotlin android-dialogfragment


【解决方案1】:

使用此扩展功能,希望对您有所帮助

fun Fragment.setNavigationResult(result: Any?, key: String = 
"result") =findNavController().previousBackStackEntry?.savedStateHandle?.set(key, result)


fun <T> Fragment.getNavigationResult(key: String = "result") =findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<T?>(key)

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 2016-10-30
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多