【问题标题】:Android Dagger 2 ViewModel injectionAndroid Dagger 2 ViewModel 注入
【发布时间】:2019-08-29 09:39:11
【问题描述】:

我在 Kotlin 中使用 Dagger 2。我已经通过以下方式提供了 viewmodel(CarViewModel) 注入。到处都写着它必须通过 ViewModelFactory 注入来完成。我想问一下我直接注入viewmodel的方式是否正确?这是我的 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

【问题讨论】:

    标签: android kotlin dependency-injection viewmodel dagger-2


    【解决方案1】:

    不,您注入视图模型的方式不太正确。主要原因是视图模型与活动无关,因此在重新创建活动时不会重用它,而是会重新创建它。创建视图模型的正确方法是使用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 接口的实现并使用它来创建查看具有非空构造函数的模型。

    【讨论】:

      【解决方案2】:

      你只需要注入viewmodel factory & bind viewmodel,就可以通过viewmodel factory获取view model了。

      @Inject
      lateinit var viewModelFactory: ViewModelProvider.Factory
      
      val carViewModel: CarViewModel by viewModels{viewModelFactory}
      

      【讨论】:

      • 我没有使用 Koin。
      • 好吧!这也可以与 dagger 2 或其他通过视图模型工厂获取视图模型的方式一起使用 val viewModel = ViewModelProviders.of(this,viewModelFactory).get(CarViewModel::class.java)
      猜你喜欢
      • 2018-03-08
      • 2018-12-08
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多