【发布时间】:2021-06-09 16:47:14
【问题描述】:
我收到一个错误(MainViewModel 没有零参数构造函数)。 在我看来,错误在于滥用 Hilt,但我找不到。 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
}
在 MainActivity 中:
@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>
}
DefaultMainRepository
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")
}
}
}
【问题讨论】:
-
从您的
MainViewModel和DefaultMainRepository中删除@Inject constructor。你不需要这个,因为你已经从 dagger 模块提供了这些 -
感谢您的建议,但它会导致同样的错误
-
请在删除
@Inject constructor时使用匕首模块提供MainViewModel -
不能直接作为构造函数传递接口,必须绑定它
标签: android kotlin android-viewmodel dagger-hilt