1

viewModel通过这样的委托实现了一个接口:

class ProductViewModel(item: Product) : ViewModel(), ItemInterface by ItemDelegator(item)

现在,在里面ItemDelegator我需要一个CoroutineScope绑定到ViewModel

我根本做不到ItemInterface by ItemDelegator(viewModelScope, item)。创建 ViewModel 时,我无法引用viewModelScope

1 - 我可以以某种方式“传递”viewModelScopeItemDelegator 2 - 我的大部分 viewModel 生命周期都绑定到活动生命周期。lifecycleOwner是否可以将活动(可以从中获取)传递给 ViewModel lifecycleScope,现在,由于它是构造函数中的一个参数,我可以将它传递给ItemDelegator?

4

1 回答 1

3

只有当它们是主构造函数的参数时,您才能引用委托对象。通过创建它们内联(像您一样)引用保存在编译期间生成的内部字段中并且无法访问。

您可以将主构造函数设为私有,并创建将创建委托者的辅助构造函数,因为您不想公开委托初始化。

您还需要修改您的委托类,以便在超级 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
    }

    ...
}
于 2021-02-25T19:43:52.913 回答