Архитектура BaseFragment для проекта Android - PullRequest
5 голосов
/ 15 июня 2019

Я начинаю новый проект и буду работать в команде из 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() {}
}

Как я могу улучшить это больше?

1 Ответ

1 голос
/ 16 июня 2019

Один из возможных способов улучшить это может включать инициализацию ViewModel путем добавления метода onCreate(), в котором вы будете инициализировать 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() {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...