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.

Ответы (0 шт):