编辑 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)
我该怎么做呢?
来自匕首讨论@:
我有一个类从对象图中获取一些依赖项,并在运行时从调用者获取其他依赖项.
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) 使用匕首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) 当使用Dagger时,我发现当我在任何需要它的地方注入它时,我会得到一个单例的多个实例.我已经注释了类和提供方法@Singleton.谁能想到为什么会这样?
编辑:
如果它有帮助,我在Dagger的GitHub(https://github.com/square/dagger/tree/master/examples/android-activity-graphs)中使用与我的应用程序相同的结构作为示例应用程序.我正在尝试在基本活动中使用Singleton,并@Provides在自定义Application类中使用提供的几个第三方类.是因为我在每个活动中加上原始对象图的模块吗?
(PS:我一般都是Dagger和DI的新手,所以如果你能提供解释以便我可以学习,我将不胜感激.谢谢.)
我有一个项目并迁移到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的新建筑组件,我在使用对象列表更新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) 如何从软件包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中的片段
我使用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)
谢谢.
我知道这可能不是提问的正确方法,但在阅读了很多很多内容之后,我仍然对匕首及其运作方式以及为什么要使用它感到困惑.自从它用于我目前的工作项目.请有人用简单的话语给我一些暗示,匕首的目的是什么,会非常有帮助.
谢谢
我正在使用带有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规则?