Articles of dagger 2

Dagger2组件具有多个依赖项

这是我现在有,它的工作原理: @FragmentScope @Component(dependencies = {FacebookComponent.class}, modules = {FragmentFacebookLoginModule.class}) public interface FragmentFacebookLoginComponent { void inject(FragmentFacebookLogin fragment); } 现在我想添加另一个依赖项。 我改变了这个: @Component(dependencies = {FacebookComponent.class, AnotherComponent.class}, modules = {FragmentFacebookLoginModule.class}) 但是现在我得到这个错误消息: 片段FacebookLoginComponent依赖于多个有作用域的组件 我该如何解决这个问题? 我怎么能有多个依赖关系? 如果我从一个组件中删除范围,我得到这个错误消息: AnotherComponent(unscoped)不能依赖于作用域组件

如何从testing范围中排除Dagger2类

有什么select可以从Android Studio中的testing覆盖率报告中排除Dagger2类

annotationProcessor + androidTest + dagger2

对于检测testing,我有一个TestApplication创build一个TestComponent ,但该文件不再生成( Error:/xxx/TestApplication.java:16: The import.xxx.DaggerTestApplicationComponent cannot be resolved )。 我无法找出根本原因。 我已经尝试了不同的Android Studio(2.2,2.1.2),不同的gradle插件(2.2.0-alpha6,5,4)和不同版本的匕首(2.2到2.6)。 我应该使用androidTestAnnotationProcessor ? (事情并非如此) 编辑:使用匕首2.6,需要添加classpath 'com.google.guava:guava:19.0' 更新: Module出现问题,因此无法创buildComponent 。 但是,使用插孔(即使有debugging选项),我看不到问题。 现在,回到java 7,gradle插件2.1.2。 这样,不需要指定哪个番石榴版本,所有最新的库都可以使用(匕首2.6,butterknife 8.2.1,apt 1.8)

Dagger2 – null而不是注入的对象

为了简单起见,假设我想从apachevalidation器中注入EmailValidator到我的activity中: public class MainActivity extends FragmentActivity { @Inject EmailValidator emailValidator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 我有一个MainModule类: @Module public class MainModule { @Provides public EmailValidator providesEmailValidator() { return EmailValidator.getInstance(); } } 和MainComponent接口: @Singleton @Component(modules = MainModule.class) public interface MainComponent { EmailValidator getEmailValidator(); } 当试图在活动中使用我的validation器时,我得到一个空指针exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' […]

匕首2,图书馆模块和@Singleton

我试图在一个Android项目中使用Dagger 2,该项目有几个Android库模块 ,我希望能够从这些模块中提供单例范围的类实例 。 目前,我可以在库模块中定义组件,并在主应用程序模块中注入实例。 我不能做的是提供一个实例作为单身人士。 项目结构如下: Project ├── app ├── library1 · · · └── libraryN 在库中,我是这样定义组件的: @Component public interface LibraryComponent { // Provide instances of MyManager to MainComponent: MyManager getMyManager(); } MyManager看起来像这样: public class MyManager { private static final String TAG = "MyManager"; @Inject public MyManager() { Log.d(TAG, "Creating MyManager"); } } 在主应用程序中,我是这样定义我的组件的: […]

在切换到Android Studio 2.0后使用Dagger 2时出现NoClassDefFoundError

在升级到Android Studio 2.0之前,我可以使用Dagger 2没有问题。 现在我得到一个NoClassDefFoundError这已经closures了一天多,我伸出援手。 看起来好像Gradle不能我的AppModule类,即使它很清楚,它在我的项目中。 我甚至包括了set multiDexEnabled true即使我的项目只有几个文件。 我可以在网上find的所有东西都说可以点击你的库来导入。 Android Studio没有这样的奢侈品。 任何帮助将不胜感激,你将有我永远的忠诚。 04-21 17:26:54.006 7875-7875/com.androidtitan.spotscoreapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.androidtitan.spotscoreapp, PID: 7875 java.lang.NoClassDefFoundError: com.androidtitan.spotscoreapp.main.injection.AppModule_ProvidesApplicationFactory at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.initialize(DaggerAppComponent.java:31) at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.<init>(DaggerAppComponent.java:23) at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.<init>(DaggerAppComponent.java:0) at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent$Builder.build(DaggerAppComponent.java:66) at com.androidtitan.spotscoreapp.App.onCreate(App.java:28) at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:326) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1020) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5010) at android.app.ActivityThread.access$1600(ActivityThread.java:172) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1482) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5835) at java.lang.reflect.Method.invoke(Native Method) […]

匕首2,Gradle插件和杰克 – 指导要求

