我在这里关注指南:https://github.com/ecgreb/dagger-2-testing-demo
我的app/src/main中有以下设置(省略了注入和@Provides代码):
public class FlingyApplication extends Application {
@Singleton
@Component(modules = { FlingyModule.class })
public interface FlingyComponent
}
@Module
public class FlingyModule
Run Code Online (Sandbox Code Playgroud)
在app/src/test中:
public class TestFlingyApplication extends Application {
@Singleton
@Component(modules = { TestFlingyModule.class })
public interface TestFlingyComponent extends FlingyComponent
}
@Module
public class TestFlingyModule
Run Code Online (Sandbox Code Playgroud)
到目前为止,它几乎与示例github相同.当dagger为src/main中的Component构建器生成代码时,它们会正确生成.但是,Dagger不会在src/test中为Component构建器生成代码.
我的主要build.gradle:
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0-alpha3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1'
}
Run Code Online (Sandbox Code Playgroud)
我的app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
# There is obviously more in here, but this is the custom part:
packagingOptions …
Run Code Online (Sandbox Code Playgroud) 我有一个核心Android库,我使用@Singleton作用域来定义CoreComponent广告,以注入CoreModule提供的类的实例.
@Singleton
@Component(modules = {CoreModule.class})
public interface CoreComponent {
void inject(SomeClass target);
}
@Module
public class CoreModule {
@Singleton
@Provides
CoreRepository provideCoreRepository() {
return new CoreRepositoryImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
我想从另一个依赖于核心库的Android库访问相同的@Singleton实例,并且正在使用另一个组件.
@Singleton
@FooScope
@Component(modules = {CoreModule.class, FooModule.class})
public interface FooComponent {
void inject(SomeActivity target);
}
public class FooActivity extends AppCompatActivity {
@Inject
public CoreRepository repo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
injectDependencies();
super.onCreate(savedInstanceState);
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
上面的代码构建,但@Singleton范围是Component的"本地".换句话说,有两个单例实例,一个用于CoreComponent,另一个用于FooComponent.
Android Application
??? Foo Library
| ??? Core Library
??? Bar Library
| ??? …
Run Code Online (Sandbox Code Playgroud) 在非Android应用程序中我完全厌倦了Dagger 2 (IDE是IntelliJ IDEA).
的build.gradle
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "net.ltgt.gradle:gradle-apt-plugin:0.9"
}
}
apply plugin: 'java'
apply plugin: 'net.ltgt.apt'
dependencies {
compile 'com.google.dagger:dagger:2.8'
apt 'com.google.dagger:dagger-compiler:2.8'
compileOnly 'javax.annotation:jsr250-api:1.0'
}
Run Code Online (Sandbox Code Playgroud)
零件
@Component(modules = {MyModule.class}) public interface MyComponent {}
Run Code Online (Sandbox Code Playgroud)
模
@Module class MyModule {}
Run Code Online (Sandbox Code Playgroud)
主要
DaggerMyComponent component = DaggerMyComponent.builder().build();
Run Code Online (Sandbox Code Playgroud)
编译说
找不到符号DaggerMyComponent
绝对没有更多的想法可能是错的:(
顺便说一句,如果我跑gradlew clean build --refresh-dependencies
,没有错误,一切都很好!
但是因为我只在IDE中使用"重建项目" - 再次出错.可能是IDEA错误(回到Eclipse的时间)?
是的,我已经添加了生成的类作为内容根目录,因此IDE可以看到DaggerMyComponent
.
我正在与Dagger 2一起创建我的依赖注入.它在几个小时前工作,但现在组件不再生成了.
这是我创建组件的地方:
public class App extends Application {
CacheComponent mCacheComponent;
ApiComponent mApiComponent;
DataBaseComponent mDataBaseComponent;
@Override
public void onCreate() {
super.onCreate();
mCacheComponent = DaggerCacheComponent.builder()
.cacheModule(new CacheModule(getApplicationContext()))
.build();
mApiComponent = DaggerApiComponent.builder()
.apiModule(new ApiModule())
.build();
mDataBaseComponent = DaggerDataBaseComponent.builder()
.dataBaseModule(new DataBaseModule(getApplicationContext()))
.build();
}
public CacheComponent getCacheComponent(){ return mCacheComponent;}
public ApiComponent getApiComponent() { return mApiComponent; }
public DataBaseComponent getDataBaseComponent() { return mDataBaseComponent;}
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但现在我得到错误:
E:\AndroidProject\JoinTV\app\src\main\java\com\myproject\jointv\utils\App.java:7: error: cannot find symbol
import com.myproject.jointv.component.DaggerApiComponent;
^
symbol: class DaggerApiComponent
location: package com.myproject.jointv.component
E:\AndroidProject\JoinTV\app\src\main\java\com\myproject\jointv\utils\App.java:8: error: cannot find symbol
import …
Run Code Online (Sandbox Code Playgroud)