匕首 2.10/2.11 注入活动失败



我一直试图在类ViewUtils中注入活动,但没有成功。我关注了几个不同的帖子,但我似乎无法理解我在实现中缺少什么。

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

  • dagger 2.10 安卓子组件和构建器
  • 如何在 dagger 2.10 中创建自定义作用域模块
  • https://google.github.io/dagger/subcomponents.html

我的实现如下:

应用组件

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

活动绑定模块

@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);
}

如dagger安卓文档中所述:

专业提示:如果您的子组件及其生成器除了步骤 #2 中提到的方法或超类型之外没有其他方法或超类型,则可以使用@ContributesAndroidInjector为您生成它们。代替步骤 2 和 3,添加一个返回活动的抽象模块方法,用@ContributesAndroidInjector对其进行批注,并指定要安装到子组件中的模块。如果子组件需要作用域,则还将作用域注释应用于该方法。

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


@Module
public abstract class ActivityBindingModule {
@ActivityScope
@ContributesAndroidInjector(modules = LoginActivityModule.class)
abstract LoginActivity loginActivity();
}

登录活动模块.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);
}
}

最新更新