Android: ViewModel has no zero argument constructor
Возникает такая ошибка (MainViewModel has no zero argument constructor). Не могу найти в чем причина, буду благодарен за помощь.
Ошибка:
java.lang.RuntimeException: Cannot create an instance of class space.rodionov.currencyconverter.main.MainViewModel
/* bla bla bla */
Caused by: java.lang.InstantiationException: java.lang.Class<space.rodionov.currencyconverter.main.MainViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
... 39 more
ViewModel начинается так:
@HiltViewModel
class MainViewModel @Inject constructor(
private val repo: MainRepository,
private val dispatchers: DispatcherProvider
) : ViewModel() {
// body
}
In MainActivity:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel: MainViewModel by viewModels()
// etc
AppModule:
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Singleton
@Provides
fun provideCurrencyApi() : CurrencyApi = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(CurrencyApi::class.java)
//@Singleton
//@Provides
//fun provideMainRepository(api: CurrencyApi): MainRepository = DefaultMainRepository(api)
//закоменчено 10.06
@Singleton
@Provides
fun provideDispatchers(): DispatcherProvider = object :
DispatcherProvider {
override val main: CoroutineDispatcher
get() = Dispatchers.Main
override val io: CoroutineDispatcher
get() = Dispatchers.IO
override val default: CoroutineDispatcher
get() = Dispatchers.Default
override val unconfined: CoroutineDispatcher
get() = Dispatchers.Unconfined
}
}
MainRepository:
interface MainRepository {
suspend fun getRates(base: String) : Resource<CurrencyResponse>
}
DefaultMainRepository
@Singleton // добавил 10.06
class DefaultMainRepository @Inject constructor(
private val api: CurrencyApi
) : MainRepository {
override suspend fun getRates(base: String): Resource<CurrencyResponse> {
return try {
val response = api.getRates(base)
val result = response.body()
if (response.isSuccessful && result != null) {
Resource.Success(result)
} else {
Resource.Error(response.message())
}
} catch (e: Exception) {
Resource.Error(e.message ?: "An error occurred")
}
}
}
Правки 10.06
Добавил интерфейс:
@Module
@InstallIn(SingletonComponent::class)
interface AppModuleBinds {
@Binds
fun bindMainRepository(bind: DefaultMainRepository): MainRepository
}
- также добавил аннотаци @Singlteon к DefaultMainRepository и убрал соотвутствующую зависимость в AppModule.