gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:33 24 4
gpt4 key购买 nike

我一直在尝试将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com