问题描述
@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
。我想将 SearchFragment
的 viewmodel 传递给 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
。