【问题标题】:How can I provide activity context with Dagger dependecies?如何为 Dagger 依赖项提供活动上下文?
【发布时间】:2018-03-21 16:44:00
【问题描述】:

如何在 mainModule 类中提供活动上下文?谢谢! 代码如下所示:

    @Singleton
@Component(modules = {AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class})
public interface AppComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);

        AppComponent build();

    }

    void inject(MvmApp app);
}

活动构建器:

@Module
public abstract class ActivityBuilder {

    @ContributesAndroidInjector(modules = {MainModule.class})
    abstract MainActivity bindMainActivity();
}

我有一个 appModule,每个活动都有一个模块:

@Module
public class AppModule {

    @Provides
    @Singleton
    @ApplicationContext
    Context provideContext(Application application) {
        return application;
    }

    @Provides
    @Singleton
    DataManager provideDataManager(AppDataManager appDataManager) {
        return appDataManager;
    }

    @Provides
    @DatabaseInfo
    String provideDatabaseName() {
        return "carDatabase";
    }

    @Provides
    @Singleton
    AppDataBase provideAppDatabase(@DatabaseInfo String dbName, @ApplicationContext Context context) {
        return Room.databaseBuilder(context, AppDataBase.class, dbName)
                .build();
    }

    @Provides
    @Singleton
    DbHelper provideDbHelper(AppDbHelper appDbHelper) {
        return appDbHelper;
    }
}

应用类:

public class MvmApp extends Application implements HasActivityInjector {

    @Inject
    DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;

    @Override
    public void onCreate() {
        super.onCreate();

        DaggerAppComponent.builder()
                .application(this)
                .build()
                .inject(this);

    }

    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
        return activityDispatchingAndroidInjector;
    }
}

我的所有活动都扩展了注入 Dagger 依赖项的基本活动。

public abstract class BaseActivity extends AppCompatActivity implements MvpView {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AndroidInjection.inject(this);

    }
}

在 mainModule 中,我需要提供活动的上下文。

@Module
public class MainModule {

    @Provides
    MainMvpPresenter<MainMvpView> provideMainPresenter(
            MainPresenter<MainMvpView> presenter) {
        return presenter;
    }



    @Provides
    CompositeDisposable provideCompositeDisposable() {
        return new CompositeDisposable();
    }

    @Provides
    CarAdapter provideCarAdapter( @ActivityContext Context context) {
        return new CarAdapter(context);
    }

}

【问题讨论】:

  • 你不需要在每个Activity中注入依赖。只需让您的 BaseActivity 扩展 DaggerAppCompatActivity

标签: android dependency-injection dependencies dagger-2


【解决方案1】:

解决办法是:

@Module
public class MainModule {

    @Provides
    MainMvpPresenter<MainMvpView> provideMainPresenter(
            MainPresenter<MainMvpView> presenter) {
        return presenter;
    }

    @Provides
    CompositeDisposable provideCompositeDisposable() {
        return new CompositeDisposable();
    }

    @Provides
    CarAdapter provideCarAdapter(MainActivity activity) {
        return new CarAdapter(activity);
    }

}

【讨论】:

  • 所以你必须为每个活动创建一个模块?
  • @L.Dan:如何在多个服务中提供活动实例?
【解决方案2】:

对于面临类似问题的人,我使用 Kotlin 和新的 android-dagger 扩展做了一个项目,并在此处详细解释了事情的运作方式:https://github.com/Obaied/BareBonesAndroidDagger

【讨论】:

  • 如果您仔细阅读问题@L.Dan 想要使用来自 ActivityModule 而不是 Activity 本身的上下文。要在不同的 Activity 中使用一个模块,也许我们只需要使用 Context 而不是具体的 Activity。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多