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

匕首2错误:依赖项“不能在没有@Inject构造函数的情况下提供”,而它实际上是用@Inject注释的

汪翰墨
2023-03-14

我已经开始使用匕首2,并面临着奇怪的问题,看起来像一个错误给我。

我有3个模块,组成一个子组件,这反过来又扩展/加了更高级别的组件。

子组件非常简单:只需组合模块和单个注入点:

@Singleton
@Subcomponent(
        modules = {
                NavigationDrawerModule.class,
                NavigationListModule.class,
                SwitcherModule.class
        }
)
public interface NavigationDrawerComponent {


    NavigationDrawerFragment inject(NavigationDrawerFragment object);

}

第一个模块看起来像这样-它提供了一般的片段级依赖关系:

@Module
public class NavigationDrawerModule {

    private final Activity activity;
    private final View rootView;
    private final LoaderManager loaderManager;

    public NavigationDrawerModule(Activity activity, View rootView, LoaderManager loaderManager) {
        this.activity = activity;
        this.rootView = rootView;
        this.loaderManager = loaderManager;
    }

    @Provides @Singleton EventBus provideLocalBus() {
        return EventBus.builder().build();
    }

    @Provides @Singleton View provideViewRoot() {
        return rootView;
    }

    @Provides @Singleton LoaderManager provideLoaderManager() {
        return loaderManager;
    }

    @Provides @Singleton Context provideContext() {
        return activity;
    }
}

第二个模块如下所示-它为屏幕上的UI子集提供演示者/控制器及其依赖项:

@Module
public class SwitcherModule {

    @Provides SwitchController provideSwitcherController(SwitchControllerImpl impl) {
        return impl;
    }

    @Provides SwitcherView provideSwitcherView(SwitcherViewImpl impl) {
        return impl;
    }

}

第三个模块-UI子集的另一个演示者/控制器:

@Module
public class NavigationListModule {

    @Provides @Singleton NavigationListController provideNavigationListController(NavigationListControllerImpl impl) {
        return impl;
    }

    @Provides @Singleton NavigationListView provideNavigationListView(NavigationListViewImpl impl) {
        return impl;
    }
}

正在注射的片段的相关部分:

@Inject SwitchController identitySwitchController;
@Inject SwitcherView identitySwitcherView;
@Inject NavigationListController navigationListController;
@Inject NavigationListView navigationListView;

NavigationListControlllerImpl实现以下构造函数:

@Inject
public NavigationListControllerImpl(Context ctx, EventBus bus) {
    this.ctx = ctx;
    this.bus = bus;
}

我从Dagger 2编译器得到的错误如下:

error: ...sidenavigation.navigationlist.NavigationListControllerImpl cannot be provided without an @Inject constructor or from an @Provides-annotated method.
...sidenavigation.NavigationDrawerFragment.navigationListController
[injected field of type: ...sidenavigation.navigationlist.NavigationListController navigationListController]
...sidenavigation.navigationlist.NavigationListModule.provideNavigationListController(...sidenavigation.navigationlist.NavigationListControllerImpl impl)
[parameter: ...sidenavigation.navigationlist.NavigationListControllerImpl impl]

错误抱怨缺少@Inject注释构造函数,但它存在!如果我将隐式NavigationListControllerImpl实例创建(通过@传递-方法参数)替换为显式(使用new),dagger开始抱怨相同的错误,但现在是同一模块中的第二个条目presenter对象,依此类推。

所有这些情况看起来都很奇怪,我想听听更有经验的Dagger 2用户(和开发人员?)的一些意见。

提前谢谢你!


共有1个答案

万英武
2023-03-14

我得到了同样的错误,因为我忘记了将父组件中的模块提供的对象公开给依赖它的其他组件。

父组件示例:

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
    AppPref exposeAppPref(); /* my issue was caused by forgot this line,
the method name doesn't matter, what matters is the object type AppPref provided in the AppModule 
that you want it to be available in the component that declares this component as one of its dependencies*/
}

使上述组件成为依赖项的示例组件

@UserScope
@Component (dependencies = {AppComponent.class})
public interface ActivityComponent {
    void inject(MainActivity activity);
}

更新:

应用模块:

...
    @Provides
    @Singleton
    AppPref provideAppPref() {
        return appPref;
    }
...
 类似资料:
  • 第二个模块如下所示--它为屏幕上的UI子集提供演示者/控制器及其依赖关系: 第三个模块-用于UI子集的另一个演示器/控制器: 正在注入的片段的相关部分: 提前谢谢!

  • 我正试图在我的Android项目中使用Dagger2。首先,我想使用两个组件分别负责注入应用程序范围和活动范围的依赖关系。作为一个基本的参考,我使用了这个答案。 因此,有两种不同的方法来设置组件之间的关系:使用注释和使用参数。 如果使用第一个组件,我的工作正常。但是,当我尝试从注入依赖项时,就会出现以下构建时错误: 错误:com。实例用户界面。活动如果没有@Inject构造函数或@Provides

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

  • 我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。 下面是一个示例类: 在模块类中: DepB类别: 据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。 但是呢?我们如何能够在不指定任何位置的情况下注入DepB?

  • //模块 //组件 `//预登录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