如何创建带参数的ViewModel?
方式 一、通过 重写viewModelProvider.Factory 的create创建
(1)、重写Factory的create方法
class HomeViewModelFactory constructor(private val repository: HomeRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(HomeViewModel::class.java)) {
return HomeViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
(2)、在activity 创建
private lateinit var homeViewModel: HomeViewModel
private val repository: HomeRepository = HomeRepository()
private val viewModelFactory: HomeViewModelFactory = HomeViewModelFactory(repository)
使用之前要初始化
homeViewModel = ViewModelProvider(this, viewModelFactory)[HomeViewModel::class.java]
方式 二、通过koin注入框架创建viewModel
(1)、框架引入,将koin依赖放在dependencies中
implementation 'io.insert-koin:koin-android:3.3.3'
(2)、创建一个接口
class HomeRepository: BaseRepository() {
private val service = RetrofitClient.getService(PlayApi::class.java)
suspend fun requestBannerData(): BaseData<List<Banner>> {
return executeRequest { service?.getBanner() }!!
}
}
(3)、将HomeRepository作为参数传入viewModel
class HomeViewModel(private val homeRepository: HomeRepository) :ViewModel(){
}
(4)、使用module来声明待注入的组件
object Koin {
val appModule= module {
single { HomeRepository() }
viewModel { HomeViewModel(get()) } }
}
(5)、需要在application启动koin
class App: Application() {
override fun onCreate() {
super.onCreate()
//开启Koin
startKoin {
androidLogger()
androidContext(this@App)
modules(appModule)
}
}
}
(6)、在具体的页面注入依赖 例如activity fragment.
private val homeViewModel by viewModel<HomeViewModel>()