将通过调用 Fragment 使用的 ViewModel 共享到 ViewModel 使用的 DialogFragment

问题描述

我有一个带有以下代码SearchFragment

@AndroidEntryPoint
class SearchFragment :
    Fragment(),View.OnClickListener {
    ...
    private var _binding: FragSearchBinding? = null
    private val binding get() = _binding as FragSearchBinding
    private val viewmodel by viewmodels<Searchviewmodel>()

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    )
        : View {
        _binding = FragSearchBinding.inflate(inflater,container,false)
        binding.fragSearchSearchResultFilter.setonClickListener(this)
        return binding.root
    }

    ...

    private fun showFilterDialog() {
        val dialog = FilterBottomSheetDialogFragment.newInstance()
        dialog.show(parentFragmentManager,"filter_bsd_tag")
    }
    ...
}

我正在使用该 FilterBottomSheetDialogFragment 显示一个 SearchFragment。我想将 SearchFragmentviewmodel 传递给 DialogFragment。我的 FilterBottomSheetDialogFragment 有这个代码

@AndroidEntryPoint
class FilterBottomSheetDialogFragment :
    BottomSheetDialogFragment(),View.OnClickListener {
    companion object {
        fun newInstance() = FilterBottomSheetDialogFragment()
        private const val TAG_SELECTION_DIALOG = "tag_selection_dialog"
    }

    private var _binding: BsdFilterBinding? = null
    private val binding get() = _binding as BsdFilterBinding
    private val viewmodel: Searchviewmodel = ???
}

我试过了

private val viewmodel by viewmodels<Searchviewmodel>(ownerProducer = { this.requireParentFragment() })

上面的方法不起作用,因为它只是创建了一个新的 viewmodel 实例。

我也试过

private val viewmodel: Searchviewmodel by lazy {
    viewmodelProvider(requireParentFragment()).get(Searchviewmodel::class.java)
}

上述内容对无法创建 Searchviewmodel 实例的错误无效。我的 Searchviewmodel 有这个构造函数

@Hiltviewmodel
class Searchviewmodel @Inject constructor(
    private val courseRepository: CourseRepository
) : viewmodel()

如何在不使用构造函数参数的情况下将 Searchviewmodel 传递给 DialogFragment

解决方法

您在这里弄错了实际上是您在显示对话框时使用的片段管理器。目前您正在使用 片段管理器,而您的对话框应该作为显示它的片段的子片段存在。

所以你应该使用:

dialog.show(childFragmentManager,"filter_bsd_tag")

这将确保

viewModels<SearchViewModel>(ownerProducer = { requireParentFragment() })

指的是 SearchFragment

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...