Dagger2:没有@Inject构造函数或@Provides注解的方法提供该对象。

3

我是使用Android Dagger2,但是遇到了以下错误:

我的Module类:

@Module
public class ApplicationModule {
    private final App mApp;

    public ApplicationModule(App app) {
        this.mApp = app;
    }

    @Provides
    @Singleton
    @ContextType("Application")
    App provideApplicationContext(){
        return mApp;
    }

    @Provides
    @Singleton
    P2PService provideP2PService(App context){
        return new P2PService(context);
    }
}

我的组件类:
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    @ContextType("Application")
    App getContext();

    P2PService p2pService();
}

编译后,错误信息:
Error:(21, 16) error: com.sen5.smartlifebox.App cannot be provided without an @Inject constructor or from an @Provides-annotated method.
com.sen5.smartlifebox.App is injected at
com.sen5.smartlifebox.di.module.ApplicationModule.provideP2PService(context)
com.sen5.smartlifebox.data.p2p.P2PService is provided at
com.sen5.smartlifebox.di.component.ApplicationComponent.p2pService()

非常感谢您的建议!

2
@ContextType("Application") 是什么? - Raghunandan
2个回答

1
Dagger告诉你它不知道如何在provideP2PService方法中提供App依赖项。你需要像下面这样在方法参数中添加@ContextType("Application")。
@Provides
@Singleton
P2PService provideP2PService(@ContextType("Application") App context) {
    return new P2PService(context);
}

1

说实话,我对你代码中的@ContextType("Application")感到非常困惑!

顺便提一下,按照以下方式更改你的代码就可以运行:

ApplicationModule.java:

@Module
public class ApplicationModule {
    private final App mApp;

    public ApplicationModule(App app) {
        this.mApp = app;
    }

    @Provides
    @Singleton
    App provideApplicationContext(){
        return mApp;
    }

    @Provides
    @Singleton
    P2PService provideP2PService(App context){
        return new P2PService(context);
    }
}

ApplicationComponent.java:

@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {

    void inject(MainActivity mainActivity);

}

这是如何使用此注入的方法:

App.java:

public class App extends Application {

    ApplicationComponent applicationComponent;

    public ApplicationComponent getApplicationComponent() {
        return applicationComponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        applicationComponent = DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(this)).build();
    }
}

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Inject
    P2PService p2PService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        App app = (App) getApplication();
        app.getApplicationComponent().inject(this);
    }
}

如果需要更多参考资料,您可以查看这个示例存储库,其中包含使用Dagger、MVP、RxJava和其他有用的库开发的Android应用程序:

http://github.com/mmirhoseini/fyber_mobile_offers

我希望它能帮到你 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接