Android 创建刀柄视图模型时出错

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导航

我曾尝试将一个简单的viewModel交给一个composable,每次出现此错误时都会得到它,但我不知道这意味着什么:

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伟大的我希望你能把它修好。