是否有可能在dagger中获取接口/类的实现列表?
我正在寻找像Ninject的Multi-Injection这样的东西.
我试图在没有Maven的情况下使用Dagger(仅使用ADT Eclipse)并遇到了这个问题.我尝试在注释处理选项中添加jar,并使用java writer 2.2.1,因为我从Dclipse中学到的示例通过eclipse构建失败,并且"请确保为此模块运行代码生成".但它仍然无效.
任何人都可以指出我做错了什么?
我有一个使用Dagger的Android应用.整个应用程序的某些部分我想为几个共享共同范围的活动添加范围的ObjectGraphs.以下模块位于根ObjectGraph中
@Module(
injects = {
MyApplication.class,
},
complete = false,
library = true)
public class BasicContextManagerModule {
private Context applicationContext;
public BasicContextManagerModule(Context applicationContext) {
this.applicationContext = applicationContext;
}
@Provides
Context getApplicationContext() {
return applicationContext;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试通过existingObjectGraph.plus(new FileManagerModule())添加以下模块;
@Module(
injects = {
MyListActivity.class,
MyFileDetailActivity.class,
MyFileInfoActivity.class,
},
includes = BasicContextManagerModule.class
)
public class FileManagerModule {
@Provides
FileManager provideFileManager(Context context) {
return new FileManager(context);
}
}
Run Code Online (Sandbox Code Playgroud)
但结果是
java.lang.UnsupportedOperationException: No no-args constructor com.myapp.core.modules.BasicContextManagerModule$$ModuleAdapter
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解为什么加号不会允许这个?我从匕首文档中读到,扩展了对象图,你可以使用includes和addsTo Modules.但我无法做到这一点.
一切都在问题中。例如,对于包含 String 列表的 Foo 类:
public class Foo {
private List<String> fooList;
//getter and setter
}
Run Code Online (Sandbox Code Playgroud)
在 XML 中,我们可以执行以下操作:
<bean id="foo" class="Foo">
<property name="fooList">
<list>
<value>bar</value>
<value>baz</value>
</list>
</property>
Run Code Online (Sandbox Code Playgroud)
使用Google Guice或Gin我可以指定参数不受依赖注入框架控制:
class SomeEditor {
@Inject
public SomeEditor(SomeClassA a, @Assisted("stage") SomeClassB b) {
}
}
Run Code Online (Sandbox Code Playgroud)
辅助参数stage在SomeEditor创建实例时指定.
SomeClassA的实例取自对象图,SomeClassB的实例在运行时从调用者获取.
在Dagger中有类似的方法吗?
我正在研究Dagger 2库并遇到了传递参数的问题,这些参数无法从"extends Application"类中获得.
例如,我需要传递FragmentManager给ViewPager适配器构造函数.你会怎么做?
我的应用程序:
public class MyApplication extends Application {
private MyAppComponent mMyAppComponent;
@Override
public void onCreate() {
super.onCreate();
Context context = getApplicationContext();
mMyAppComponent= DaggerMyAppComponent.builder()
.utilityModule(new UtilityModule())
.locationModule(new LocationModule(context))
.appModule(new AppModule(context))
.pagerAdapterModule(new PagerAdapterModule(context)) //this one is problematic
.build();
}
public MyAppComponent getmMyAppComponent() {
return mMyAppComponent;
}
}
Run Code Online (Sandbox Code Playgroud)
MyAppComponent:
@Singleton
@Component(
modules = {
UtilityModule.class,
LocationModule.class,
PagerAdapterModule.class,
AppModule.class
}
Run Code Online (Sandbox Code Playgroud)
)
public interface MyComponent {
FragmentManager fragmentManager(); //is it right?
public void inject(NavigationActivity navigationActivity);
} …Run Code Online (Sandbox Code Playgroud) 我在Android Studio中使用Dagger 2,但是当尝试通过DaggerMyComponent.builder().myModule(new MyModule()).build()创建Component时,我总是看到红色的" builder() " 这个词,它说"无法解析符号构建器".
我必须说我已经多次清理和构建了项目,甚至评论了组件实例并在重建后对其进行了解除.我还必须说我可以检查DaggerMyComponent.class,一切似乎都没问题,事实上,我可以毫无问题地导入该类.
该示例在GithHub上共享,链接如下:
https://github.com/alessandroargentieri/LetsDagger2Together
我有两个类:BClass和AClass,它取决于第一个.我有ABModule.class,它是工厂方法,ABComponent是组件接口.DaggerABComponent创建到WholeApplication.class中,扩展了Application.
package mawashi.alex.letsdagger2together.Application;
import android.app.Application;
import mawashi.alex.letsdagger2together.DaggerClasses.ABComponent;
import mawashi.alex.letsdagger2together.DaggerClasses.ABModule;
import mawashi.alex.letsdagger2together.DaggerClasses.DaggerABComponent;
public class WholeApplication extends Application {
static ABComponent component;
@Override
public void onCreate() {
super.onCreate();
//here is where builder() is not recognized
component = new DaggerABComponent.builder().aBModule(new ABModule()).build();
}
public static ABComponent getComponent(){
return component;
}
}
Run Code Online (Sandbox Code Playgroud)
模块:
package mawashi.alex.letsdagger2together.DaggerClasses;
import dagger.Module;
import dagger.Provides;
import mawashi.alex.letsdagger2together.Model.AClass;
import mawashi.alex.letsdagger2together.Model.BClass;
@Module
public class ABModule {
@Provides
public BClass …Run Code Online (Sandbox Code Playgroud) 正如标题所说,Dagger2没有生成Dagger*前缀类.我在这里看了一些其他类似的帖子,但似乎没有任何效果.
我克隆此回购https://github.com/ecgreb/mvpc,已失效Android Studio中的缓存和重新启动它,我删除$Project/.gradle和$Home/.gradle/caches,清洗和重建项目,但仍不能工作.
在使用Dagger2的一些项目中也发生了这种情况
我错过了什么吗?
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
defaultConfig {
applicationId "com.example.ecgreb.mvpc"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
tasks.withType(Test) {
testLogging {
exceptionFormat "full"
events "started", "skipped", "passed", "failed"
showStandardStreams true
}
}
repositories {
mavenCentral()
}
dependencies {
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
compile "com.google.dagger:dagger:2.7"
annotationProcessor "com.google.dagger:dagger-compiler:2.7"
provided 'javax.annotation:jsr250-api:1.0'
testCompile …Run Code Online (Sandbox Code Playgroud) 这是我,我尝试了我之前的帖子中的建议,将Kotlin用于整个项目.
当用gradle构建时我没有错误,但是当我尝试编译我得到的项目时.我试图在网上搜索一些答案,但无法找到任何东西.任何人都知道它可能是什么?
> e: [kapt] An exception occurred: java.lang.NoClassDefFoundError:
> com/google/auto/common/MoreTypes at
> dagger.model.Key$Builder.type(Key.java:111) at
> dagger.model.Key.builder(Key.java:102) at
> dagger.internal.codegen.KeyFactory.forInjectConstructorWithResolvedType(KeyFactory.java:253)
> at
> dagger.internal.codegen.InjectBindingRegistryImpl.tryRegisterMembersInjectedType(InjectBindingRegistryImpl.java:266)
> at
> dagger.internal.codegen.InjectBindingRegistryImpl.tryRegisterMembersInjectedType(InjectBindingRegistryImpl.java:257)
> at
> dagger.internal.codegen.InjectProcessingStep$1.visitVariableAsField(InjectProcessingStep.java:69)
> at
> dagger.internal.codegen.InjectProcessingStep$1.visitVariableAsField(InjectProcessingStep.java:59)
> at
> javax.lang.model.util.ElementKindVisitor6.visitVariable(ElementKindVisitor6.java:229)
> at com.sun.tools.javac.code.Symbol$VarSymbol.accept(Symbol.java:1237)
> at
> dagger.internal.codegen.InjectProcessingStep.process(InjectProcessingStep.java:58)
> at
> dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:330)
> at
> dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:181)
> at
> org.jetbrains.kotlin.kapt3.ProcessorWrapper.process(annotationProcessing.kt:133)
> at
> com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
> at
> com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
> at
> com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
> at
> com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
> at
> com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
> …Run Code Online (Sandbox Code Playgroud) 我AndroidInjection.inject(this)用来将组件注入活动中。
AndroidInjection也有一个android.app.Fragment以参数为重载的方法。但是我的片段扩展了android.support.v4.app.Fragment,没有相应的方法。
问题:如果碎片延伸,如何使用注射android.support.v4.app.Fragment?