Внедрить универсальную ViewModel Dagger Hilt Android

Привет, я хочу ввести общий тип ViewModel в мою BaseActivity, как мне решить эту проблему с помощью Dagger Hilt.

@AndroidEntryPoint
 abstract class BaseActivity<VM: BaseViewModel> : AppCompatActivity() {

@Inject
lateinit var viewModel: VM

}

person Sahil Shokeen    schedule 29.08.2020    source источник


Ответы (1)


Обновление 1

Вот ответ, о котором я говорил от команды Hilt:

Итак, @ViewModelInject - это своего рода односторонняя вещь, в чем-то похожая на @AndroidEntryPoint. Он добавляет в ваш класс только зависимости Dagger. Он не добавляет вашу ViewModel к графу объекта как привязку Dagger. Чтобы получить доступ к ViewModel у поставщика или где-то еще, вам все равно нужно пройти через обычные API Android для получения модели представления, например, с помощью ViewModelProvider.

Причина, по которой мы не можем представить его на графике, заключается в том, что мы не знаем, с каким ViewModelStoreOwner вы хотите его использовать.

Вы можете найти этот комментарий здесь.


Оригинальный ответ

Я пытался сделать это несколько дней назад, и я думаю, что где-то в Интернете прочитал, что Hilt не может это сделать (до сих пор я не мог найти ссылку).

Обычно в Java мы создаем ViewModel следующим образом:

MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);

Нам необходимо предоставить ViewModelStoreOwner в ViewModelProvider конструктор, и я узнал, что рукоять не может знать, для какого ViewModelStoreOwner вы хотите, чтобы MyViewModel был создан.

Итак, мы продолжим создавать модели представлений по-старому, а в Kotlin вы будете делать это так:

@AndroidEntryPoint
abstract class BaseActivity: AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

}

Как только я найду этот комментарий, в котором упоминается об этом от команды Hilt, я обновлю ответ здесь.

person Ahmed Shendy    schedule 03.09.2020
comment
Спасибо @Ahmed за то, что обновили меня, обновите свой ответ, когда найдете что-то в нем - person Sahil Shokeen; 04.09.2020
comment
@SahilShokeen Я только что обновил свой ответ тем комментарием, о котором я говорил. - person Ahmed Shendy; 05.09.2020