【问题标题】:Dagger 2.10/2.11 injecting Activity failingDagger 2.10/2.11 注入活动失败
【发布时间】:2017-10-07 12:20:15
【问题描述】:

我一直在尝试将 Activity 注入到 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 进行了注入

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

【问题讨论】:

    标签: android dependency-injection dagger-2 dagger


    【解决方案1】:

    dagger android documentation中指定:

    专业提示:如果您的 subcomponent 及其 builder 除了步骤 #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); } }

    【讨论】:

    • 是的!谢谢你。我没有很好地理解文档的那一部分在说什么,这导致了我的困惑。我现在明白了。 ContributesAndroidInjector 允许我跳过子组件(由它创建)。我明白了!感谢您的帮助,它现在正在工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多