Android 创建刀柄视图模型时出错
我曾尝试将一个简单的viewModel交给一个composable,每次出现此错误时都会得到它,但我不知道这意味着什么:Android 创建刀柄视图模型时出错,android,kotlin,android-jetpack-compose,dagger-hilt,Android,Kotlin,Android Jetpack Compose,Dagger Hilt,我曾尝试将一个简单的viewModel交给一个composable,每次出现此错误时都会得到它,但我不知道这意味着什么: java.lang.IllegalStateException:给定的组件持有者类com.example.app.main活动未实现接口dagger.hilt.internal.GeneratedComponent或接口dagger.hilt.internal.GeneratedComponentManager 我的格拉德尔: 实现(“androidx.hilt:hilt导航
java.lang.IllegalStateException:给定的组件持有者类com.example.app.main活动未实现接口dagger.hilt.internal.GeneratedComponent或接口dagger.hilt.internal.GeneratedComponentManager
我的格拉德尔:
实现(“androidx.hilt:hilt导航:1.0.0-beta01”)
实现(“androidx.hilt:hilt生命周期视图模型:1.0.0-alpha03”)
我已经创建了一个BaseApplication
文件
导入android.app.Application
导入dagger.hilt.android.HiltAndroidApp
@希尔顿酒店
类BaseApplication:Application()
并把它放在清单上
我已经创建了一个AppModule
文件:
导入android.content.Context
导入com.veloce.montageservice.BaseApplication
导入匕首模块
进口匕首。提供
导入dagger.hilt.InstallIn
导入dagger.hilt.android.qualifiers.ApplicationContext
导入dagger.hilt.components.Singleton组件
导入javax.inject.Singleton
@模块
@InstallIn(SingletonComponent::class)
对象应用程序模块{
@独生子女
@提供
fun ProviderApplication(@ApplicationContext app:Context):BaseApplication{
将应用程序返回为BaseApplication
}
}
然后在我的main活动中设置@HiltAndroidApp
,并创建一个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()
}
}
@HiltViewModel
类TaskViewModel:ViewModel(){
//代码
}
viewModel
在main活动的我的导航中调用:
val navController=rememberNavController()
导航主机(
导航控制器=导航控制器,
startDestination=Screens.LoginScreen.route
) {
可组合(Screens.activemontagesscreen.route){navbackbackbackentry->
活动任务?让我们{
瓦尔工厂=
HiltViewModelFactory(LocalContext.current,NavBackbackEntry)
val viewModel:TaskViewModel=viewModel(“TaskViewModel”,工厂)
活动蒙太奇屏幕(
viewModel=viewModel,
任务=它,
导航=导航控制器,
context=LocalContext.current
) {
removeActiveTask()
}
}
}
}
我真的看不出有什么问题,但我对Hilt和Android开发还没有经验。
有人知道问题出在哪里吗?我看不出有什么东西放错了地方,导致了这样的错误
例如:
您没有在此处注入上下文class TaskViewModel(context:context)
如果您需要viewmodel
中的上下文,则可以使用AndroidViewModel
您正在AppModule
中创建BaseApplication
,但没有使用它(可能在其他地方使用)
可以通过以下步骤创建此类viewmodel:
创建BaseApplication
&在清单中注册它,这是您已经完成的
创建一个AndroidViewModel
,如下所示:
@HiltViewModel
class TaskViewModel @Inject constructor(
application: BaseApplication
) : AndroidViewModel(application) {
fun test() {
getApplication<BaseApplication>().getString(R.string.app_name)
}
}
如果无法解决任何与刀柄相关的问题,请确保在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"
因此,对于viewmodel,您需要添加注释@Inject或@ViewModelInject,具体取决于您的版本依赖关系,并按如下方式创建注释
class TaskViewModel @Inject constructor(context: Context) : ViewModel() {
//code
}
在你的片段活动中,以这种方式实例化
val taskViewModel: TaskViewModel by viewmodels()
在我按下post按钮30秒后,我清楚地意识到上下文没有意义。:-)我已经取出并尝试了您的建议,但不幸的是没有任何改变,同样的错误我看到MainActivity
中的注释是错误的,并且改变了它。我收到一个新错误java.lang.RuntimeException:无法创建类com.example.app.ui.view\u models.TaskViewModel
@ChrisPi您在TaskViewModel
中使用了@Inject构造函数
?如果不是,那么你应该。另外,您是否尝试了我在MainActivity
中为您提供的初始化viewmodel的方法?是的,我进行了更改。我正在尝试实现kaptnow@ChrisPi伟大的我希望你能把它修好。