基于Hilt教程,ViewModels需要通过以下方式注入:
@HiltViewModel
class ExampleViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
private val repository: ExampleRepository
) : ViewModel() {
...
}
字符串
但是,在我的例子中,我想使用一个接口:
interface ExampleViewModel()
@HiltViewModel
class ExampleViewModelImp @Inject constructor(
private val savedStateHandle: SavedStateHandle,
private val repository: ExampleRepository
) : ExampleViewModel, ViewModel() {
...
}
型
然后我想通过接口
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
private val exampleViewModel: ExampleViewModel by viewModels()
...
}
型
如何让这一切顺利进行呢?
5条答案
按热度按时间dnph8jn41#
viewModels
需要ViewModel
类的子级字符串
vsaztqbk2#
有一个类似的问题,我想通过接口注入ViewModel,主要是因为在测试时用一个假的实现来切换它。我们正在从Dagger Android迁移到Hilt,我们使用了假视图模型进行UI测试。把我的发现加在这里,这样它就可以帮助那些面临类似问题的人。
by viewModels()
和ViewModelProviders.of(...)
都需要扩展ViewModel()
的类型。因此接口将是不可能的,但我们仍然可以使用一个扩展ViewModel()
的抽象类1.我不认为有办法使用
@HiltViewModel
来实现这个目的,因为没有办法切换实现。1.因此,尝试将
ViewModelFactory
注入Fragment
。您可以在测试期间切换工厂,从而切换ViewModel。这里,
ListViewModel
是抽象类,ListViewModelImpl
是实际实现。您可以在使用TestInstallIn
进行测试时切换ListDI
模块。有关此方面的更多信息以及正在工作的项目,请参阅this articlexriantvc3#
找到了一个使用
HiltViewModel
作为我希望注入的实际类的代理的解决方案。它很简单,工作起来就像一种魅力;)模块
字符串
分片
型
现在,
myClass
类型的MyClass
接口绑定到viewModels<Proxy>()
生命周期axzmvihb4#
字符串
zazmityj5#
注入一个接口是如此简单,你传递了一个接口,但注入注入了一个Impl。
字符串