HILT?с ним всё изи и просто,а без приходится создавать фактори. Caused by: java.lang.InstantiationException: java.lang.Class<com.example.cleantest22decabr.viewModel.MainViewModel> has no zero argument constructor - вот такую ошибку ловлю ожидаемо. неужели надо будет всё время в фактори добавлять интерфейсы которые могут быть в конструкторе?какие есть элегантные пути решения проблемы?
Там и хилт под капотом наверняка строит фактори. На сколько я знаю, без фабрики это не сделать, в дагере руками приходилось писать сетап фабрики
то есть это нормальная практика писать кучу фактори для своих viewModel-й?
По хорошему - один класс фабрики и через нее будут ходить все модели. В конструктор карту класс-вм скармливают. И тогда может быть по фабрике на каждую вм создано и выкинуто после получения вм
спасибо
а нет примера кода где именно один класс фабрики создаётся?
https://github.com/Legion1900/Movies-App/blob/master/app/src/main/java/com/legion1900/moviesapp/view/base/ViewModelFactory.kt
cпасибо, буду вкуривать
так. извиняюсь,но снова вопрос. При создании фактори в фрагменте или активити всё равно надо задавать параметры конструктора фактори. Если я кидаю реализацию интерфейса, то я не могу её инжектить в поля активити или фрагмента. То есть так не получится,нет?
Не стоит. Инжектить в контроллер нужно уже готовую фабрику. Пусть di где-то сам разпетляет, что в эту фабрику подать
А почему такие вопросы стоят? С хилта на ручное управление переезд??
хилт хорош, очень нравится,но я хочу понять как руками это всё сделать.
всё равно надо будет же в аргументах тут прописывать что я даю фабрике, независимо от di
О, так, могу тебе скинуть ссылку на поделку свою, я там руками di делал. Далеко не идеально, я в курсе. Но вдруг поможет. Надо?
давай. люди же всё равно в большинстве своём на проекте живут без хилта,то есть также сталкиваются с этой проблемой.
Можешь попробовать вообще с дагера начать, если с ним не работал. Там фабрику тоже самому писать нужно, только контейнеры за тебя строит и удерживает в памяти граф зависимостей
у меня сейчас и так даггер без хилта
В целом, живут на дагере или koin. Руками не пишут такое. Вернее пишут, но не так часто. Глянь вот этот пакет, там контейнеры содержат все мясо. Ну и лучше клонировать и в ide скакать по всем классам, которые di юзает https://github.com/Legion1900/dchat/tree/main/app/src/main/java/com/legion1900/dchat/view/main/di
изначальный вопрос вообще в том,как прокинуть реализацию интерфейса во ViewModel(через Binds ). Кроме веселья с Factory и релакса с Хилтом путей нет?
Только фабрика. Ты в нее уже готовые вм или обертки, которые на заказ строят вм, прокидываешь будешь
но фабрике же всё равно надо будет на вход передавать в конструктор этот интерфейс. чет я походу в 3 соснах заблудился
Фабрику пусть di строит, это будут его проблемы
И даже там все равно в конструкторе же надо передавать параметр
А в чём проблема?
Если в дагере, то ты передаешь в фабрику карту (как в первой ссылке), а конструктор фабрики пометишь @Inject, тогда найти параметры в графе будет задачей дагера, а не твоей. Тебе только мапу составить через @IntoMap надо
Но в первой ссылке фактори конструктор без инжекта,там только мапа.
Вот тут глянь: https://habr.com/ru/post/337320/
Понял, спасибо
Как думаете,а если инжектить viewModel саму через даггер,то это нормальный подход и избавляет от этой проблемы создания фабрик и ТД?
Никак нет. У тебя кто удерживает VM и дергает ее onCleared? Фреймворк. Нужно как-то зарегистрировать вм у фреймворка, для чего эти танцы с бубном вокруг ViewModelProvider, которому так нужна фабрика
Беда
Да не, просто с фабрикой чуть возни будет один раз
Выглядит как не чуть.а по факту - надо разбираться(или юзать хилт)
Лучше разобраться, в хилте магии нет, хилт юзается не так часто на проде пока, так что понимать, как это делается стоит
Понял,надеюсь разберусь по статье
Обсуждают сегодня