Привет, я хочу ввести общий тип ViewModel в мою BaseActivity, как мне решить эту проблему с помощью Dagger Hilt.
@AndroidEntryPoint
abstract class BaseActivity<VM: BaseViewModel> : AppCompatActivity() {
@Inject
lateinit var viewModel: VM
}
Привет, я хочу ввести общий тип ViewModel в мою BaseActivity, как мне решить эту проблему с помощью Dagger Hilt.
@AndroidEntryPoint
abstract class BaseActivity<VM: BaseViewModel> : AppCompatActivity() {
@Inject
lateinit var viewModel: VM
}
Вот ответ, о котором я говорил от команды 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, я обновлю ответ здесь.