java - 无法使用 Dagger 2 提供 Activity Context

标签 java android dagger

已解决

我是 Dagger 2 的新手,我正在尝试为类提供 Activity Context 但没有成功。我搜索了很多但没有找到任何合适的答案。

我可以提供应用程序上下文。但我也需要提供 Activity Context,但我不知道有什么好方法可以实现它。

我需要澄清一下,我正在使用 Dagger 作为 Android 依赖项。

def dagger_version = "2.24"
implementation "com.google.dagger:dagger:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"

我也只有一个具有以下代码的 AppComponent:

@Singleton
@Component(
        modules = {
                AndroidSupportInjectionModule.class,
                ActivityBuildersModule.class,
                AppModule.class,
                ViewModelFactoryModule.class,
        }
)
public interface AppComponent extends AndroidInjector<BaseApplication> {

    SessionManager sessionManager();

    @Component.Builder
    interface Builder{

        @BindsInstance
        Builder application(Application application);

        AppComponent build();
    }
}

除了我的每个 Activity 都有一个模块,但我没有找到为 AppComponent 或从 ActivityModule 注入(inject) Activity 上下文的方法。

正确的做法是什么?

更新

我终于找到了正确的方法。

首先我为我想提供的类创建了一个模块

@Module
public class AlertsModule {

    @Provides
    static Alerts provideAlerts(Activity activity){
        return new Alerts(activity);
    }

}

然后我转到我想要注入(inject)该自定义类的 ActivityModules 并执行类似的绑定(bind)

@Module
public abstract class MainActivityModule {

    ...

    @Binds
    abstract Activity providesActivity(MainActivity activity);

    ...

}

最后,我将 CustomClassModule 包含在我的 ActivityBuildersModule 中,我在其中使用 @ContributesAndroidInjector 来提供我的 Activity 。

    @MainScope
    @ContributesAndroidInjector(
            modules = {
                    AlertsModule.class,
            }
    )
    abstract MainActivity contributeMainActivity();

最佳答案

您可以使用与当前绑定(bind) Application 实例相同的方式绑定(bind) Activity 实例,方法是使用 @Component.Builder@Component.Factory .

一个示例实现看起来像这样:

@Subcomponent(...)
interface ActivitySubcomponent {

    @Subcomponent.Factory
    interface Factory {
        ActivitySubcomponent create(@BindsInstance MyActivity activity)
    }
}
@Module(subcomponents = [ActivitySubcomponent.class])
class ApplicationModule {
    ....
}
public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        ((MyApplication) getApplication())
            .applicationComponent
            .activitySubcomponentFactory()
            .create(this)
            .inject(this)
    }
}

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

相关文章:

dependency-injection - Dagger 字段注入(inject)和入口点

java - 钻石运营商;初始化参数化泛型类

java - 将字符串数组转换为 JSON 对象?

java - 在 android 嵌套的 PreferenceScreen 上显示向上/后退按钮?

java - 为什么我的画从 Canvas 上消失了?

java - 使用 Dagger 进行嵌套/递归注入(inject)

java - 在 Ubuntu 中构建 APK react native 应用程序的问题

java - 从另一个 java 程序运行 java 程序

android - ADB 没有响应,IntelliJ IDE。 [乌类图13.04]

android - 从 Fragment 调用 Hilt-Dagger ViewModel