我试图将一个简单的 viewModel 交给一个可组合的,并在每次出现此错误时都会收到此错误,但我不知道这意味着什么:java.lang.IllegalStateException: Given component holder class com.example.app.MainActivity does not implement interface dagger.hilt.internal.GeneratedComponent or interface dagger.hilt.internal.GeneratedComponentManager
我的 Gradle :
implementation("androidx.hilt:hilt-navigation:1.0.0-beta01")
implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03")
我创建了一个 BaseApplication
文件import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class BaseApplication: Application()
并将其设置在 list 中。我创建了一个
AppModule
文件:import android.content.Context
import com.veloce.montageservice.BaseApplication
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Singleton
@Provides
fun provideApplication(@ApplicationContext app: Context): BaseApplication {
return app as BaseApplication
}
}
然后设置@HiltAndroidApp
在我的MainActivity
并创建了 viewModel
像这样:@HiltViewModel
class TaskViewModel: ViewModel() {
//code
}
viewModel
在我的导航中调用 MainActivity
: val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = Screens.LoginScreen.route
) {
composable(Screens.ActiveMontageScreen.route) { navBackStackEntry ->
activeTask?.let {
val factory =
HiltViewModelFactory(LocalContext.current, navBackStackEntry)
val viewModel: TaskViewModel = viewModel("taskViewModel", factory)
ActiveMontageScreen(
viewModel = viewModel,
task = it,
navigation = navController,
context = LocalContext.current
) {
removeActiveTask()
}
}
}
}
我真的看不出任何问题,但是我对 Hilt 和 Android 开发非常缺乏经验。有谁知道是什么问题?
最佳答案
正如我所看到的,很少有东西放错地方,这会导致这样的错误。
例如:
class TaskViewModel(context: Context)
如果您需要 viewmodel
中的上下文那么你可以使用AndroidViewModel
.BaseApplication
在 AppModule
但你没有使用它(也许在其他地方使用)。您可以通过以下步骤创建这样的 View 模型:
BaseApplication
并在 list 中注册,您已经完成了。AndroidViewModel
如下:@HiltViewModel
class TaskViewModel @Inject constructor(
application: BaseApplication
) : AndroidViewModel(application) {
fun test() {
getApplication<BaseApplication>().getString(R.string.app_name)
}
}
这里注意使用
@Inject constructor
这将采用 BaseApplication
来自 AppModule
的类(class).MainActivity
初始化 viewmodel
像这样:@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.test()
}
}
如果您无法解决任何与刀柄相关的问题,请确保您在
build.gradle
中有这些依赖项。//Dagger - Hilt
implementation "com.google.dagger:hilt-android:2.33-beta"
kapt "com.google.dagger:hilt-android-compiler:2.33-beta"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0-beta01"
关于android - 创建 Hilt viewModel 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67319542/