Dagger 2.10/2.11注射活动失败

Ped*_*dro 7 android dependency-injection dagger dagger-2

我一直试图在ViewUtils类中注入Activity,但没有成功.我已经关注了几个不同的帖子,但我似乎无法理解我在实现中缺少的内容.

我知道这可能是下面帖子的重复,我真的为此道歉但老实说我看不出我错过了什么.这些是我发现的帖子:

我的实现如下:

AppComponent

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

    @Component.Builder abstract class Builder extends AndroidInjector.Builder<EmblyApp> {}
}
Run Code Online (Sandbox Code Playgroud)

ActivityBindingModule

@Module public abstract class ActivityBindingModule {

    @ContributesAndroidInjector
    abstract LoginActivity loginActivity();
}
Run Code Online (Sandbox Code Playgroud)

LoginSubcomponent

@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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ViewUtils

public class ViewUtils {

    private final Activity activity;

    @Inject public ViewUtils(Activity activity) {
        this.activity = activity;
    }
}
Run Code Online (Sandbox Code Playgroud)

而我得到的错误是:

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)
Run Code Online (Sandbox Code Playgroud)

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

编辑:我忘了提到我的LoginActivity注入了AndroidInjection

@Override protected void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
    }
Run Code Online (Sandbox Code Playgroud)

azi*_*ian 10

正如dagger android文档中指定的那样:

专业提示:如果您的子组件及其构建器没有其他方法或超类型,而不是步骤#2中提到的方法或超类型,您可以使用@ContributesAndroidInjector为您生成它们.而不是第2步和第3步,添加一个返回活动的抽象模块方法,使用@ContributesAndroidInjector对其进行注释,并指定要安装到子组件中的模块.如果子组件需要范围,则还要将范围注释应用于该方法.

因此,我们可以摆脱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);
        }

    }