如何创建带参数的ViewModel ?

1,837 阅读1分钟

如何创建带参数的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>()