Dagger 无法注入应用程序上下文
Dagger failing to inject Application context
我设置了 dagger 来管理片段和视图模型。我需要将应用程序上下文传递到我的视图模型,以便实例化并与存储库 class 通信。当我尝试这样做时,我从 dagger 中收到一条错误消息:
error: [Dagger/DependencyCycle] Found a dependency cycle:
public abstract interface AppComponent {
^
com.example.framework.BaseApplication is injected at
com.example.di.AppModule.provideAppContext(application)
com.example.framework.BaseApplication is injected at
com.example.di.MainViewModelModule.provideMainViewModelFactory(application, �)
androidx.lifecycle.ViewModelProvider.Factory is injected at
com.example.framework.presentation.common.MainFragmentFactory(viewModelFactory)
com.example.framework.presentation.common.MainFragmentFactory is injected at
com.example.framework.presentation.main.MainActivity.fragmentFactory
com.example.framework.presentation.main.MainActivity is injected at
我是 dagger 的新手,所以我很难确定此问题的根本原因以及如何实施修复。对这个问题中的代码量表示歉意,但匕首有许多 classes 可能是问题所在。
应用组件
@Component(
modules = [
AppModule::class,
MainViewModelModule::class,
MainFragmentFactoryModule::class
]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(mainActivity: MainActivity)
应用模块
@ExperimentalCoroutinesApi
@FlowPreview
@Module
object AppModule {
@JvmStatic
@Provides
@Singleton
fun provideAppContext(application: BaseApplication): BaseApplication{
return application
}
查看模型模块
@ExperimentalCoroutinesApi
@FlowPreview
@Module
object MainViewModelModule {
@Singleton
@JvmStatic
@Provides
fun provideMainViewModelFactory(
application: BaseApplication,
editor: SharedPreferences.Editor,
sharedPreferences: SharedPreferences
): ViewModelProvider.Factory{
return MainViewModelFactory(
application = application,
editor = editor,
sharedPreferences = sharedPreferences
)
}
查看模型工厂
@FlowPreview
@ExperimentalCoroutinesApi
@Singleton
class MainViewModelFactory
@Inject
constructor(
private val application: BaseApplication,
private val editor: SharedPreferences.Editor,
private val sharedPreferences: SharedPreferences
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return when(modelClass){
ViewModelUsers::class.java -> {
ViewModelUsers(
application = application,
editor = editor,
sharedPreferences = sharedPreferences
) as T
}
查看模型
@ExperimentalCoroutinesApi
@FlowPreview
@Singleton
class ViewModelUsers
@Inject
constructor(
application: BaseApplication,
private val editor: SharedPreferences.Editor,
sharedPreferences: SharedPreferences
): ViewModel() {
private var repoUsers = RepoUsers(application)
修复它的方法有很多,但简单的方法是您应该更改为 BaseApplication
并删除 AppModule
class 因为它已经由 @BindsInstance
注释提供
@Component(
modules = [
MainViewModelModule::class,
MainFragmentFactoryModule::class
]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: BaseApplication): Builder
fun build(): AppComponent
}
fun inject(mainActivity: MainActivity)
将存储库注入视图模型解决了这个问题,而不是尝试通过链传递应用程序上下文。
我设置了 dagger 来管理片段和视图模型。我需要将应用程序上下文传递到我的视图模型,以便实例化并与存储库 class 通信。当我尝试这样做时,我从 dagger 中收到一条错误消息:
error: [Dagger/DependencyCycle] Found a dependency cycle:
public abstract interface AppComponent {
^
com.example.framework.BaseApplication is injected at
com.example.di.AppModule.provideAppContext(application)
com.example.framework.BaseApplication is injected at
com.example.di.MainViewModelModule.provideMainViewModelFactory(application, �)
androidx.lifecycle.ViewModelProvider.Factory is injected at
com.example.framework.presentation.common.MainFragmentFactory(viewModelFactory)
com.example.framework.presentation.common.MainFragmentFactory is injected at
com.example.framework.presentation.main.MainActivity.fragmentFactory
com.example.framework.presentation.main.MainActivity is injected at
我是 dagger 的新手,所以我很难确定此问题的根本原因以及如何实施修复。对这个问题中的代码量表示歉意,但匕首有许多 classes 可能是问题所在。
应用组件
@Component(
modules = [
AppModule::class,
MainViewModelModule::class,
MainFragmentFactoryModule::class
]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(mainActivity: MainActivity)
应用模块
@ExperimentalCoroutinesApi
@FlowPreview
@Module
object AppModule {
@JvmStatic
@Provides
@Singleton
fun provideAppContext(application: BaseApplication): BaseApplication{
return application
}
查看模型模块
@ExperimentalCoroutinesApi
@FlowPreview
@Module
object MainViewModelModule {
@Singleton
@JvmStatic
@Provides
fun provideMainViewModelFactory(
application: BaseApplication,
editor: SharedPreferences.Editor,
sharedPreferences: SharedPreferences
): ViewModelProvider.Factory{
return MainViewModelFactory(
application = application,
editor = editor,
sharedPreferences = sharedPreferences
)
}
查看模型工厂
@FlowPreview
@ExperimentalCoroutinesApi
@Singleton
class MainViewModelFactory
@Inject
constructor(
private val application: BaseApplication,
private val editor: SharedPreferences.Editor,
private val sharedPreferences: SharedPreferences
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return when(modelClass){
ViewModelUsers::class.java -> {
ViewModelUsers(
application = application,
editor = editor,
sharedPreferences = sharedPreferences
) as T
}
查看模型
@ExperimentalCoroutinesApi
@FlowPreview
@Singleton
class ViewModelUsers
@Inject
constructor(
application: BaseApplication,
private val editor: SharedPreferences.Editor,
sharedPreferences: SharedPreferences
): ViewModel() {
private var repoUsers = RepoUsers(application)
修复它的方法有很多,但简单的方法是您应该更改为 BaseApplication
并删除 AppModule
class 因为它已经由 @BindsInstance
注释提供
@Component(
modules = [
MainViewModelModule::class,
MainFragmentFactoryModule::class
]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: BaseApplication): Builder
fun build(): AppComponent
}
fun inject(mainActivity: MainActivity)
将存储库注入视图模型解决了这个问题,而不是尝试通过链传递应用程序上下文。