我正在开始一个新项目,我将与10个开发人员组成一个团队。我正在为我们的Android应用设置基础结构。在与团队合作时,我希望每个人都遵循相同的结构,即为每个ViewModel
创建fragment
并使用数据绑定。我如何使其严格,以便开发人员在未为其片段创建ViewModel
的情况下出错?
因此,我创建了以下BaseFragment
:
abstract class BaseFragment<out VM : BaseViewModel, DB : ViewDataBinding> : Fragment() {
open lateinit var binding: DB
private fun init(inflater: LayoutInflater, container: ViewGroup?) {
binding = DataBindingUtil.inflate(inflater, getLayoutRes(), container, false)
}
@LayoutRes
abstract fun getLayoutRes(): Int
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
init(inflater, container)
super.onCreateView(inflater, container, savedInstanceState)
return binding.root
}
open fun refresh() {}
}
我该如何改进?
答案 0 :(得分:1)
改善此问题的一种可能方法包括通过添加onCreate()
方法来初始化ViewModel,在该方法中,您将像这样初始化ViewModel:
abstract class BaseFragment<out VM : BaseViewModel, DB : ViewDataBinding>(private val mViewModelClass: Class<VM>) : Fragment() {
lateinit var viewModel: VM
open lateinit var binding: DB
private fun init(inflater: LayoutInflater, container: ViewGroup?) {
binding = DataBindingUtil.inflate(inflater, getLayoutRes(), container, false)
}
@LayoutRes
abstract fun getLayoutRes(): Int
private fun getViewM(): VM = ViewModelProviders.of(this).get(mViewModelClass)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = getViewM()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
init(inflater, container)
super.onCreateView(inflater, container, savedInstanceState)
return binding.root
}
open fun refresh() {}
}
答案 1 :(得分:-1)
改善基本片段的一种可能方法是像这样使用reified
:
protected inline fun <reified T : ViewModel> getViewModel(): T =
ViewModelProviders.of(this)[T::class.java]
呼叫为:
private val loginViewModel: LoginViewModel = getViewModel()
How does the reified keyword in Kotlin work?
https://proandroiddev.com/how-reified-type-makes-kotlin-so-much-better-7ae539ed0304