android项目的BaseFragment体系结构

时间:2019-06-15 08:34:45

标签: android android-fragments kotlin android-architecture-components

我正在开始一个新项目,我将与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() {}
}

我该如何改进?

2 个答案:

答案 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()

有关此方法的有用链接:http://www.albertgao.xyz/2018/05/22/3-ways-to-handle-view-model-creation-in-android-with-dagger-and-kotlin/

How does the reified keyword in Kotlin work?

https://proandroiddev.com/how-reified-type-makes-kotlin-so-much-better-7ae539ed0304