首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 2 ViewModel注入

Android 2 ViewModel注入
EN

Stack Overflow用户
提问于 2019-08-29 09:39:11
回答 2查看 2.8K关注 0票数 0

我用的是匕首2和Kotlin。我通过以下方式提供了一个视图模型(CarViewModel)注入。任何地方都写着它必须通过ViewModelFactory注入来完成。我想问一下我直接注入视图模型的方法是否正确?这是我的AppModule:

代码语言:javascript
复制
@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)
}

比注入的活动:

代码语言:javascript
复制
@Inject
lateinit var carViewModel: CarViewModel
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-29 10:54:37

不,你注入视图模型的方式并不完全正确。主要原因是视图模型与某个活动没有关联,因此在重新创建该活动时不会重用它,相反,它也将被重新创建。创建视图模型的正确方法是使用ViewModelProvider,而不是直接使用ViewModelProvider.Factory

代码语言:javascript
复制
// `this` refers to the activity or fragment
viewModel = ViewModelProviders.of(this)[MyViewModel::class.java]

或者:

代码语言:javascript
复制
viewModel = ViewModelProvider(this)[MyViewModel::class.java]

如果您使用最新的alpha版本(不推荐ViewModelProviders.of())。

如果您想要注入视图模型,并且也能够将其注入视图模型(使用构造函数注入),则必须创建ViewModelProvider.Factory接口的实现,并使用它创建具有非空构造函数的视图模型。

票数 1
EN

Stack Overflow用户

发布于 2019-09-04 16:03:52

您只需注入视图模型工厂&绑定视图模型,然后就可以通过视图模型工厂获得视图模型。

代码语言:javascript
复制
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

val carViewModel: CarViewModel by viewModels{viewModelFactory}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57707326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档