我在向需要此对象的依赖项提供Activity
对象时遇到问题。
我对Dagger 2.13有一个非常标准的设置,如下所示:
AppComponent.java
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
ActivityModule.class
})
public interface AppComponent extends AndroidInjector<Appname> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Appname appname);
AppComponent build();
}
void inject(Appname appname);
}
ActivityModule.java
@Module
abstract public class ActivityModule {
@ContributesAndroidInjector(modules = {MainActivityModule.class, MainActivityFragmentsModule.class})
abstract MainActivity contributeMainActivity();
}
MainActivityModule.java
@Module
public class MainActivityModule {
@Provides
@Singleton
static Billing provideBilling(Context context) {
return new Billing(context);
}
@Provides
@Singleton
static ActivityCheckout provideActivityCheckout(MainActivity activity, Billing billing) {
return ActivityCheckout.forActivity(activity, billing);
}
}
MainActivityFragmentsModule.java
@Module
abstract public class MainActivityFragmentsModule {
@ContributesAndroidInjector
abstract WelcomeFragment contributeWelcomeFragment();
}
当我试图在WelcomeFragment
中使用ActivityCheckout
时,我得到了无法提供此依赖项的错误:
Error:(20, 8) error: [dagger.android.AndroidInjector.inject(T)] org.solovyev.android.checkout.ActivityCheckout cannot be provided without an @Inject constructor or from an @Provides-annotated method.
似乎没有提供活动,但我不知道为什么。我正在尝试遵循其中一个教程,其中的设置是相同的,并且可以注入Activity
对象。
我使用的是DaggerApplication
、DaggerAppCompatActivity
和DaggerFragment
。
发布于 2018-06-21 03:48:05
虽然我不确定它如何/为什么会显示您显示的错误,但您在@Singleton作用域下错误注册了活动范围的内容。请注意,您发布的错误消息抱怨没有提供ActivityCheckout;如果不能提供您的活动,您很可能会发现一条关于缺少MainActivity的错误消息。
我的直觉是您的编译中有多个错误,但您只发布了最后一个错误,并且之前的错误表明您不能将@Singleton绑定安装到@ContributesAndroidInjector默认创建的未限定作用域的子组件中。因此,Dagger忽略了@Provides方法,您会得到错误。
@Provides
@Singleton // BAD: If this is Singleton, it will outlive and leak MainActivity.
// Dagger will complain about mismatched scopes, but it's right:
// It doesn't make sense for ActivityCheckout to be @Singleton.
static ActivityCheckout provideActivityCheckout(
MainActivity activity, Billing billing) {
return ActivityCheckout.forActivity(activity, billing);
}
相反,创建一个特定于活动的作用域,这表明每个活动都有自己的作用域。
@Retention(RetentionPolicy.RUNTIME) // Not used at runtime, but JSR-330
@Scope // requires that @Scopes are kept at RUNTIME.
public @interface ActivityScope {} // PerActivity is also a good name.
现在用它标记您的@ContributesAndroidInjector,这样您生成的子组件就可以使用该作用域:
@ContributesAndroidInjector(
modules = {MainActivityModule.class, MainActivityFragmentsModule.class})
@ActivityScope
abstract MainActivity contributeMainActivity();
以及您的绑定,因此它们与您的activity组件的生命周期相匹配:
@Module public class MainActivityModule {
// I'm assuming this is actually activity scoped, but if it's truly singleton,
// leave it @Singleton and move it to AppModule.
@Provides
@ActivityScope
static Billing provideBilling(Context context) {
return new Billing(context);
}
@Provides
@ActivityScope
static ActivityCheckout provideActivityCheckout(
MainActivity activity, Billing billing) {
return ActivityCheckout.forActivity(activity, billing);
}
}
https://stackoverflow.com/questions/50941219
复制相似问题