标签: dagger

尽管Dagger可以生成点文件,但它无法创建对象图

在现有的应用程序中,我正在努力设置Dagger(1.0.1).它被配置为使用ProGuard,但我禁用它进行此测试-dontobfuscate.

当我启用dagger-compiler时,它能够成功生成带有依赖关系图的点文件,但是当我删除编译器并在Release模式下构建应用程序时,它会在启动时崩溃,抱怨它无法创建对象图.

java.lang.RuntimeException: Unable to start activity 
  ComponentInfo{com.corp.myapp/com.corp.myapp.ui.activity.MainActivity}: 
  java.lang.IllegalStateException: Errors creating object graph:

No injectable members on com.corp.myapp.core.services.ConnectionMonitor. Do 
  you want to add an injectable constructor? required by 
  com.corp.myapp.core.services.ConnectionMonitor 
  com.corp.myapp.ui.activity.MyAppBaseActivity.connectionManager

No injectable members on com.corp.myapp.ui.crouton.CroutonManager. Do you want 
  to add an injectable constructor? required by 
  com.corp.myapp.ui.crouton.CroutonManager 
  com.corp.myapp.ui.activity.MyAppBaseActivity.croutonManager

No injectable members on com.corp.core.assembler.ResourceAssembler. Do you want 
  to add an injectable constructor? required by 
  com.corp.core.assembler.ResourceAssembler 
  com.corp.myapp.ui.activity.MyAppBaseActivity.resourceAssembler
Run Code Online (Sandbox Code Playgroud)

我看到MyAppBaseActivity它和生成的点文件中的依赖关系CroutonManagerConnectionMonitor显示,所以根据这个评论,我希望这个工作.AFAIK如果出现问题,应该通过我用来生成点文件的编译器启用的构建来检测它.


更新:

我之前曾说过

在调试模式下它永远不会失败

但是在进一步测试之后并不是真的:在调试 …

android dependency-injection proguard dagger

5
推荐指数
1
解决办法
5078
查看次数

匕首和对象图表与流/砂浆的范围

所以我本周末花了很多时间在Mortar和Flow上,我想我终于完成了大部分工作.我发现它比我原先想象的要复杂一点,主要是因为我还没有完全理解Dagger的ObjectGraph Scoping,Mortar非常依赖它.我在Dagger的网站上已经阅读了尽可能多的内容,但是我发现这个主题的信息在与Dagger特别相关时缺乏.

所以我有几个问题:1.我看到他们对@ Singleton的范围的例子:

@Layout(R.layout.screen_friend)
public class FriendScreen implements Blueprint {

  @Override public String getMortarScopeName() {
    return getClass().getName();
  }

  @Override public Object getDaggerModule() {
    return new Module();
  }

  @dagger.Module(
      injects = FriendView.class
  )
  static class Module {
  }

  @Singleton
  public static class Presenter extends ViewPresenter<TestView> {

    @Inject
    public Presenter() {
      Log.d("FriendScreen", "Friend Presenter Created");
    }

