目的是宣告一個基類
abstract class BaseDialog<T : ViewBinding> : AppCompatDialogFragment() {
lateinit var binding: T
}
并且所有子類都應該擴展這個父類
class ChildClass: BaseDialog<ChildClassViewBinding>() {
}
然后我想膨脹父類中的系結并將其保存到系結屬性這似乎超出了我對 kotlin 的知識范圍
這真的可以做到嗎?
uj5u.com熱心網友回復:
如果我要這樣做,我會這樣做:
class BaseDialogFragment<T: ViewBinding>(private val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> T)
: AppCompatDialogFragment() {
var _binding: T? = null
val binding: T get() = _binding ?: error("Must only access binding while fragment is attached.")
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = bindingInflater(inflater, container, false)
return binding.root
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}
}
用法如下:
class ChildClass: BaseDialog(ChildClassViewBinding::inflate) {
}
但是,我一開始不會這樣做(因為有一個不錯的選擇)。依靠繼承來處理這類事情很快就會變得一團糟。如果您想為依賴注入框架添加一些其他功能,或者您喜歡使用其他一些常見的東西,會發生什么?如果您想在某些片段中使用某些功能但不是全部,該怎么辦?您是否也在為 Activity 和非對話框片段創建這樣的基類?
這些問題就是為什么有一個編程公理:“組合優于繼承”。
有時別無選擇,只能使用繼承來避免代碼重復。但在 Fragments 和 Bindings 的情況下,我不這么認為。您可以將布局參考傳遞給超級建構式,并使用ViewBinding.bind()而不是inflate(). 由于系結很少需要在onViewCreated函式之外訪問,因此您通常不需要它的屬性。
class ChildClass: AppCompatDialogFragment(R.layout.child_class_view) {
override fun onViewCreated(view: View, bundle: Bundle?) {
super.onViewCreated(view, bundle)
val binding = ChildClassViewBinding.bind(view)
//...
}
}
如果你確實需要它的屬性,@EpicPandaForce 有一個庫,它使它成為單線并在屬性委托中為你處理銷毀時的泄漏避免。
圖書館在這里
用法:
class ChildClass: AppCompatDialogFragment(R.layout.child_class_view) {
private val binding by viewBinding(ChildClassViewBinding::bind)
}
uj5u.com熱心網友回復:
創建基礎片段
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
private var _bi: VB? = null
protected val bi: VB get() = _bi!!
abstract val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> VB
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_bi = bindingInflater(inflater, container, false)
return _bi!!.root
}
override fun onDestroyView() {
super.onDestroyView()
_bi = null
}
}
在你的孩子片段中
class HomeFragment : BaseFragment<HomeFragmentBinding>() {
override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> HomeFragmentBinding
get() = HomeFragmentBinding::inflate
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437840.html
