Articles of dagger

Dagger + Retrofit。 在运行时添加auth头

我想知道Dagger是否有办法知道它应该在新数据可用时重新创建一个对象。 我所说的实例是我用于改造的请求标题。 在某些时候(当用户登录时),我得到一个令牌,我需要将其添加到改造的标题中以进行经过身份validation的请求。 问题是,我留下了相同的未经validation的改造版本。 这是我的注射码: @Provides @Singleton OkHttpClient provideOkHttpClient(Cache cache) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .cache(cache).build(); client .newBuilder() .addInterceptor( chain -> { Request original = chain.request(); Request.Builder requestBuilder = original.newBuilder() .addHeader(“Accept”, “Application/JSON”); Request request = requestBuilder.build(); return chain.proceed(request); }).build(); return client; } @Provides @Singleton Retrofit provideRetrofit(Gson gson, […]

没有@Annex-annotated方法就无法提供上下文,但它是?

我有以下简单的模块: @Module public class ApplicationModule { private CustomApplication customApplication; public ApplicationModule(CustomApplication customApplication) { this.customApplication = customApplication; } @Provides @Singleton CustomApplication provideCustomApplication() { return this.customApplication; } @Provides @Singleton @ForApplication Context provideApplicationContext() { return this.customApplication; } } 以及相应的简单组件: @Singleton @Component( modules = ApplicationModule.class ) public interface ApplicationComponent { CustomApplication getCustomApplication(); Context getApplicationContext(); } 我在这里创建组件: public class CustomApplication […]

使用Volley和Dagger获得Robolectric ShadowApplication时的NPE

在我的Android应用程序中,我设置了Volley。 Robolectric.application已初始化,所有其他测试均可顺利运行。 尝试获取模拟HTTP响应时出现此错误。 这是我的测试: @RunWith(MyRobolectricTestRunner.class) public class ApiTests { @Inject protected Api api; @Before public void setUp() { ObjectGraph.create(new AndroidModule(Robolectric.application), new TestApplicationModule()).inject(this); } @Test public void shouldGetErrorList() throws Exception { Project project = new Project(“test”, “test”, “test”, DateTime.now()); addPendingProjectsErrorsResponse(“response.json”); //adding response to FakeHttpLayer api.getProjectErrors(project, new Listener() { @Override public void onResponse(ProjectErrors response) { assertNotNull(response); } […]

使用Dagger 2 + Kotlin + ViewModel注入ViewModel

class SlideshowViewModel : ViewModel() { @Inject lateinit var mediaItemRepository : MediaItemRepository fun init() { What goes here? } 所以我正在尝试学习Dagger2,这样我就可以让我的应用程序更加可测试。 问题是,我已经集成了Kotlin并正在研究Android Architectural组件。 我理解构造函数注入是首选,但ViewModel无法做到这一点。 相反,我可以使用lateinit来注射,但我不知道如何注射。 我是否需要为SlideshowViewModel创建一个Component ,然后注入它? 或者我使用Application组件? gradle这个: apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ kapt { generateStubs = true } dependencies { compile “com.google.dagger:dagger:2.8” annotationProcessor “com.google.dagger:dagger-compiler:2.8” provided ‘javax.annotation:jsr250-api:1.0’ compile ‘javax.inject:javax.inject:1’ } 应用组件 @ApplicationScope @Component (modules = […]

Android @Singleton上的Dagger 2注释类没有被注入

我目前正在尝试将Dagger 2集成到Android应用程序中。 我的项目设置如下: 图书馆 应用程序(取决于库) 在我的库项目中,我定义了一个类,我稍后将其注入到库中的其他需要它的类(活动和常规类)以及应用程序项目中。 @Singleton public class MyManager{ @Inject public MyManager(){ //Do some initializing } } 现在 – 例如在我的片段或活动或常规类中,我将按如下方式注入上述Singleton: public class SomeClass{ @Inject MyManager myManager; } 或者我想,因为在实践中,myManager总是为空。 而且显然它的构造函数从未被调用过,所以我想我必须错过一些配置方面的东西? 或者我可能误解了文档并且它根本不是以这种方式工作的? MyManager类的目的是成为应用程序范围内可访问的组件累积实体 – 这就是我选择@Singleton的原因。 UPDATE 为了避免混淆:我在评论中提到了我的组件,我认为 – 这是指“基于组件的设计”中的组件,与匕首无关。 我上面列出了基于匕首的代码 – 我的代码中没有任何与dagger相关的代码。 当我开始添加@Component时,我遇到了一些编译器问题,因为我的dagger2设置不正确 – 请查看这个关于如何正确设置dagger2的真正有用的线程: https ://stackoverflow.com/a/29943394/1041533 更新2 这是我更新的代码,基于G. Lombard的建议 – 我更改了代码如下 – 原始的Singleton在库项目中: @Singleton public […]

运行Espresso测试时,Dagger代码给出NoClassDefFoundError,正常运行正常

开始探索Espresso 2.0,但似乎遇到了打嗝。 我无法让测试成功运行任何包含Dagger的项目。 当我运行测试时,我得到以下exception(最后的整个堆栈跟踪): java.lang.NoClassDefFoundError: com/pdt/daggerexample/model/DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter 应用程序在未从AndroidInstrumentationTest运行时运行。 以下是一些相关文件,我还将项目上传到github,以便更快地结账/复制https://github.com/paul-turner/espressoDaggerExample 。 的build.gradle: apply plugin: ‘com.android.application’ android { compileSdkVersion 21 buildToolsVersion “21.1.2” defaultConfig { applicationId “com.pdt.daggerexample” testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner” minSdkVersion 16 targetSdkVersion 21 versionCode 1 versionName “1.0” } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } debug { minifyEnabled false } } packagingOptions { exclude ‘LICENSE.txt’ exclude […]

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(); […]

我可以在Espresso中扩展自定义应用程序吗?

我正在尝试在Espresso仪器测试中设置Dagger,以模拟对外部资源的调用(在这种情况下是RESTful服务)。 我在Robolectric中为我的unit testing所遵循的模式是扩展我的生产Application类并使用将返回模拟的测试模块覆盖Dagger模块。 我试图在这里做同样的事情,但是当我尝试将应用程序转换为我的自定义应用程序时,我在Espresso测试中遇到了ClassCastException。 这是我到目前为止的设置: 生产 在app / src / main / java / com / mypackage / injection下我有: MyCustomApplication package com.mypackage.injection; import android.app.Application; import java.util.ArrayList; import java.util.List; import dagger.ObjectGraph; public class MyCustomApplication extends Application { protected ObjectGraph graph; @Override public void onCreate() { super.onCreate(); graph = ObjectGraph.create(getModules().toArray()); } protected List getModules() { List modules […]

Gradle dagger lint:忽略包裹

我使用Gradle创建了一个Android项目。 我添加了一个匕首库 dependencies { compile ‘com.squareup.dagger:dagger-compiler:1.2.1’ compile ‘com.squareup.dagger:dagger:1.2.1’ } 在尝试编译项目后,由于lintexception导致构建失败: InvalidPackage:Android中未包含的包 ../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup.dagger/dagger-compiler/1.2.1/c8bf6c2fda9b27f4d44a2aa4280df525a1408771/dagger-compiler -1.2.1.jar:库中的包引用无效; 不包含在Android中:javax.annotation.processing。 引自dagger.internal.codegen.GraphAnalysisErrorHandler。 ../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup.dagger/dagger-compiler/1.2.1/c8bf6c2fda9b27f4d44a2aa4280df525a1408771/dagger-compiler -1.2.1.jar:库中的包引用无效; 不包含在Android中:javax.lang.model.type。 引用自dagger.internal.codegen.GeneratorKeys。 ../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup.dagger/dagger-compiler/1.2.1/c8bf6c2fda9b27f4d44a2aa4280df525a1408771/dagger-compiler -1.2.1.jar:库中的包引用无效; 不包含在Android中:javax.lang.model.util。 引自dagger.internal.codegen.GraphAnalysisErrorHandler。 ../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.3.0/4b290e394ea3109be5c0b7f08ff75de089125122/javawriter-2.3.0.jar :库中的包引用无效; 不包含在Android中:javax.lang.model.element。 引自com.squareup.javawriter.JavaWriter。 所以,我必须修复或使lint忽略匕首包。 我已经设置了lint.xml但我无法想出一种忽略的方法: 谢谢。

Dagger:IllegalArgumentException:没有为Class绑定的进程工厂

我是Dagger 2的新手。我有2个活动,我想使用注入的ViewModel。 这是我的ViewModuleFactory : @Singleton public class ProductViewModelFactory implements ViewModelProvider.Factory { private final Map<Class, Provider> creators; @Inject public ProductViewModelFactory(Map<Class, Provider> creators) { this.creators = creators; } @SuppressWarnings(“unchecked”) @Override public T create(Class modelClass) { Provider creator = creators.get(modelClass); if (creator == null) { for (Map.Entry<Class, Provider> entry : creators.entrySet()) { if (modelClass.isAssignableFrom(entry.getKey())) { creator = entry.getValue(); […]