Articles of dagger

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

如何在自定义视图或其他Android类中使用AndroidInjection类?

我对Android特定模式的问题是,如果使用他们的AndroidInjection类,除了Application Component之外,除了Activities / Fragments /自定义视图/适配器之外,成员无法注入其他对象。 这是因为您无法获得用于注入Activities / Fragments的Subcomponent ( AndroidInjector )的引用。 这使得注入Dialogs(如果您使用DialogFragments )。 AndroidInjection类似乎只支持核心Androidtypes。

让Dagger在为Android进行espressofunction测试时注入模拟对象

我最近和Dagger一起吃饱了,因为DI的概念完全合情合理。 DI的一个更好的“副产品”(杰克沃顿在他的一个演讲中提出)更容易测试。 所以现在我基本上使用浓缩咖啡做一些function测试,我希望能够将虚拟/模拟数据注入应用程序并让活动显示出来。 我猜,因为这是DI的最大优势之一,这应该是一个相对简单的问题。 出于某种原因,我似乎无法绕过它。 任何帮助将非常感激。 这是我到目前为止(我写了一个反映我当前设置的例子): public class MyActivity extends MyBaseActivity { @Inject Navigator _navigator; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyApplication.get(this).inject(this); // … setupViews(); } private void setupViews() { myTextView.setText(getMyLabel()); } public String getMyLabel() { return _navigator.getSpecialText(); // “Special Text” } } 这些是我的匕首模块: // Navigation Module @Module(library = true) public class NavigationModule […]

在Android上使用DI的具体好处是什么?

使用Androiddependency injection框架的具体优势或优势是什么,如Dagger , Transfuse或RoboGuice ? 例如,什么样的应用程序从使用DI中受益最多? 是否有更多的性能优势,或者更多的是扩展应用程序的简易性,还是更多关于使其可测试? 问这个问题的原因之一是衡量我正在开发的应用程序是否真的会受益于它或者不是很多。 由于我打算在某些方面认真对待应用程序,可测试性和易于扩展性将是很好的,即使第一版本使用成本高(更多时间设置,学习曲线等)。 谢谢!

如何配置dagger + gradle

我有一个项目并迁移到gradle依赖,但我发现自己有一个问题,试图用gradle设置dagger,我第一次编译它工作完美(或者如果我清理)但如果我尝试两次然后它给我错误像: 错误:(13,14)错误:重复类:com.myapp.android.application.InjectingApplication $ InjectingApplicationModule $$ ModuleAdapter 我尝试使用android-apt插件并在文档中配置,但我仍然得到相同的错误( https://bitbucket.org/hvisser/android-apt/overview ) 我也尝试使用提供的依赖,就像在本教程( https://github.com/frankdu/android-gradle-dagger-tutorial )中编译但到目前为止没有运气。 你有任何想法如何配置匕首和gradle? 编辑 我的build.gradle看起来像这样 apply plugin: ‘android’ apply plugin: ‘android-apt’ android { compileSdkVersion 19 buildToolsVersion “19.0.2” defaultConfig { minSdkVersion 9 targetSdkVersion 19 packageName “com.myapp.android” } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.txt’ } } } dependencies { compile project(‘:volley’) apt ‘com.squareup.dagger:dagger-compiler:1.2.0’ compile […]

使用KClasstypes绑定到映射

我试图通过他们的KClasstypes将ViewModel子类绑定到一个映射中: @Module abstract class ViewModelModule { @Binds @IntoMap @ViewModelKey(MyViewModel::class) abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel @Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory } 但我得到Dagger编译错误: e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass,? extends javax.inject.Provider> cannot be provided without an @Provides-annotated method. e: e: public abstract interface AppComponent { e: ^ e: java.util.Map<kotlin.reflect.KClass,? extends javax.inject.Provider> is injected at e: com.example.app.ui.ViewModelFactory.(creators) e: […]