我试着把一个简单的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
就我所见,很少有东西放错了地方,导致了这样的错误。
例如:
>
这里不注入上下文类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"