Android Dagger 2 ViewModel注入
Android Dagger 2 ViewModel injection
我在 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)
}
比注入activity:
@Inject
lateinit var carViewModel: CarViewModel
不,您注入视图模型的方式不太正确。主要原因是视图模型未与 activity 相关联,因此在重新创建 activity 时不会重用它,而是也会重新创建它。创建视图模型的正确方法是使用 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
接口并使用它来创建具有非空构造函数的视图模型。
你只需要注入视图模型工厂并绑定视图模型,然后你就可以通过视图模型工厂获取视图模型。
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
val carViewModel: CarViewModel by viewModels{viewModelFactory}
我在 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)
}
比注入activity:
@Inject
lateinit var carViewModel: CarViewModel
不,您注入视图模型的方式不太正确。主要原因是视图模型未与 activity 相关联,因此在重新创建 activity 时不会重用它,而是也会重新创建它。创建视图模型的正确方法是使用 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
接口并使用它来创建具有非空构造函数的视图模型。
你只需要注入视图模型工厂并绑定视图模型,然后你就可以通过视图模型工厂获取视图模型。
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
val carViewModel: CarViewModel by viewModels{viewModelFactory}