我在构建项目时遇到以下错误.在这个项目中没有使用CoordinatorLayout.刚刚在build.gradle中添加为依赖项:
我使用的是Android Studio 3.2 Canary 4.
logcat的
AGPBI:{"kind":"error","text":"程序类型已存在:android.support.design.widget.CoordinatorLayout $ Behavior","sources":[{}],"tool":"D8" }:app:transformDexArchiveWithExternalLibsDexMergerForDebug FAILED FAILURE:构建因异常而失败.*出了什么问题:任务执行失败':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
com.android.builder.dexing.DexArchiveMergerException:合并dex存档时出错:/windows/Other/app/build/intermediates/transforms/dexBuilder/debug/0.jar,/ windows/Other/app/build/intermediates/transforms/dexBuilder/debug/1.jar,/windows/Other/app/build/intermediates/transforms/dexBuilder/debug/4.jar,.....................
/windows/Other/app/build/intermediates/transforms/dexBuilder/debug/294.jar
程序类型已存在:android.support.design.widget.CoordinatorLayout $ Behavior
的build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.dagkot"
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "String", "BASE_URL", "\"http://api.openweathermap.org/data/2.5/\""
buildConfigField "String", "API_KEY", "\"435e9075f348868c2714fe7c6895efa5\""
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "String", …Run Code Online (Sandbox Code Playgroud) 我试图围绕Dagger 2中的范围,特别是范围图的生命周期.如何创建一个在离开示波器时将被清理的组件.
对于Android应用程序,使用Dagger 1.x,您通常在应用程序级别具有根范围,您可以扩展该范围以在活动级别创建子范围.
public class MyActivity {
private ObjectGraph mGraph;
public void onCreate() {
mGraph = ((MyApp) getApplicationContext())
.getObjectGraph()
.plus(new ActivityModule())
.inject(this);
}
public void onDestroy() {
mGraph = null;
}
}
Run Code Online (Sandbox Code Playgroud)
只要您保留对它的引用,子范围就存在,在这种情况下,它是您的Activity的生命周期.删除onDestroy中的引用可确保范围图可以自由地进行垃圾回收.
编辑
杰西威尔逊最近发布了一个mea culpa
Dagger 1.0严重搞砸了它的范围名称...... @Singleton注释用于根图和自定义图形,因此弄清楚事物的实际范围是很棘手的.
我读过/听过的其他一切都指向Dagger 2改进了范围的工作方式,但我很难理解其中的差异.根据@Kirill Boyarshinov在下面的评论,组件或依赖关系的生命周期仍然像往常一样通过具体的引用来确定.那么Dagger 1.x和2.0范围之间的差异纯粹是语义清晰度的问题吗?
依赖性是否是@Singleton.根图和子图中的依赖性同样如此,导致依赖关系绑定到哪个图形的模糊性(参见In Dagger是缓存的子图中的单例,或者当新的活动子图时它们总是被重新创建)是构造?)
自定义范围允许您创建语义清晰的范围,但在功能上等同于@Singleton在Dagger 1.x中应用.
// Application level
@Singleton
@Component( modules = MyAppModule.class )
public interface MyAppComponent {
void inject(Application app);
}
@Module
public class MyAppModule { …Run Code Online (Sandbox Code Playgroud) Dagger 1的plus()方法是我以前在应用程序中经常使用的方法,所以我理解你可能希望有一个子组件可以完全访问父图形绑定的情况.
在什么情况下使用组件依赖项而不是子组件依赖项是有益的?为什么?
如何使用Dagger?如何配置Dagger在我的Android项目中工作?
我想在我的Android项目中使用Dagger,但我发现它令人困惑.
编辑:Dagger2也从2015年04月15日开始,它更令人困惑!
[这个问题是一个"存根",我在我的答案中添加了更多关于Dagger1的知识,并且更多地了解了Dagger2.这个问题更多的是指导而不是"问题".
我已经和dagger2合作了一段时间.我为每个Activity/Fragment创建一个自己的组件/模块感到困惑.请帮我澄清一下:
例如,我们有一个应用程序,该应用程序有大约50个屏幕.我们将实现遵循MVP模式的代码和用于DI的Dagger2.假设我们有50个活动和50个演示者.
在我看来,通常我们应该像这样组织代码:
创建一个AppComponent和AppModule,它将提供应用程序打开时将使用的所有对象.
@Module
public class AppModule {
private final MyApplicationClass application;
public AppModule(MyApplicationClass application) {
this.application = application;
}
@Provides
@Singleton
Context provideApplicationContext() {
return this.application;
}
//... and many other providers
}
@Singleton
@Component( modules = { AppModule.class } )
public interface AppComponent {
Context getAppContext();
Activity1Component plus(Activity1Module module);
Activity2Component plus(Activity2Module module);
//... plus 48 methods for 48 other activities. Suppose that we don't have any other Scope (like UserScope after user login, ....)
}
Run Code Online (Sandbox Code Playgroud)创建ActivityScope:
@Scope …Run Code Online (Sandbox Code Playgroud)我开始使用dagger 2.2并且不推荐使用"组件"构建器中的模块方法.
这是我的应用程序组件:
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
void inject(Application application);
}
Run Code Online (Sandbox Code Playgroud)
和应用程序模块:
@Module
public class ApplicationModule {
Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Provides
@Singleton
Application providesApplication() {
return application;
}
}
Run Code Online (Sandbox Code Playgroud)
这是生成的类:
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://google.github.io/dagger"
)
public final class DaggerApplicationComponent implements ApplicationComponent {
private DaggerApplicationComponent(Builder builder) {
assert builder != null;
}
public static Builder builder() {
return new Builder();
}
public static ApplicationComponent create() {
return builder().build(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Dagger2添加到Android Studio中的项目中,但是我无法找到适当的依赖项来粘贴build.gradle.你能帮忙并给我一个合适的路线吗?
我在这里关注指南: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活动,只有一个依赖项.我将依赖注入到活动中,onCreate如下所示:
Dagger_HelloComponent.builder()
.helloModule(new HelloModule(this))
.build()
.initialize(this);
Run Code Online (Sandbox Code Playgroud)
在我的ActivityUnitTestCase我要重写一个模拟的Mockito的依赖.我假设我需要使用提供模拟的特定于测试的模块,但我无法弄清楚如何将此模块添加到对象图中.
在Dagger 1.x中,这显然是用这样的东西完成的:
@Before
public void setUp() {
ObjectGraph.create(new TestModule()).inject(this);
}
Run Code Online (Sandbox Code Playgroud)
什么是Dagger 2.0相当于以上?
您可以在GitHub上看到我的项目及其单元测试.
Dagger 2即将到来,但可用的示例甚至不能立即编译,文档是Dagger 1的复制粘贴替换.
有没有人在Google的Dagger 2上有适当的应用程序示例?