Articles of dagger 2

Dagger 2:从多个子组件注入活动

本教程将演示如何使用Dagger 2的AndroidInjectionModule将依赖项注入活动 – 这是一个非常简单的示例。 我的用例有点复杂: App extends Application implements HasDispatchingActivityInjector , 使用ActivityModule初始化的ActivityModule 。 使用此活动,创建依赖关系DepOne , ActivityTwo具有依赖性DepTwo ,如果没有预先存在的DepOne ,则无法正确初始化。 我想出的解决方案是: 创建一个AppComponent作为应用程序的主要组件, 创建ComponentTwo作为AppComponent的子组件。 只要DepOne可用,就在运行时添加它,并在其中提供DepTwo , 在ComponentTwo注入ActivityTwo 。 但是,这需要ActivityModule ,它目前看起来像这样: @Module(subcomponents = { ActivityOneSubcomponent.class, ActivityTwoSubcomponent.class }) public abstract class ActivityModule { @Binds @IntoMap @ActivityKey(ActivityOne.class) abstract AndroidInjector.Factory bindLoginActivityInjectorFactory(ActivityOneSubcomponent.Builder builder); @Binds @IntoMap @ActivityKey(ActivityTwo.class) abstract AndroidInjector.Factory bindWorldActivityInjectorFactory(ActivityTwoSubcomponent.Builder builder); } 分为两个不同的模块,一个用于ActivityOne并与AppComponent绑定,另一个用于ActivityTwo (以及其他未来活动)与ComponentTwo绑定。 […]

使用Android中的单独组件配置使用Dagger 2进行测试

