Articles of dagger 2

Dagger 2注入相同对象types的多个实例

背景 我正在将我的应用程序转换为MVP架构,并发现Dagger 2在需要时注入依赖项非常有用。 我的应用程序需要与两个web apis(我自己和第三方api)进行通信。 有时可能会向我自己的api和第三方api发出请求。 我正在使用Retrofit与这些api进行通信并使用GSON进行序列化/反序列化。 我以前做过什么 我创建了两个Retrofit RestAdapter并使用Service Locator模式在需要时获取它们。 旨在用于我自己的api的RestAdapter包括带有一些自定义TypeAdapter的GSONConverter,因为我不想在应用程序中对我的响应进行1:1 JSON反序列化。 另一个RestAdapter用于第三方api,并使用另一个具有特定字段命名策略的GSONConverter。 问题 我正在尝试使用DI而不是Service Locator来获取我的RestAdapter(以及API接口)。 我的NetModule类设置如下 @Module public class NetModule { private static final String MY_API_URL = “my_api_url”; private static final String THIRD_PARTY_API_URL = “third_party_api_url”; @Provides @Singleton Cache provideOkHttpCache(Application application) { int cacheSize = 10 * 1024 * 1024; // 10 MiB return […]

dagger android支持proguard规则

我正在使用带有Proguard的 Dagger2 android-support库但由于这个错误我无法编译我的项目: Warning:dagger.android.AndroidInjector: can’t find referenced class com.google.errorprone.annotations.DoNotMock Warning:dagger.android.AndroidInjector$Builder: can’t find referenced class com.google.errorprone.annotations.DoNotMock Warning:dagger.android.AndroidInjector$Factory: can’t find referenced class com.google.errorprone.annotations.DoNotMock Warning:dagger.android.DaggerApplication: can’t find referenced class com.google.errorprone.annotations.ForOverride Warning:dagger.android.DispatchingAndroidInjector: can’t find referenced class com.google.errorprone.annotations.CanIgnoreReturnValue Warning:there were 5 unresolved references to classes or interfaces. 我正在使用的Dagger版本是2.11 。 问题是我应该为Dagger2 android-support库使用Proguard规则?

非活动Java类中的Dagger 2注入

我正在尝试使用Dagger2进行DI,它对于有onCreate生命周期事件的Activity / Fragment相关类非常适用。 现在我有一个普通的Java类,我想要注入它。 任何关于如何去做的想法将不胜感激。 我的代码看起来像这样: BasicMoviesUsecaseComponent.java – @PerActivity @Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class) public interface BasicMoviesUsecasesComponent { void inject(PaymentsManager paymentsManager); } DatabaseModule.java – @Module public class DatabaseModule { @Provides @Singleton Realm provideRealmInstance(Context context) { return Realm.getInstance(context); } @Provides @Singleton DatabaseProvider provideDatabaseInstance(Realm realm) { return new DatabaseProvider(realm); } @Provides @Singleton SharedPreferences provideSharedPrefs(Context context) { […]

Dagger 2与Kotlin的多重绑定

我的dagger 2模块中有以下片段 @Singleton @Provides @ElementsIntoSet fun providesQueries(foo: Foo): Set{ val queries = LinkedHashSet() queries.add(foo) return queries } 我试着以这种方式注入 @Inject lateinit var foo: Set 但是dagger显示一个错误,表示Dagger无法在没有@Provides或@Produces方法的情况下提供java.util.Set。 我在java中也做了同样的工作。 有人知道为什么会失败吗?

Android上的Dagger 2:在Activity中注入相同的依赖项并保留Fragment

我有类F1和F2对象,我想在保留的片段中注入。 我还有一个依赖于Activity的A类对象,我希望它被注入到该Activity中,并且附加到该Activity的Fragment Manager中的保留Fragment中。 我写下面的代码。 首先,Activity依赖的模块: @Module public class MainActivityModule { private Activity mActivity; public MainActivityModule(Activity activity) { mActivity = activity; } @Provides @ActivityScope public A provideA() { return new A(mActivity); } } 然后,相应的组件必须使A对象可用于其依赖组件: @ActivityScope @Component(modules = {MainActivityModule.class}) public interface MainActivityComponent { void inject(MainActivity activity); // make the A object available to dependent components A getA(); […]

kapt Build使用Dagger Android处理器失败

我试图在我的项目中使用Kotlin Annotation Processing Tool (kapt)包含Dagger Android处理器( 此处记录)。 我在build.gradle文件中包含了正确的依赖build.gradle : apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ apply plugin: ‘kotlin-kapt’ android { compileSdkVersion 25 buildToolsVersion “25.0.2” defaultConfig { applicationId “com.example.app” minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName “1.0” testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner” } sourceSets { main.java.srcDirs += ‘src/main/kotlin’ } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } […]

Dagger 2 – 来自不同组件的模块

我不太确定如何使用dagger 2解决这个问题。让我们假设我们有ApplicationModule为我们提供ApplicationContext然后我们有ApplicationComponent只使用这个模块。 然后在它上面我们有ActivityModule和ActivityComponent ,它们依赖于ApplicationComponent 。 ActivityComponent就像构建一样 ApplicationComponent component = ((MyApplication) getApplication()).getComponent(); mComponent = Dagger_ActivityComponent.builder() .applicationComponent(component) .activityModule(new ActivityModule(this)) .build(); 然后我注入我的活动: mComponent.inject(this); 现在我可以使用ActivityModule声明的所有内容,但是我无法访问ApplicationModule 。 所以问题是如何实现这一目标? 那么当我构建依赖于另一个组件的组件时,我仍然可以从第一个访问模块? 编辑 我想我已经find了解决方案,在再次重新阅读Jake的Devoxx讲话之后,我不得不错过这个,不管我想从我在该组件中提供的另一个组件模块中使用,例如我想使用ApplicationModule Context然后在ApplicationComponent里面我必须说明Context provideContext(); 它将会可用。 很酷:)

了解Android架构组件示例GithubBrowserSample:ViewModelModule,ViewModel参数

涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample 。 我查看了代码并出现了一些问题: 我注意到ViewModelModule包含在AppModule中 。 这意味着所有视图模型都被添加到DI图中。 为什么以这种方式完成,而不是为每个Activity / Fragment提供单独的Module ,只为特定的Activity / Fragment提供所需的ViewModel ? 在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将parameter passing给特定的ViewModel ? 或者更好的解决方案是在ViewModel创建一个setter并通过setter设置所需的param?

Dagger2生成的类突然从Android Studio中丢失

我已经在Android Studio中使用Dagger2已经好几个月了,但今天它突然停止工作并且给了我以下错误 error: cannot find symbol return Dagger_Injector.builder() ^ symbol: variable Dagger_Injector location: class Initializer Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 1 error 这是失败的代码 @Singleton @Component(modules = {TestService.class, ServiceFactory.class}) public […]

Dagger 2.10 Android子组件和构建器

使用新的(在2.10中)dagger.android类,我正在尝试使用依赖于其他模块的子组件来注入事物,因此,它有一个带有这些模块的setter的Builder。 https://google.github.io/dagger/android.html上的文档描述了这一点,但不清楚如何实际编写和/或调用这些setter。 引用上面的链接: AndroidInjection.inject()从Application获取DispatchingAndroidInjector并将您的活动传递给inject(Activity)。 DispatchingAndroidInjector为您的活动类(即YourActivitySubcomponent.Builder)查找AndroidInjector.Factory,创建AndroidInjector(即YourActivitySubcomponent),并将您的活动传递给inject(YourActivity)。 在我看来,为了能够为Builder调用setter,我需要进入某处并确保Builder具有所有必要的数据? 我看到的问题是,在运行时,我得到一个IllegalStateException: MODULE must be set当AndroidInjector调用我的子组件生成的构建器时, IllegalStateException: MODULE must be set 。 有问题的子组件实际上是一个片段,而不是一个活动,但我不确定这是否重要。 关于如何做到这一点的任何想法?