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

Dagger 2错误:依赖项“没有@Inject构造函数无法提供”

吕鹏
2023-03-14

我正试图在我的Android项目中使用Dagger2。首先,我想使用两个组件分别负责注入应用程序范围和活动范围的依赖关系。作为一个基本的参考,我使用了这个答案。

因此,有两种不同的方法来设置组件之间的关系:使用@子组件注释和使用依赖项参数

  1. 如果使用第一个组件,我的AppContextComponent工作正常。但是,当我尝试从ActivityContextComponent注入依赖项时,就会出现以下构建时错误:

错误:com。实例用户界面。活动如果没有@Inject构造函数或@Provides-或@products注释方法,则无法提供MainActivity。

知道我有提供方法,这个错误消息毫无用处。以下是我设法用谷歌搜索出的这一错误的几个其他可能来源,但情况似乎并非如此:

  1. 范围问题。
  2. 由于不同的提供方法具有相同的返回类型(即使我删除了提供Context的方法,问题仍然存在)。

下面的代码是静态编程语言,但我认为它应该很简单。

应用程序组件

object AppContext {
    // a singleton used in place of a Java static field
    @JvmStatic lateinit var graph: AppContextComponent
}

@ApplicationScope @Component(modules = arrayOf(AppContextModule::class))
interface AppContextComponent {
    fun inject(fragment: BaseFragment)

    fun newActivityContextComponent(module: ActivityContextModule): ActivityContextComponent
}

@Module
class AppContextModule(val app: MyApplication) {
    @Provides @ApplicationScope @ForApplication
    fun provideContext(): Context {
        return app;
    }

    @Provides @ApplicationScope
    fun provideMyApplicationContext(): MyApplication {
        return app;
    }
}

活动组件

object ActivityContext {
    @JvmStatic lateinit var graph: ActivityContextComponent
}

@ActivityScope @Subcomponent(modules = arrayOf(ActivityContextModule::class))
interface ActivityContextComponent {
    fun inject(fragment: BaseFragment)
}

@Module
class ActivityContextModule(val activity: MainActivity) {

    // Worth pointing out is that the provision methods are not used. 
    // That is, no code is being generated for them.

    @Provides @ActivityScope @ForActivity
    fun provideContext(): Context {
        return activity;
    }

    @Provides @ActivityScope
    fun provideMainActivityContext(): MainActivity {
        return activity;
    }
}

下面是这些组件的使用方法。

应用

class MyApplication : SugarApp() {
    override fun onCreate() {
        super.onCreate()
        AppContext.graph =
            DaggerAppContextComponent
                    .builder()
                    .appContextModule(AppContextModule(this))
                    .build()
    }
}

活动

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ActivityContext.graph = 
            AppContext.graph
                 .newActivityContextComponent(ActivityContextModule(this))
    }
}

基本片段(实际注射发生的地方)

abstract class BaseFragment : Fragment() {
    // works fine
    @Inject @ForApplication lateinit var myApplication: MyApplication

    // fails with "cannot be provided" error
    @Inject @ForActivity lateinit var myActivity: MainActivity

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ActivityContext.graph.inject(this)
    }
}

我错过了什么?

谢谢

共有1个答案

冯淳
2023-03-14

编辑

要点是:

如果您使用dagger的@Sub组件s,请确保父@Component中没有注入与子组件相同的目标类的方法。

Dagger会感到困惑,并且会尝试生成代码来直接从父组件注入目标,而它没有所需的模块来满足注入的依赖。

 类似资料:
  • //模块 //组件 `//预登录Presenter //预物流活动` //在一次创建中 //错误日志 错误:(18,53)错误:找不到符号类DaggerPresentComponent错误:(19,53)错误:找不到符号类DaggerUserLoginComponent错误:(19,10)错误:gorick.gradesprojectandroid.MVP. Presenter. Presente

  • 问题内容: 我正在尝试在我的项目中实现dagger2,但遇到错误“ android.app.Application必须在没有@Inject构造函数或@Provides注释方法的情况下才能提供 ”。 这是我的代码: App.java di / AppModule.java di / AppComponent.java di / TestClassModule.java di / TestClassC

  • 我有很多Android ViewModel类,它们往往有很多依赖项(大多数是Room中的DAO,每个SQLite表一个)。有些依赖项超过10个。 这很好,但Inject构造函数充满了参数,并且只包含样板代码,用于从构造函数参数设置注入的成员。 我想切换到“常规”注入成员,使用注释单独标识,就像其他(哑)类一样。 这对于与Android相关的类(尽管ViewModel被宣传为非Android依赖,例

  • 第二个模块如下所示--它为屏幕上的UI子集提供演示者/控制器及其依赖关系: 第三个模块-用于UI子集的另一个演示器/控制器: 正在注入的片段的相关部分: 提前谢谢!

  • 我已经开始使用匕首2,并面临着奇怪的问题,看起来像一个错误给我。 我有3个模块,组成一个子组件,这反过来又扩展/加了更高级别的组件。 子组件非常简单:只需组合模块和单个注入点: 第一个模块看起来像这样-它提供了一般的片段级依赖关系: 第二个模块如下所示-它为屏幕上的UI子集提供演示者/控制器及其依赖项: 第三个模块-UI子集的另一个演示者/控制器: 正在注射的片段的相关部分: 实现以下构造函数:

  • 所以我正在尝试将我的整个应用程序从匕首迁移到刀柄,显然我无法注入活动和碎片。 我的活动: 我的片段: 我的应用程序类: 像这样注入我的活动: 它抛出了这个错误: 项目级成绩: 应用级 Gradle(所有 3 个模块): 会不会是我的活动和片段扩展了不能用@ AndroidEntryPoint注释的基,因为它们有类型参数??救命啊! 同样在 dagger2 中,我使用了如下接口: 它的工作,但柄据说