    @Override protected void onLoad(Bundle savedInstanceState) {
      super.onLoad(savedInstanceState);
    }
  }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Presenter是否专门针对此模块,因为它是一个内部类?2.如何确保仅在此对象图中创建它的实例而不是全局应用程序对象图?2.如果演示者太大了,我想把它移到它自己的独立课程怎么办?我如何将其范围仅限于此模块?3.我注意到他们示例中的某些Module类是静态的,而其他类则不是.这对范围界定有什么影响吗?4.我在哪里可以阅读更多内容以更好地理解Dagger的对象图.我需要更好地理解includes,inject,addsTo以及如何在ObjectGraph创建中使用它们等:

@dagger.Module( //
      includes = ActionBarModule.class,
      injects = MainView.class,
      addsTo = ApplicationModule.class, //
      library …
Run Code Online (Sandbox Code Playgroud)

object-graph dagger

5
推荐指数
1
解决办法
489
查看次数

如何使用匕首设计Android应用程序并考虑测试

我是匕首的新手,最近我开始在自己的一个项目中使用匕首,因为能够以不同的方式处理依赖注入的概念用于测试和生产,因此能够注入我可以用于测试的模拟对象很棒.

我修改了我的应用程序,以遵循dagger simple-android示例中的样式.

设置完毕后,我发现注入存在问题,并且我无法使用测试逻辑完全超载生产应用程序中的注入.

我正在寻找关于如何设置它的建议,以便我的测试可以实际注入与模拟或其他对象的差异,以便根据需要进行测试,而不是过于愚蠢.目前,MainActivityTest被正确注入,但是当我们到达MainActivity时,它会转到PhoneApplication并使用它的对象图注入

我已经把我下面的内容包括在内了.任何帮助将不胜感激!


这是我的PhoneApplication,基于DemoApplication.

public class PhoneApplication extends Application {
    private ObjectGraph graph;

    @Override
    public void onCreate() {
        super.onCreate();

        graph = ObjectGraph.create(getModules().toArray());
    }

    protected List<Object> getModules() {
        return Arrays.asList(new AndroidModule(this), new PhoneModule());
    }

    public void inject(Object object) {
        graph.inject(object);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的AndroidModule

@Module(library = true, injects = MainActivity.class)
public class AndroidModule {
    private final Context context;

    public AndroidModule(Context context) {
        this.context = context;
    } …
Run Code Online (Sandbox Code Playgroud)

testing android unit-testing dependency-injection dagger

5
推荐指数
1
解决办法
2173
查看次数

如何使用Google Dagger 2确保释放资源

Google Dagger 2是关于对象范围的,例如,当您在http请求期间需要对象时,您需要使用提示方法注释@RequestScope.

但是,一些提供的资源需要被释放例如CloseableHttpClient需要被关闭ExecutorService的需要是关机.

当使用Google Dagger 2超出范围时,如何指定必须采取哪些操作才能释放对象?

java scope dependency-injection dagger dagger-2

5
推荐指数
1
解决办法
345
查看次数

如何使用dagger2设置和获取模型类的Singleton对象?

我有什么选项可以在Android应用程序中创建所有模型类的单个实例?

我在下面添加了一个示例模型类

public class User
{
    private String email;
    private String name;
    public String getEmail()           {  return this.email;    }
    public void setEmail(String email) {  this.email = email;   }
    public String getName()            {  return this.name;    }
    public void setName(String name)   {  this.name = name;   }
}
Run Code Online (Sandbox Code Playgroud)

我希望一旦数据存储在Model Class中,就可以在任何活动,类或片段中检索它.我应该使用单身人士,还是有更好的方法?

dagger2会在这种情况下工作吗?dagger2是创建单身人士的替代方案吗?

谢谢

design-patterns dagger dagger-2

5
推荐指数
1
解决办法
1074
查看次数

使用Dagger 1.2.2,Gradle 2.4,Eclipse 4.5.0 Mars进行注释处理失败

Dagger 1.2.2,Gradle 2.4,Eclipse 4.5.0 Mars on OSX 10.9.5.

在Eclipse中尝试运行JUnit测试失败:"请确保为此模块运行代码生成."

这是Eclipse中的Gradle项目,其版本如上所示.

JUnit测试从命令行成功运行("./gradlew clean test").

项目属性:Java编译器:注释处理显示:选中所有复选框.生成的代码转到.apt_generated.未指定处理器选项.

项目属性:Java编译器:注释处理:工厂路径显示:存在并检查dagger-compiler-1.2.2.jar,存在并检查javawriter-2.5.0,存在并检查dagger-1.2.2.jar.

org.eclipse.jst.ws.annotations.core存在但未检查(检查它和重建似乎没有任何区别).

"已检查"的罐子都是从我的〜/ .gradle/caches目录中获取的.

.apt_generated目录中没有任何内容(我收集生成的类文件应该出现在那里;我从未见过.)

思考?[编辑:添加缺失的单词"line"]

java eclipse dagger

5
推荐指数
1
解决办法
672
查看次数

如何在Java项目上的IntelliJ中使用Dagger2

我想用DaggerIntelliJ但不能用。Dagger使用注释处理器,我猜IntelliJ不了解注释处理器。

您可以看到生成的Java文件,它是由Dagger2编译器生成的,但是我的Java源代码找不到它们。即使我设置build.gradle为在我的Java文件和生成的Java文件之间连接。

这是我的整个源项目文件

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

def generatedSources = "$buildDir/generated/src"
def generatedOutputDir = file("$generatedSources")

compileJava {
    doFirst {
        generatedOutputDir.exists() || generatedOutputDir.mkdirs()
        options.compilerArgs = [
                '-s', "${generatedSources}"
        ]
    }
}

sourceSets {
    main {
        java {
            srcDirs += generatedOutputDir
        }
    }
}

dependencies {
    compile "com.google.dagger:dagger:2.0"
    compile "com.google.dagger:dagger-compiler:2.0"
    compile "com.squareup:otto:1.3.8"
    compile 'io.reactivex:rxjava:1.0.13'
    compile "org.glassfish:javax.annotation:10.0-b28"

    testCompile "junit:junit:4.12"
    testCompile "org.mockito:mockito-core:1.9.5"
}

compileJava.dependsOn clean
Run Code Online (Sandbox Code Playgroud)

java intellij-idea gradle annotation-processing dagger

5
推荐指数
1
解决办法
1804
查看次数

架构组件ViewModels使用来自Activity/Fragment的params注入匕首

我正在尝试将新的Architecture Components添加ViewModel到我的应用程序中,同时用匕首注入它们.我的代码基于google 在这里显示的内容.我试图避免ViewModelFactory为每种ViewModel类型使用,所以我使用了ViewModelFactoryMap<Class<? extends ViewModel>, Provider<ViewModel>> creators.它适用于ViewModels具有@Singleton范围的依赖项.但是,我的一个人ViewModels有一个来自片段的依赖.这是该片段的模块:

@Module
public abstract class DownloadIssueDialogFragmentModule {

    @Binds
    abstract DialogFragment dialogFragment(DownloadIssueDialogFragment dialogFragment);

    @Provides
    @FragmentScope
    static Issue provideIssue(DownloadIssueDialogFragment dialogFragment) {
        return dialogFragment.getIssue();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的ViewModelModule:

@Module
public abstract class ViewModelModule {

    @Binds
    abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);

    @Binds
    @IntoMap
    @ViewModelKey(DownloadIssueViewModel.class)
    abstract ViewModel bindDownloadIssueViewModel(DownloadIssueViewModel viewModel);

}
Run Code Online (Sandbox Code Playgroud)

匕首说不能提供Issue.它Map<Class<? extends ViewModel>, Provider<ViewModel>>似乎有意义,因为它似乎是在编译时创建的.但我只会知道该片段范围内的参数.我怎样才能做到这一点?

谢谢.

编辑:

最后,我采用了不同的方法.现在我为每个ViewModel创建一个工厂,而不是注入ViewModel,我注入了工厂.

我创建了这个库: …

android mvvm dagger dagger-2 android-architecture-components

5
推荐指数
1
解决办法
1359
查看次数

如何使用DaggerApplication和DaggerAppCompatActivity

我正在努力了解新的Dagger2 API和对Android的支持。我正在使用Dagger2版本2.15:

implementation 'com.google.dagger:dagger:2.15'
implementation 'com.google.dagger:dagger-android:2.15'
implementation 'com.google.dagger:dagger-android-support:2.15'
annotationProcessor 'com.google.dagger:dagger-compiler:2.15'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.15'
Run Code Online (Sandbox Code Playgroud)

现在,在此版本中有一些类似的类DaggerApplicationDaggerAppCompatActivity但是我不确定如何使它们工作。

到目前为止,这是我所做的:

我在清单中添加的Application类:

class BaseApplication : DaggerApplication() {
    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder().create(this)
    }
}
Run Code Online (Sandbox Code Playgroud)

我的AppComponent:

@Singleton
@Component(modules = [
    AndroidSupportInjectionModule::class
])
interface AppComponent : AndroidInjector<BaseApplication> {
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<BaseApplication>()
}
Run Code Online (Sandbox Code Playgroud)

我在所有创建的其他活动中扩展的基本Activity类:

abstract class BaseActivity : DaggerAppCompatActivity() {
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试制作或构建项目时,它会失败,而Dagger不会DaggerAppComponent为我生成。我想念什么?

android dagger dagger-2

5
推荐指数
1
解决办法
4988
查看次数

如何在运行时从活动或片段将参数传递给dagger模块

我的软件规格如下:

Android Studio 3.4
dagger-android 2.16
Run Code Online (Sandbox Code Playgroud)

我有以下类传递一个MapboxGeocoder将执行并返回响应的类.

class GeocodingImp(private val mapboxGeocoder: MapboxGeocoder) : Geocoding {

    override fun getCoordinates(address: String, criteria: String): AddressCoordinate {
        val response = mapboxGeocoder.execute()

        return if(response.isSuccess && !response.body().features.isEmpty()) {
            AddressCoordinate(
                response.body().features[0].latitude,
                response.body().features[0].longitude)
        }
        else {
            AddressCoordinate(0.0, 0.0)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它MapboxGeocoder是在编译时在匕首模块中生成的.所以我必须为地址指定字符串TYPE_ADDRESS.

@Reusable
@Named("address")
@Provides
fun provideAddress(): String = "the address to get coordinates from"

@Reusable
@Provides
@Named("geocoder_criteria")
fun provideGeocoderCriteria(): String = GeocoderCriteria.TYPE_ADDRESS

@Reusable
@Provides
fun provideMapboxGeocoder(@Named("address") address: String, @Named("geocoder_criteria") geocoderCriteria: String): …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

5
推荐指数
1
解决办法
970
查看次数