无法提供带有匕首2的活动上下文

问题描述 投票:0回答:3

我是Dagger 2的新手,我试图为课程提供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();
    }
}

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

正确的方法是什么?

java android dagger
3个回答
0
投票
@Module
class MainActivityModule(mActivity: MainActivity) {

    var mActivity: MainActivity


    init {
        this.mActivity= mActivity
    }


    @Singleton
    @Provides
    fun getMainActivity(): MainActivity{
        return mActivity
    }


}

现在将此模块添加到您的Component类中,并在使用组件构建器时将您的活动传递给模块构造函数,希望对您有所帮助。


0
投票

@@ Named注释有助于我们区分上下文。通过添加如下所示的@Named批注,我们可以区分ActivityModule和ContextModule中的方法context():

@Module
public class ActivityModule {
    private final Context context;

    ActivityModule(Activity context){
        this.context = context;
    }

    @Named("activity_context")
    @Provides
    public Context context(){ return context; }
}

@Module
public class ContextModule {
    private final Context context;

    ActivityModule(Activity context){
        this.context = context;
    }

    @Named("application_context")
    @Provides
    public Context context(){ return context.getApplicationContext(); }

然后,我们告诉Dagger使用各自的上下文,如下所示:

@Module(includes = ContextModule.class)
public class OkHttpClientModule {
    ....
    @Provides
    public File file(@Named("application_context") Context context){
    File file = new File(context.getCacheDir(), "HttpCache");
    file.mkdirs();
    return file;
    }
    ....
}

希望这会有所帮助。


0
投票

您可以使用ActivityApplication,以与当前绑定@Component.Builder实例相同的方式绑定@Component.Builder实例。

示例实现看起来像这样:

@Component.Factory
@Component.Factory
@Subcomponent(...)
interface ActivitySubcomponent {

    @Subcomponent.Factory
    interface Factory {
        ActivitySubcomponent create(@BindsInstance MyActivity activity)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.