当前位置: 首页 > 知识库问答 >
问题:

从创建Hilt viewModel中获取错误

杭令
2023-03-14

我试着把一个简单的viewModel交给一个composable,每次出现这个错误,我都不知道这意味着什么:

java.lang.IllegalStateException:给定的组件持有人类com.example.app.MainActivity不实现接口Dagger.hilt.Internal.GeneratedComponent或接口Dagger.hilt.Internal.GeneratedComponentManager

我的分级:

    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()

并将其设置在清单中。

我创建了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()
         }
     }
 }
}

null

共有1个答案

宋凌龙
2023-03-14

就我所见,很少有东西放错了地方,导致了这样的错误。

例如:

>

  • 这里不注入上下文类TaskViewModel(context:context)如果需要ViewModel中的上下文,那么可以使用AndroidViewModel

    您正在AppModule中创建BaseApplication,但您没有使用它(可能在其他地方使用)。

    您可以通过以下步骤创建这样的viewmodel:

    >

  • 创建baseApplication&在manifest中注册它,您已经这样做了。

    创建AndroidViewModel,如下所示:

    @HiltViewModel
    class TaskViewModel @Inject constructor(
     application: BaseApplication
    ) : AndroidViewModel(application) {
    
     fun test() {
         getApplication<BaseApplication>().getString(R.string.app_name)
     }
    
    }  
    

    这里请注意@inject constructor的使用,它将从AppModule获取BaseApplication类。

    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()
     }
    
    }
    

    如果无法解决任何与hilt相关的问题,请确保在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"
    

  •  类似资料:
    • 请帮我解决这个问题。

    • 我有一个UserControl,其中有两个文本框。用户可以根据需要添加这些UserControls的多个副本。每个UserControl都添加到面板的底部。如何从这些用户控件中获取信息。 这是添加我当前使用的UserControl的代码: 以从文本框中获取数据,但MailingReference.Controls不存在。 我不确定如何遍历每个MailingReference UserControl

    • 经过2天的痛苦,我开始知道它是由于gradle来的,我下载并添加了它也在环境变量。当我进入cordova项目中的android文件夹并给出gradle init命令时,我也得到了这个错误。不知道这是什么原因。我仍然使用eclipse而不是android studio,这也是一个原因吗?

    • 如果我注释掉第二个alter table,它可以工作,因为数据是插入的。 完整错误为:Fiddle显示错误的默认值无效:https://dbfiddle.uk/?rdbms=mysql_8.0&Fiddle=2df3b421793a7470a321247abec85b47

    • 我制作了一个应用程序,它将获取数据库的列名,并在运行时基于数据库的列名创建一个jlabel和jtextfield。 下面是代码片段:我在这里使用Netbeans。。。 这将是示例输出。 引用JTextFields的行。。 但是,我无法获取在jtextfields中输入的值。我试过使用下面的代码。但运气不好。感谢您的帮助。

    • 我已经在Ubuntu14.04中安装了ElasticSearch5.1。我在Elasticsearch中执行了一些操作,如创建索引,删除索引等,然后我安装了Kibana5.1。现在我想使用postman(localhost:9200/my_index with PUT)在elasticsearch中创建新的索引。但我遇到了这个错误。 我记得我曾使用作为索引或类型。但我已经清除了elasticsea