标签: dagger

Dagger:注入@Named字符串?

编辑 2018-02-08:示例项目演示如何在https://github.com/ravn/dagger2-named-string-inject-example执行此操作- 注意:整个源代码在一个文件中!


我正在研究dagger是否能为我们取代guice(因为我们的部署Java平台很慢).

我在运行时构建了配置字符串的映射,我希望根据需要使用dagger.

如果我有

java.util.Map<String, String> map = new java.util.TreeMap<String, String>();
map.put("key", "value");
Run Code Online (Sandbox Code Playgroud)

@Inject
Thermosiphon(Heater heater, @Named("key") String value) {
    this.heater = heater;
    System.out.println("value =" + value);
}
Run Code Online (Sandbox Code Playgroud)

我希望注入价值"价值".

源代码中的示例没有任何@Named用法.只是尝试给出以下异常:

Exception in thread "main" java.lang.IllegalStateException: Errors creating object graph:
  No binding for @javax.inject.Named(value=key)/java.lang.String required by class bar.Thermosiphon
    at dagger.internal.ThrowingErrorHandler.handleErrors(ThrowingErrorHandler.java:34)
    at dagger.internal.Linker.linkRequested(Linker.java:146)
    at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:288)
    at dagger.ObjectGraph$DaggerObjectGraph.get(ObjectGraph.java:249)
    at app.CoffeeApp.main(CoffeeApp.java:20)
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

dependency-injection dagger

19
推荐指数
2
解决办法
2万
查看次数

寻找Dagger辅助注射的例子

来自匕首讨论@:

我有一个类从对象图中获取一些依赖项,并在运行时从调用者获取其他依赖项.

public class ImageDownloader {
  // Get these dependencies from the injector.
  private final HttpClient httpClient;
  private final ExecutorService executorService;

  // Get these from the caller.
  private final URL imageUrl;
  private final ImageCallback callback;

  ...
}
Run Code Online (Sandbox Code Playgroud)

我提出了一个解决方案,在那里我定义了一个工厂,

public class ImageDownloader {
  ...
  public static class Factory {
    private final HttpClient httpClient;
    private final ExecutorService executorService;

    @Inject
    public Factory(HttpClient httpClient, ExecutorService executorService) {
      this.httpclient = httpClient;
      this.executorService = executorService;
    }

