![](/img/trans.png)
[英]Koin Android: org.koin.error.NoBeanDefFoundException when Inject Repository
[英]Koin inject to viewModels android
我決定從 Dagger 切換到 Koin,因為它更輕量級且代碼更少。 所以我有我的模塊
val databaseModule = module {
single {
get<AppDatabase>().serverDao()
}
// And all the DAOs here
}
val repositoryModule = module {
single<ServerRepository> {
// ServerDao, AccountDao, ApiManager
return@single ServerRepositoryImpl(get(), get(), get())
}
// And all the repositories here
}
val networkModule = module {
single<Gson> {
val gsonBuilder = GsonBuilder()
return@single gsonBuilder.setLenient().create()
}
single {
if (!BuildConfig.DEBUG) return@single null
val httpLoggingInterceptor = HttpLoggingInterceptor()
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
return@single httpLoggingInterceptor
}
single {
return@single HeaderInterceptor()
}
single {
return@single BaseUrlHolder(BuildConfig.BASE_HOLDER_URL)
}
single {
val loggingInterceptor = get<Interceptor?>()
OkHttpClient().newBuilder().apply {
connectTimeout(60, TimeUnit.SECONDS)
readTimeout(60, TimeUnit.SECONDS)
writeTimeout(60, TimeUnit.SECONDS)
loggingInterceptor?.let {
addInterceptor(it)
}
addInterceptor(get<HeaderInterceptor>())
}.also {
return@single it.build()
}
}
single<Retrofit> {
return@single Retrofit.Builder()
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(GsonConverterFactory.create(get()))
.client(get<OkHttpClient>())
.build()
}
single<MyApiService> {
return@single get<Retrofit>().create(MyApiService::class.java)
}
}
val managersModule = module {
single<ApiManager> {
// I have to provide the URL runTime because it is not standar
// private val baseUrlHolder: BaseUrlHolder,
// private val retrofitBuilder: Retrofit.Builder
return@single ApiManagerImpl(get(), get())
}
所以在我的 SplashView 中,我想擁有 ServerRepository 和 ApiManager。 我試圖讓他們通過 KoinComponent 但沒有
// *****BaseViewModel implements KoinComponent*****
class SplashViewModel : BaseViewModel() {
// Here i should get the serverRepository.
private val serverRepository: ServerRepository by inject()
......
}
在 SplashActivity 我得到的視圖模型為
private val splashViewModel: SplashViewModel by viewModels()
我總是遇到同樣的錯誤
Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'retrofit2.Retrofit$Builder'. Check your definitions!
必須定義 ViewModel 的 Bean 定義
val viewModelModule = module {
viewModel {
SplashViewModel() // if there are no parameter otherwise use get() function to pass the parameter of the viewmodel
}
}
解決方案是我沒有正確編寫networkModule
single<OkHttpClient> {
val loggingInterceptor = get<Interceptor?>()
val httpClientBuilder = OkHttpClient().newBuilder().apply {
connectTimeout(60, TimeUnit.SECONDS)
readTimeout(60, TimeUnit.SECONDS)
writeTimeout(60, TimeUnit.SECONDS)
addInterceptor(get<HeaderInterceptor>())
loggingInterceptor?.let {
addInterceptor(loggingInterceptor)
}
}
return@single httpClientBuilder.build()
}
single<Retrofit.Builder> {
return@single Retrofit.Builder()
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(GsonConverterFactory.create(get()))
.client(get<OkHttpClient>())
}
這里問一個Retrofit.Builder
的實例
val managersModule = module {
single<ApiManager> {
// I have to provide the URL runTime because it is not standar
// private val baseUrlHolder: BaseUrlHolder,
// private val retrofitBuilder: Retrofit.Builder
return@single ApiManagerImpl(get(), get())
}
在依賴圖中,您僅提供Retrofit
而不是Retrofit.Builder
以下行中的更改可能會解決這種情況:
single<Retrofit.Builder> { // change type
return@single Retrofit.Builder()
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(GsonConverterFactory.create(get()))
.client(get<OkHttpClient>())
// Remove
//.build()
}
single<MyApiService> {
// adjustment
return@single get<Retrofit.Builder>().build().create(MyApiService::class.java)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.