Android Получить ViewModelScope, чтобы его можно было использовать в делегировании интерфейса
Мой
viewModel
реализует интерфейс путем делегирования следующим образом:
class ProductViewModel(item: Product) : ViewModel(), ItemInterface by ItemDelegator(item)
Теперь внутри мне нужен
CoroutineScope
привязанный к
ViewModel
Я просто не могу
ItemInterface by ItemDelegator(viewModelScope, item)
. Когда создается ViewModel, у меня не может быть ссылки на
1 - Можно как-нибудь "передать"
viewModelScope
к 2 - большая часть моего жизненного цикла viewModels привязана к жизненному циклу активности. Можно ли передать ViewModel действие
lifecycleOwner
(можно получить
lifecycleScope
из него), и теперь, поскольку это параметр в конструкторе, я могу передать его в
ItemDelegator
?
1 ответ
Вы можете ссылаться на делегирующие объекты только в том случае, если вы создаете их встроенными (как вы это делаете) или если они являются аргументом основного конструктора.
Вы можете сделать свой основной конструктор закрытым и создать вторичный конструктор, который будет создавать ваш делегат, поскольку вы не хотите раскрывать инициализацию своего делегата.
Вам также необходимо изменить свой класс делегатора, чтобы вы могли лениво вводить в него область видимости после завершения выполнения конструкторов супер ViewModel:
class ItemDelegator(val item : Product) : ItemInterface {
lateinit var scope : CoroutineScope
...
}
class ProductViewModel private constructor(
item: Product,
private val delegate : ItemDelegator
) : ViewModel(), ItemInterface by delegate {
constructor(item: Product) : this(ItemDelegator(item))
init {
delegate.scope = viewModelScope
}
...
}