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
    }

    ...
}
Другие вопросы по тегам