android - Dagger 2.10/2.11 注入(inject) Activity 失败

标签 android dependency-injection dagger-2 dagger

我一直在尝试将 Activity 注入(inject)到 ViewUtils 类中,但没有成功。我关注了几篇不同的帖子,但我似乎无法理解我在实现过程中遗漏了什么。

我知道这可能是下面帖子的重复,对此我深表歉意,但老实说,我看不出我错过了什么。这些是我找到的帖子:

我的实现如下:

应用组件

@Component(modules = {
        AppModule.class, AndroidSupportInjectionModule.class, ActivityBindingModule.class
}) @Singleton public interface AppComponent extends AndroidInjector<EmblyApp> {

    @Component.Builder abstract class Builder extends AndroidInjector.Builder<EmblyApp> {}
}

ActivityBindingModule

@Module public abstract class ActivityBindingModule {

    @ContributesAndroidInjector
    abstract LoginActivity loginActivity();
}

登录子组件

@Subcomponent(modules = LoginSubcomponent.LoginActivityModule.class)
public interface LoginSubcomponent extends AndroidInjector<LoginActivity> {

    @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<LoginActivity> {}

    @Module abstract class LoginActivityModule {

        @Binds abstract Activity bindActivity(LoginActivity activity);

        @Provides @ActivityScope static ViewUtils viewUtils(Activity activity) {
            return new ViewUtils(activity);
        }
    }
}

ViewUtils

public class ViewUtils {

    private final Activity activity;

    @Inject public ViewUtils(Activity activity) {
        this.activity = activity;
    }
}

我得到的错误是:

Error:(14, 22) error: [dagger.android.AndroidInjector.inject(T)] android.app.Activity cannot be provided without an @Inject constructor or from an @Provides-annotated method.
android.app.Activity is injected at
com.emblyapp.app.ui.helpers.ViewUtils.<init>(activity)
com.emblyapp.app.ui.helpers.ViewUtils is injected at
com.emblyapp.app.ui.authentication.login.LoginActivity.viewUtils
com.emblyapp.app.ui.authentication.login.LoginActivity is injected at
dagger.android.AndroidInjector.inject(arg0)

这里有什么问题?感谢您的帮助!

编辑:我忘了说我的 LoginActivity 有 AndroidInjection 注入(inject)

@Override protected void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
    }

最佳答案

dagger android documentation 中所述:

Pro-tip: If your subcomponent and its builder have no other methods or supertypes than the ones mentioned in step #2, you can use @ContributesAndroidInjector to generate them for you. Instead of steps 2 and 3, add an abstract module method that returns your activity, annotate it with @ContributesAndroidInjector, and specify the modules you want to install into the subcomponent. If the subcomponent needs scopes, apply the scope annotations to the method as well.

因此,我们可以摆脱 LoginSubcomponent 并在 ActivityBindingModule 中执行以下更改:



    @Module
    public abstract class ActivityBindingModule {

        @ActivityScope
        @ContributesAndroidInjector(modules = LoginActivityModule.class)
        abstract LoginActivity loginActivity();
    }


LoginActivityModule.java



    @Module
    abstract class LoginActivityModule {

        @Binds
        abstract Activity bindActivity(LoginActivity activity);

        @Provides
        @ActivityScope
        static ViewUtils viewUtils(Activity activity) {
            return new ViewUtils(activity);
        }
    }


您的自定义应用程序类:



    public class MyApp extends DaggerApplication {

        @Inject
        DispatchingAndroidInjector dispatchingActivityInjector;

        @Override
        protected AndroidInjector applicationInjector() {
            return DaggerAppComponent.builder().create(this);
        }

    }


关于android - Dagger 2.10/2.11 注入(inject) Activity 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43865570/

相关文章:

android - Google Play 结算(测试模式): why my purchase is automatically canceled

android - 如何使用 cmake 和 Android NDK 在 C++ 中加载线程支持

java - Spring Boot 具有更多上下文

c# - 将依赖注入(inject)添加到 MVVM 应用程序

android - 为什么 ViewModelScoped 协程在调用 ViewModel onCleared() 方法后无法使用

java - Dagger 2 : inject an interface in a constructor

android - 如何在抽屉导航中的标题中添加图标?

Android应用程序设计: Right split between activities,服务和线程?

angular - 使用 ReflectiveInjector 注入(inject)服务,无需指定依赖树中的所有类

dependency-injection - Dagger2 注解处理器是否支持 Eclipse 增量编译器?