Dagger2 注入抽象 ViewModel 的特定实例
Dagger2 inject specific instance of abstract ViewModel
我有一个 ViewModelFactory 实现如下:
class ViewModelFactory<VM> @Inject constructor(private val viewModel: Lazy<VM>)
: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return viewModel.get() as T
}
}
这适用于我当前的 ViewModel:
class MainActivityViewModel @Inject constructor(private val dependency: Dependency) : ViewModel()
//... in the activity:
@Inject
lateinit var factory: ViewModelFactory<MainActivityViewModel>
private val viewModel: MainActivityViewModel by viewModels { factory }
但是我想在行为不同的地方实现不同的构建风格,所以我创建了一个 AbstractViewModel:
abstract class AbstractViewModel : ViewModel()
//...and so now
class MainActivityViewModel @Inject constructor(private val dependency: Dependency) : AbstractViewModel()
//... and in the activity
@Inject
lateinit var factory: ViewModelFactory<AbstractViewModel>
private val viewModel: AbstractViewModel by viewModels { factory }
我希望能够向 ViewModelFactory 提供特定实例,但我不确定如何实现。
解决了。回答以供将来参考和任何可能有兴趣做类似事情的人。
第 1 步:添加新模块组件
@Component(
modules = [
//...
ViewModelModule::class
]
)
interface ApplicationComponent { //...
这允许开发人员创建一个 FlavourApplicationComponent
可以替代 ViewModelModule
,我称之为 MockViewModelModule
第 2 步:定义模块
//in the main flavour
@Module
class ViewModelModule {
@Provides
fun provideMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): AbstractViewModel
= mainActivityViewModel
}
//in the mock flavour
@Module
class MockViewModelModule {
@Provides
fun provideMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): AbstractViewModel
= MockMainActivityViewModel()
}
这实际上可以在 运行 时间进行配置,因此您可以允许用户测试您应用的所有不同状态,而无需他们进入这些状态。
我有一个 ViewModelFactory 实现如下:
class ViewModelFactory<VM> @Inject constructor(private val viewModel: Lazy<VM>)
: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return viewModel.get() as T
}
}
这适用于我当前的 ViewModel:
class MainActivityViewModel @Inject constructor(private val dependency: Dependency) : ViewModel()
//... in the activity:
@Inject
lateinit var factory: ViewModelFactory<MainActivityViewModel>
private val viewModel: MainActivityViewModel by viewModels { factory }
但是我想在行为不同的地方实现不同的构建风格,所以我创建了一个 AbstractViewModel:
abstract class AbstractViewModel : ViewModel()
//...and so now
class MainActivityViewModel @Inject constructor(private val dependency: Dependency) : AbstractViewModel()
//... and in the activity
@Inject
lateinit var factory: ViewModelFactory<AbstractViewModel>
private val viewModel: AbstractViewModel by viewModels { factory }
我希望能够向 ViewModelFactory 提供特定实例,但我不确定如何实现。
解决了。回答以供将来参考和任何可能有兴趣做类似事情的人。
第 1 步:添加新模块组件
@Component(
modules = [
//...
ViewModelModule::class
]
)
interface ApplicationComponent { //...
这允许开发人员创建一个 FlavourApplicationComponent
可以替代 ViewModelModule
,我称之为 MockViewModelModule
第 2 步:定义模块
//in the main flavour
@Module
class ViewModelModule {
@Provides
fun provideMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): AbstractViewModel
= mainActivityViewModel
}
//in the mock flavour
@Module
class MockViewModelModule {
@Provides
fun provideMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): AbstractViewModel
= MockMainActivityViewModel()
}
这实际上可以在 运行 时间进行配置,因此您可以允许用户测试您应用的所有不同状态,而无需他们进入这些状态。