为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用 Dagger 2 提供活动上下文

无法使用 Dagger 2 提供活动上下文

慕姐8265434 2023-10-19 21:20:30
解决了我是 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();    }}除了我的每个活动都有一个模块,但我没有找到为 AppComponent 或从 ActivityModule 注入活动上下文的方法。这样做的正确方法是什么?
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您可以Activity按照当前绑定 实例的相同方式绑定 的实例Application,即使用 an@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)

    }

}


查看完整回答
反对 回复 2023-10-19
?
当年话下

TA贡献1890条经验 获得超9个赞

@Module

class MainActivityModule(mActivity: MainActivity) {


    var mActivity: MainActivity



    init {

        this.mActivity= mActivity

    }



    @Singleton

    @Provides

    fun getMainActivity(): MainActivity{

        return mActivity

    }



}

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


查看完整回答
反对 回复 2023-10-19
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

我们可以通过添加 @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 使用各自的 Context,如下所示:


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

    }

    ....

}

希望这可以帮助。


查看完整回答
反对 回复 2023-10-19
  • 3 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信