gpt4 book ai didi

java - 使用 ContributesAndroidInjector 提供 Activity

转载 作者:行者123 更新时间:2023-12-01 19:52:22 26 4
gpt4 key购买 nike

我在向需要此对象的依赖项提供 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 时,出现无法提供此依赖项的错误:

错误:(20, 8) 错误:[dagger.android.AndroidInjector.inject(T)] org.solovyev.android.checkout.ActivityCheckout 无法在没有 @Inject 构造函数或 @Provides 的情况下提供-带注释的方法。

好像没有提供该 Activity ,但我不知道为什么。我试图遵循其中一个教程,该教程具有相同的设置,并且可以注入(inject) Activity 对象。

我正在使用 DaggerApplicationDaggerAppCompatActivityDaggerFragment

最佳答案

虽然我不确定它如何/为什么会显示您所显示的错误,但您在 @Singleton 范围下错误注册了 Activity 范围的事物。请注意,您发布的错误消息提示未提供 ActivityCheckout;如果无法提供您的 Activity,您可能会看到一条有关缺少 MainActivity 的错误消息。

我的预感是,您的编译中存在多个错误,但您只发布了最后一个错误,并且早期的错误表明您无法将 @Singleton 绑定(bind)安装到 @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);
}

相反,创建一个特定于 Activity 的范围,这表明每个 Activity 都有自己的范围。

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

还有您的绑定(bind),因此它们与您的 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);
}
}

关于java - 使用 ContributesAndroidInjector 提供 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50941219/

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