Несколько экземпляров одного и того же типа фрагмента с разным типом ViewModel на основе аргумента, переданного фрагменту - PullRequest
0 голосов
/ 09 мая 2020

У меня есть приложение с ViewPager2. Все страницы в нем являются экземплярами фрагмента одного типа. Все страницы отображают некоторые списки в рециклерном представлении с разными типами данных. Данные заполняются из некоторой конечной точки API с помощью вызовов Retrofit.

Я использую кинжал 2 для добавления моделей просмотра.

Все нормально работает с одной страницей. Теперь я хочу создать другие страницы, и я спрашиваю , есть ли какой-либо метод / шаблон для реализации других страниц без создания разных классов фрагментов, но только для использования другого типа viewModel?

Может быть какой-то общий c viewModel или что-то в этом роде.

1 Ответ

0 голосов
/ 25 мая 2020

Тип страницы

enum class PageType {
    Page1, Page2, Page3;
}

val PageType.viewModelClass: KClass<out GenericViewModel>
    get() = when (this) {
        PageType.Page1 -> Page1ViewModel::class
        // todo
    }

Модель просмотра

abstract class GenericViewModel<T>() : BaseViewModel() {

    abstract val pageType: PageType
}

class Page1ViewModel @Inject constructor() : GenericViewModel() {
    override val pageType: PageType = PageType.Page1
}

Фрагмент

class PageFragment : BaseFragment() {

    private val pageType: PageType by lazy {
        TODO("read from arguments bundle")
    }

    private val vm: GenericViewModel by lazy {
        ViewModelProvider(this, viewModelFactory).get(pageType.viewModelClass.java)
    }

    companion object {
        fun newInstance(type: PageType): PageFragment {
            TODO("add type into bundle and set as arguments")
        }
    }
}

Если ваша текущая установка кинжала работает для моделей просмотра, вам не нужно делать ничего особенного для поддержки этого шаблона.

...