android - Dagger 柄。运行时错误。错误: ViewModel has no zero argument constructor (kotlin)

标签 android kotlin android-viewmodel dagger-hilt

我收到错误(MainViewModel 没有零参数构造函数)。 在我看来,错误在于滥用希尔特,但我找不到。 SA上也有类似的问题,但不适合我的情况。 我找不到哪里出错了,非常感谢您的帮助。

错误:

java.lang.RuntimeException: Cannot create an instance of class mypackage.main.MainViewModel
  /* bla bla bla */
Caused by: java.lang.InstantiationException: java.lang.Class<mypackage.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
}

在主 Activity 中:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    private val viewModel: MainViewModel by viewModels()
// etc

应用程序模块:

@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)

    @Singleton
    @Provides
    fun provideDispatchers(): // blablabla
    }
}

主存储库:

interface MainRepository {
    suspend fun getRates(base: String) : Resource<CurrencyResponse>
    }

默认主存储库

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")
        }
    }
}

最佳答案

我通过将 Dagger Hilt 依赖项版本更改为更早版本解决了这个问题。我认为这些版本之间存在不匹配。代码的其余部分似乎是正确的..

关于android - Dagger 柄。运行时错误。错误: ViewModel has no zero argument constructor (kotlin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67908467/

相关文章:

java - 在Android OpenGL中渲染简单的正方形

android - 从 Android 应用程序打开 Gmail

spring-mvc - Kotlin是否需要NotNull?

unit-testing - 在 kotlin 中模拟同伴对象函数

android - android中第二次观察viewmodel返回null

Java 9 Eclipse 4.7 可移植导出错误 "resource not found", "Could not find main method from given launch configuration."

java - 为什么在某些情况下编译器构建会返回无法访问的代码

java - 在模块依赖中声明named的提供方法

android - 在 Activity 或 Fragment 之外获取 ViewModel 实例的正确方法

Service 中的 Android ViewModel(备选)