我在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
答案 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
}