Dagger 2 文档建议使用ProductionComponent和TestComponent的interface为测试和生产提供不同的配置 ,如下所示: @Component(modules = { OAuthModule.class, // real auth FooServiceModule.class, // real backend OtherApplicationModule.class, /* … */ }) interface ProductionComponent { Server server(); } @Component(modules = { FakeAuthModule.class, // fake auth FakeFooServiceModule.class, // fake backend OtherApplicationModule.class, /* … */}) interface TestComponent extends ProductionComponent { FakeAuthManager fakeAuthManager(); FakeFooService fakeFooService(); } 假设我们有一个使用ProductionComponent的Android活动( MyApp ): public […]

在方向改变时处理匕首组件

假设这里已经说过,开发人员有责任保留组件实例以实现自己的范围逻辑(因为范围方法将为给定组件返回相同的实例)。 通过活动生命周期保持此组件引用的干净方法是什么? 示例:您正在实施MVP模式,因此您需要在Activity中使用Presenter。 此演示者可以执行网络操作来下载项目。 当设备旋转时,您的Activity将被销毁并重新创建,但您希望保持网络运行,并且只需返回预旋转演示者。 为提供Presenter的组件定义一个自定义PerActivity范围是解决方案,因此您必须通过此循环保持Component实例,以便在首次启动Activity时注入相同的Presenter实例。 我们怎么处理这个? 我想到了一种组件缓存(如HashMap?),它可以由生活在Application类中的Application Component提供。

匕首在单独的gradle模块中

我的’干净架构’Android应用程序中有3个gradle模块:’data’,’domain’和’presentation’。 “数据”和“呈现”都取决于“域名”,但不是彼此。 ‘presentation’保存Application类实现,’data’保存一些存储库单例的实现。 我想使用Dagger 2在Application中实例化存储库,但在这种情况下,我需要在’data’和’presentation’之间建立间接gradle依赖关系。 从Clean架构的角度来看,这种依赖性看起来很丑陋,使得可以从“表示”访问“数据”。 将Dagger组件和模块代码放在单独的gradle模块’di’中会创建循环gradle依赖’data’ – >’di’ – >’data’。 有没有一种方法可以将所有DI代码移到单独的模块中?

使用Dagger 2进行unit testing中的现场注入

正如Dagger文档中所建议的那样,对于unit testing,我们根本不需要涉及Dagger,并且对于提供的示例,它是有意义的: class ThingDoer { private final ThingGetter getter; private final ThingPutter putter; @Inject ThingDoer(ThingGetter getter, ThingPutter putter) { this.getter = getter; this.putter = putter; } String doTheThing(int howManyTimes) { /* … */ } } 使用这种类结构,unit testing很简单,只需模拟getter和putter ,将它们作为构造函数parameter passing,指示mockito在与任何这些对象交互时返回什么,然后在doTheThing(…)上进行断言。 我在测试中苦苦挣扎的地方是我必须对类似于以下结构的类进行unit testing: class ThingDoer { @Inject ThingGetter getter; @Inject ThingPutter putter; @Inject ThingMaker maker; @Inject // […]

如何使用dagger 2在Android服务中注入单例

我正在尝试将单身经理添加到Android服务中。 问题是注入的管理器与ViewModel中的管理器不同。 匕首组件 @Singleton @Component(modules = {ApplicationModule.class, AppScreenModule.class, ServiceModule.class}) public interface AppComponent { void inject(App application); void inject(OpportunisticService opportunisticService); @Component.Builder interface Builder { AppComponent build(); Builder applicationModule(ApplicationModule applicationModule); } } 模块 @Module class ApplicationModule { private final App mApp; ApplicationModule(App app) { mApp = app; } @Provides @Named(“ApplicationContext”) Context provideContext() { return mApp.getApplicationContext(); } @Provides […]

Dagger 2在AppCompatActivity中注入错误

我是Dagger的新手。 目前我创建示例项目一些剪辑代码: MyComponent.java @PerActivity @Component(modules = MyModule.class) public interface MyComponent { void inject(TutorialActivity activity); } MyModule.java @Module public class MyModule { @Provides Position providePosition() { return new Position(); } } PerActivity.java @Scope @Retention(RUNTIME) public @interface PerActivity {} TutorialActivity.java public class TutorialActivity extends AppCompatActivity{} 编译项目时我收到错误: Error:Execution failed for task ‘:app:compileDebugJavaWithJavac’. > java.lang.IllegalArgumentException: expected one element but […]

Kapt没有在Instant appfunction模块中生成课程

我在我的Android应用程序中使用dagger2。 即使没有错误,它也不会生成匕首组件类。 我在设置中启用了注释处理器并重新启动我的android工作室,但这对我不起作用。 我也读过这个post, Dagger2没有生成Daggercomponent类,并在一个不推荐使用apt线程上读取,所以我使用的是annotationProcessor 基本模块build.gradle apply plugin: ‘com.android.feature’ apply plugin: ‘kotlin-android’ apply plugin: ‘kotlin-kapt’ android { compileSdkVersion 26 buildToolsVersion “26.0.1” baseFeature true defaultConfig { minSdkVersion 23 targetSdkVersion 26 versionCode 1 versionName “0.0.1” } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } } } dependencies { application project(‘:app’) feature project(“:main”) feature project(“:tv”) api […]

Kotlin + Dagger – 为ViewModel工厂注入地图

我正在使用带有Dagger2的新架构组件,我想使用Factory类注入我的ViewModels。 Factory类本身是可注射的。 当在Java中定义Factory类时,这一切都很有效,但是当我将它转换为Kotlin时,Dagger2不知道如何为构造函数生成Map,而在Java中它知道如何这样做。 我认为不同之处在于,转换后,Factory类使用kotlin包中的Map,而不是java.util.Map包。 如何让Dagger2生成Factory构造函数的映射? 这是Factory类 @ActivityScope class MainActivityViewModelFactory @Inject constructor(private val creators: Map<Class, Provider>) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { var creator: Provider? = creators[modelClass] if (creator == null) { for ((key, value) in creators) { if (modelClass.isAssignableFrom(key)) { creator = value break } } } if (creator == null) { […]

Dagger 2无法访问Retrofit

我正在尝试使用Dagger 2(使用Android模块)向我的存储库提供Retrofit实例。 买我面临错误: 错误:无法访问Retrofit 像毕加索这样的其他实例注入成功,我只是在改造时遇到了问题。 我的模块 @Module class NetworkModule { @Provides @Singleton fun providesRetrofit(): Retrofit { return Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .baseUrl(URL_BASE) .build() } @Provides @Singleton fun providesPicasso(context: Context): Picasso { return Picasso.Builder(context) .loggingEnabled(true) .build() } @Provides @Singleton fun providesRemoteRepository(retrofit: Retrofit): RemoteRepository = RemoteRepository(retrofit) @Provides @Singleton fun providesRepository(remote: RemoteRepository): Repository = RepositoryImp(remote) } 我的应用程序组件 @Singleton @Component(modules = […]