创建 Hilt viewModel 时出错
Getting error from creating a Hilt viewModel
我试图将一个简单的 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()
并在Manifest中设置。
我创建了一个 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
}
}
然后在我的 MainActivity
中设置 @HiltAndroidApp
并创建一个 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
.
您正在 AppModule
中创建 BaseApplication
但您没有使用它(可能在其他地方使用)。
您可以通过以下步骤创建这样的视图模型:
创建 BaseApplication
并在您已经完成的清单中注册。
创建一个 AndroidViewModel
如下:
@HiltViewModel
class TaskViewModel @Inject constructor(
application: BaseApplication
) : AndroidViewModel(application) {
fun test() {
getApplication<BaseApplication>().getString(R.string.app_name)
}
}
这里注意 @Inject constructor
的使用,它将从 AppModule
.
中获取 BaseApplication
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"
所以对于你的视图模型,你需要根据你的版本依赖添加注解@Inject 或@ViewModelInject 并像这样创建它
class TaskViewModel @Inject constructor(context: Context) : ViewModel() {
//code
}
并且在你的activity片段中以这种方式实例化
val taskViewModel: TaskViewModel by viewmodels()
请检查这些选项:
1- 您必须具有这些依赖项:
//Hilt
def hilt_version = "2.38.1"
implementation("com.google.dagger:hilt-android:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
kapt("androidx.hilt:hilt-compiler:1.0.0")
implementation("androidx.hilt:hilt-navigation-compose:1.0.0-alpha03")
implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03")
2- 您必须已将此注释添加到您的 activity
@AndroidEntryPoint
class MainActivity : ComponentActivity()
3- 你一定是像这样在你的屏幕中注入了你的 viewModel
@Composable
fun MainScreen(
viewModel: MainScreenViewModel = hiltViewModel()
)
更新
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
kapt 'androidx.hilt:hilt-compiler:1.0.0'
我试图将一个简单的 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()
并在Manifest中设置。
我创建了一个 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
}
}
然后在我的 MainActivity
中设置 @HiltAndroidApp
并创建一个 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
.您正在
AppModule
中创建BaseApplication
但您没有使用它(可能在其他地方使用)。
您可以通过以下步骤创建这样的视图模型:
创建
BaseApplication
并在您已经完成的清单中注册。创建一个
AndroidViewModel
如下:@HiltViewModel class TaskViewModel @Inject constructor( application: BaseApplication ) : AndroidViewModel(application) { fun test() { getApplication<BaseApplication>().getString(R.string.app_name) } }
这里注意 @Inject constructor
的使用,它将从 AppModule
.
BaseApplication
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"
所以对于你的视图模型,你需要根据你的版本依赖添加注解@Inject 或@ViewModelInject 并像这样创建它
class TaskViewModel @Inject constructor(context: Context) : ViewModel() {
//code
}
并且在你的activity片段中以这种方式实例化
val taskViewModel: TaskViewModel by viewmodels()
请检查这些选项:
1- 您必须具有这些依赖项:
//Hilt
def hilt_version = "2.38.1"
implementation("com.google.dagger:hilt-android:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
kapt("androidx.hilt:hilt-compiler:1.0.0")
implementation("androidx.hilt:hilt-navigation-compose:1.0.0-alpha03")
implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03")
2- 您必须已将此注释添加到您的 activity
@AndroidEntryPoint
class MainActivity : ComponentActivity()
3- 你一定是像这样在你的屏幕中注入了你的 viewModel
@Composable
fun MainScreen(
viewModel: MainScreenViewModel = hiltViewModel()
)
更新
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
kapt 'androidx.hilt:hilt-compiler:1.0.0'