在 Android Kotlin 应用程序中使用 Hilt 注入 ViewModel 时遇到问题

问题描述 投票:0回答:1

我正在开发一个 Android 应用程序,使用 Kotlin、Jetpack Compose 和 Hilt 进行依赖注入。尽管遵循了 Hilt 的推荐设置,但在尝试创建 HomeViewModel 实例时,我仍然遇到运行时异常。我已经在 build.gradle 文件和代码中验证了我的 Hilt 设置,但问题仍然存在。

例外:

java.lang.RuntimeException: Cannot create an instance of class tech.diadem.luckydays.composeScreens.viewmodel.HomeViewModel

尽管我似乎正确地设置了用于 Hilt 注入的 ViewModel、存储库和网络服务类,但仍会引发此异常。

HomeViewModel.kt:

@HiltViewModel
class HomeViewModel @Inject constructor(
    private val userRepository: UserRepository_ 
) : ViewModel() {
    private val _userName = MutableLiveData<String>()
    val userName: LiveData<String> = _userName

    fun fetchUserName(authToken: String) {
        viewModelScope.launch {
            val result = userRepository.getUserName(authToken)
            result.onSuccess {
                _userName.value = it.first?.userName ?: "Unknown"
            }.onFailure {
                _userName.value = "Error fetching user"
            }
        }
    }
}

UserRepository_.kt:

class UserRepository_ @Inject constructor(private val networkService: NetworkService) {
    suspend fun getUserName(authToken: String): Result<Pair<UserDetails?, Int>> {
        return networkService.fetchUserDetails(authToken)
    }
}

NetworkService.kt 和 NetworkModule.kt:

interface NetworkService {
    suspend fun fetchUserDetails(authToken: String): Result<Pair<UserDetails?, Int>>
}

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    @Singleton
    @Provides
    fun provideNetworkService(@ApplicationContext context: Context): NetworkService {
        return VolleyNetworkService(context)
    }
}

应用类别:

@HiltAndroidApp
class MyLuckyDays_Hilt : Application()

build.gradle(模块): 依赖项包括 Hilt、ViewModel、Kotlin 等(注意:根据您的实际依赖项调整这部分,重点关注 Hilt 和任何可能相关的库)。

我密切关注了 Hilt 文档并多次检查了我的设置,但我无法确定我遗漏了什么或做错了什么导致了上述异常。

问题:

我在 ViewModel 中设置 Hilt 进行依赖注入的方式是否有任何错误?

问题是否在于我如何通过 Hilt 提供 NetworkService,或者在于 UserRepository_ 的设置方式?

我可以采取其他调试步骤来查明注入失败的原因吗?

任何见解或建议将不胜感激!

android kotlin android-viewmodel dagger-hilt android-mvvm
1个回答
0
投票

因为您还没有提到您的 Activity 和 Fragment 的代码。我假设您忘记在 Activity 和 Fragments 类中添加

@AndroidEntryPoint

只需用

@AndroidEntryPoint
注释您的 Activity 和 Fragment 类,它就应该可以工作。检查以下链接:

https://developer.android.com/training/dependency-injection/hilt-android#android-classes

© www.soinside.com 2019 - 2024. All rights reserved.