Android Dagger 2 ViewModel注入

时间:2019-08-29 09:39:11

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

我在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

2 个答案:

答案 0 :(得分: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接口的实现并使用它用非空的构造函数创建视图模型。

答案 1 :(得分:0)

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

const chosen = quotes.splice(random,1)[0]

function change() {
    new_choice = Math.floor(Math.random() * quotes.length);
    // display quotes[new_choice]

    // Swap the "disabled" quote back into the list, removing the one just chosen.
    temp = chosen
    chosen = quotes[new_choice]
    quotes[new_choice] = temp
}