我正在用Android Studio(AS 2.1.2 – SDK 24)使用Dagger 2(DI库的首次用户),显然我的第一个想法是“我需要什么依赖来使用它? 看过例子,我可以看到你需要在顶层的build.gradle文件中,你需要一个注释处理器插件: classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 现在Module级别的build.gradle的依赖关系应用了Module的apt插件,所以我最终得到了如下的结果: apply plugin: 'com.neenbedankt.android-apt' // other generic settings – android / buildTypes etc. dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) . . compile 'com.google.dagger:dagger:2.6' apt 'com.google.dagger:dagger-compiler:2.6' provided 'javax.annotation:jsr250-api:1.0' } 问题 我一直在使用我的项目中的杰克工具链和Java 8,并发现上述configuration与杰克不兼容。 为了让杰克和匕首2合作,我研究了我需要的东西,我改变了以下内容: gradle-wrapper.properties: 变成 : distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip build.gradle (顶层) 变成: classpath 'com.google.guava:guava:19.0' // added after […]

Dagger 2中的Android MVP – 具有多个片段的活动

我一直在寻找与Dagger 2 MVP的谷歌Android架构示例: https://github.com/googlesamples/android-architecture/blob/todo-mvp-dagger/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksActivity.java 但是,这个例子并不重要 – 每个Activity只有一个片段,而Dagger组件是在Activity中构build的,并且用于为片段的Presenter注入Activity。 我已经尝试过构build这个示例,将多个片段添加到一个活动并在它们之间导航。 由于每个片段都有自己的演示者,所以我将匕首组件构build到片段中。 所以现在我有: FragmentCallback(提供加载fragment1和fragment2的方法的接口) 活动(实现FragmentCallback) Fragment1(实现视图界面) Fragment1Contract(定义视图和演示者界面) Fragment1Presenter(实现演示者界面) Fragment1Component(注入Fragment1) Fragment1Module(提供视图和演示者) Fragment2 Fragment2Contract(定义视图和演示者界面) Fragment2Presenter(实现演示者界面) Fragment2Component(注入Fragment2) Fragment2Module(提供视图和演示者) 该活动做的很less,它只是加载第一个片段,并实现视图可以用来切换到另一个片段的FragmentCallback。 第一个片段有一个button,它使用FragmentCallback加载第二个片段 – 片段通过投射Activity来获取片段 public void onAttach(Context context) { super.onAttach(context); callback = (FragmentCallback) context; } 我在这里的一个明智的轨道? 虽然代码看起来干净的MVP我缺less一些匕首组件和模块? 谢谢。 更新 通过为活动创build一个组件和模块,我已经改善了一些情况。 每个片段仍然构buildDagger上下文,但是我不再在演示者构造函数中注入视图(片段) – 当片段构build上下文时,自身注入(因此它具有演示者),然后调用presenter.init(this)让主持人现在有了这个看法。 这很好地减less了类的数量,下一步就是只尝试在活动中构build组件,并让片段使用它来注入自己(而不必构build新组件)。

当活动停止时,Dagger 2保存并恢复状态

我陷入了僵局。 我使用Dagger 2进行dependency injection,但当应用程序进入后台时,我正在丢失状态。 这是情景:应用程序启动并创build依赖关系。 只要应用程序停留在前台,所有的工作都是完美的。 但是,有一种情况下,应用程序必须进入后台。 当它回来时,存储在我的一个注入类中的值将丢失。 对于我的注入类没有自己的依赖,一切似乎恢复正常。 但是,有一个注入类有一个注入依赖,这是不能恢复的类。 以下是我如何设置它: AppComponent.java @Singleton @Component( modules = { AppModule.class } ) public interface AppComponent { SessionKeyExchangerService provideSessionKeyExchangerService(); AESCipherService provideCipherService(); void inject(LoginActivity loginActivity); } AppModule.java @Module public class AppModule { @Provides @Singleton AESCipherService provideCipherService() { return new AESCipherService(); } @Provides @Singleton SessionKeyExchangerService provideSessionKeyExchangerService(AESCipherService service) { return new […]

如何正确使用Dagger2与新的Android架构组件

我正在尝试使用新的架构组件,但是我对于匕首还是一个新东西,而且我错过了一些东西。 用下面的代码,我得到一个NullPointerException,无法find的地方。 另外,如果还有其他问题需要解决或改进,请提出build议。 CODE: ViewModel public class PostsVM extends ViewModel { private LiveData<StoryPost> post; private Repository repository; @Inject public PostsVM(Repository repository) { this.repository = repository; } public void init() { if (this.post != null) { return; } post = repository.getPosts(); } public LiveData<StoryPost> getPost() { return post; } } 知识库 @Singleton public class Repository { […]