    public ImageDownloader create(URL imageUrl, ImageCallback callback) {
      return …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection assisted-inject dagger

19
推荐指数
2
解决办法
6410
查看次数

DaggerAppComponent未创建

使用匕首2.10,我曾经能够通过这样做来创建应用程序组件

    sAppComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .sessionModule(new SessionModule())
            .netModule(new NetModule())
            .dataModule(new DataModule())
            .build();
Run Code Online (Sandbox Code Playgroud)

我已经在使用AndroidInjector for Activities,一切都很好.现在我切换到2.11,我找不到创建应用程序组件的方法.在谷歌教程中,我看到:

DaggerYourApplicationComponent.create()
    .inject(this);
Run Code Online (Sandbox Code Playgroud)

要添加到应用程序的onCreate中.就我而言DaggerYourApplicationComponent = DaggerAppComponent.问题是不再创建DaggerAppComponent类.

我有:

public class App extends android.support.multidex.MultiDexApplication implements HasActivityInjector {
    @Inject DispatchingAndroidInjector<Activity> mDispatchingActivityInjector;
    @Override
    public void onCreate() {
        super.onCreate();

        sAppComponent = DaggerAppComponent.create().inject(this); //here the error
Run Code Online (Sandbox Code Playgroud)

和:

@Singleton
@Component(modules = {
        AppModule.class,
        MainActivityModule.class,
        ...
})
public interface AppComponent {
        void inject(App app);
        ...
}
Run Code Online (Sandbox Code Playgroud)

在我的build.gradle文件中:

def daggerVer = 2.11
compile "com.google.dagger:dagger:$daggerVer"
compile "com.google.dagger:dagger-android-support:$daggerVer"
annotationProcessor "com.google.dagger:dagger-android-processor:$daggerVer"
Run Code Online (Sandbox Code Playgroud)

android dagger

19
推荐指数
2
解决办法
2万
查看次数

Dagger 1.x中的单身人士

当使用Dagger时,我发现当我在任何需要它的地方注入它时,我会得到一个单例的多个实例.我已经注释了类和提供方法@Singleton.谁能想到为什么会这样?

编辑:

如果它有帮助,我在Dagger的GitHub(https://github.com/square/dagger/tree/master/examples/android-activity-graphs)中使用与我的应用程序相同的结构作为示例应用程序.我正在尝试在基本活动中使用Singleton,并@Provides在自定义Application类中使用提供的几个第三方类.是因为我在每个活动中加上原始对象图的模块吗?

(PS:我一般都是Dagger和DI的新手,所以如果你能提供解释以便我可以学习,我将不胜感激.谢谢.)

android dependency-injection dagger

18
推荐指数
1
解决办法
4400
查看次数

如何配置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 'com.squareup.dagger:dagger:1.2.0'
}
Run Code Online (Sandbox Code Playgroud)

而我的顶级build.gradle看起来像这样

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies { …
Run Code Online (Sandbox Code Playgroud)

android gradle dagger

18
推荐指数
1
解决办法
2万
查看次数

第一次调用后,LiveData不会更新其值

我一直在撞墙,我无法理解为什么会这样.我正在使用Android的新建筑组件,我在使用对象列表更新LiveData时遇到问题.我有两个旋转器.当我更改第一个选项时,第二个必须更改其内容.但最后一部分没有发生.谁能帮我?

State.java

@Entity(tableName = "states")
public class State{

@PrimaryKey(autoGenerate = false)
private int id;

private String name;

@ColumnInfo(name = "countryId")
private String CountryId;

@Ignore
private Object geoCenter, geoLimit;

public State(){

}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getCountryId() {
    return CountryId;
}

public void setCountryId(String countryId) {
    CountryId = countryId;
}
} …
Run Code Online (Sandbox Code Playgroud)

android viewmodel dagger dagger-2 android-room

18
推荐指数
1
解决办法
2万
查看次数

dagger android支持androidx.fragment

如何从软件包androidx.fragment.app.Fragment中注入一个片段?

我正在使用dagger-android框架在我的代码中注入我的依赖项.

正如文档所说,我这样做是为了注入我的片段

@Override
public void onAttach(Activity activity) {
    AndroidInjection.inject(this);
    super.onAttach(activity);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

问题是AndroidSupportInjection类只接受android.support.v4.app.Fragment包的片段,或者如果我使用AndroidInjection类只接受android.app.Fragment包的片段,我想使用androidx.fragment的片段. app.Fragment包.

此外,DaggerFrament从android.support.v4.app.Fragment扩展,并希望使用来自androidx的片段

如果我尝试实现HasSupportFragmentInjector,这个接口也使用android.support中的片段

dagger dagger-2 androidx

18
推荐指数
2
解决办法
4528
查看次数

Gradle dagger lint:忽略包裹

我使用Gradle创建了一个Android项目.我添加了一个匕首库

dependencies {
    compile 'com.squareup.dagger:dagger-compiler:1.2.1'
    compile 'com.squareup.dagger:dagger:1.2.1'
}
Run Code Online (Sandbox Code Playgroud)

在尝试编译项目后,由于lint异常导致构建失败:

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,但我无法想出一种忽略的方法:

InvalidPackage: Package not included in Android
Run Code Online (Sandbox Code Playgroud)

谢谢.

android gradle dagger

17
推荐指数
2
解决办法
7595
查看次数

什么是匕首,以及它是如何运作的

我知道这可能不是提问的正确方法,但在阅读了很多很多内容之后,我仍然对匕首及其运作方式以及为什么要使用它感到困惑.自从它用于我目前的工作项目.请有人用简单的话语给我一些暗示,匕首的目的是什么,会非常有帮助.

谢谢

android dagger

17
推荐指数
1
解决办法
3397
查看次数

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.
Run Code Online (Sandbox Code Playgroud)

我正在使用的Dagger版本是2.11.

问题是我应该为Dagger2 android-support库使用Proguard规则?

android proguard dagger dagger-2 android-proguard

17
推荐指数
1
解决办法
6555
查看次数