Articles of dagger 2

Android Kotlin:错误未解决的参考:DaggerAppComponent

我今天已经将Kotlin插件安装到Dagger 2的现有项目中。在安装Kotlin之前,我对Dagger没有任何问题。 但是,现在编译器抱怨: Error:(5, 32) Unresolved reference: DaggerAppComponent Error:Execution failed for task ‘:app:compileDebugKotlinAfterJava’. > Compilation error. See log for more details Error:(12, 21) Unresolved reference: DaggerAppComponent 项目gradle: ext.kotlin_version = ‘1.1.1’ repositories { jcenter() } dependencies { classpath ‘com.android.tools.build:gradle:2.2.2’ classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version” classpath “org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version” 模块gradle: kapt { generateStubs = true } dependencies { compile fileTree(dir: ‘libs’, include: […]

如何在Kotlin中使用Dagger的2 @Named资格赛

最近我在Kotlin遇到了@Named资格赛的问题。 我以为从这个改变: var boldTypeface: Typeface? = null [Inject] set 进入这个 var boldTypeface: Typeface? = null [Inject Named(“bold”)] set 要么 var boldTypeface: Typeface? = null [Inject] [Named(“bold”)] set 会解决我的问题。 但它没有,它甚至没有编译。

Espresso,Dagger2在BaseActivity上设置了ViemodelProvider.Factory

我有一个看起来像这样的抽象AccountRequiredActivity(并且工作正常): public abstract class AccountRequiredActivity extends LifecycleActivity { @Inject ViewModelProvider.Factory viewModelFactory; private AccountViewModel accountViewModel; public abstract void doOnCreate(Bundle savedInstanceState); public abstract void doOnResume(); @Override protected final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loading_app); AndroidInjection.inject(this); accountViewModel = ViewModelProviders.of(this, viewModelFactory).get(AccountViewModel.class); if(!accountViewModel.isAuthenticated()) { redirectToLogin(); } else { doOnCreate(savedInstanceState); }; } @Override protected void onResume() { super.onResume(); if(!accountViewModel.isAuthenticated()) { redirectToLogin(); […]

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(); 它将会可用。 很酷:)