我用的是匕首2和Kotlin。我通过以下方式提供了一个视图模型(CarViewModel)注入。任何地方都写着它必须通过ViewModelFactory注入来完成。我想问一下我直接注入视图模型的方法是否正确?这是我的AppModule:
@Module
class AppModule {
@Provides
@Singleton
fun getContext(application: Application): Context = application.applicationContext
@Provides
@Singleton
fun getDb(context: Context): MyDatabase = MyDatabase.getInstance(context)
@Provides
fun injectViewModel(application: Application): CarViewModel=
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(CarViewModel::class.java)
}比注入的活动:
@Inject
lateinit var carViewModel: CarViewModel发布于 2019-08-29 10:54:37
不,你注入视图模型的方式并不完全正确。主要原因是视图模型与某个活动没有关联,因此在重新创建该活动时不会重用它,相反,它也将被重新创建。创建视图模型的正确方法是使用ViewModelProvider,而不是直接使用ViewModelProvider.Factory:
// `this` refers to the activity or fragment
viewModel = ViewModelProviders.of(this)[MyViewModel::class.java]或者:
viewModel = ViewModelProvider(this)[MyViewModel::class.java]如果您使用最新的alpha版本(不推荐ViewModelProviders.of())。
如果您想要注入视图模型,并且也能够将其注入视图模型(使用构造函数注入),则必须创建ViewModelProvider.Factory接口的实现,并使用它创建具有非空构造函数的视图模型。
发布于 2019-09-04 16:03:52
您只需注入视图模型工厂&绑定视图模型,然后就可以通过视图模型工厂获得视图模型。
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
val carViewModel: CarViewModel by viewModels{viewModelFactory}https://stackoverflow.com/questions/57707326
复制相似问题