在现有的应用程序中,我正在努力设置Dagger(1.0.1).它被配置为使用ProGuard,但我禁用它进行此测试-dontobfuscate.
当我启用dagger-compiler时,它能够成功生成带有依赖关系图的点文件,但是当我删除编译器并在Release模式下构建应用程序时,它会在启动时崩溃,抱怨它无法创建对象图.
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.corp.myapp/com.corp.myapp.ui.activity.MainActivity}:
java.lang.IllegalStateException: Errors creating object graph:
No injectable members on com.corp.myapp.core.services.ConnectionMonitor. Do
you want to add an injectable constructor? required by
com.corp.myapp.core.services.ConnectionMonitor
com.corp.myapp.ui.activity.MyAppBaseActivity.connectionManager
No injectable members on com.corp.myapp.ui.crouton.CroutonManager. Do you want
to add an injectable constructor? required by
com.corp.myapp.ui.crouton.CroutonManager
com.corp.myapp.ui.activity.MyAppBaseActivity.croutonManager
No injectable members on com.corp.core.assembler.ResourceAssembler. Do you want
to add an injectable constructor? required by
com.corp.core.assembler.ResourceAssembler
com.corp.myapp.ui.activity.MyAppBaseActivity.resourceAssembler
Run Code Online (Sandbox Code Playgroud)
我看到MyAppBaseActivity它和生成的点文件中的依赖关系CroutonManager或ConnectionMonitor显示,所以根据这个评论,我希望这个工作.AFAIK如果出现问题,应该通过我用来生成点文件的编译器启用的构建来检测它.
更新:
我之前曾说过
在调试模式下它永远不会失败
但是在进一步测试之后并不是真的:在调试 …
所以我本周末花了很多时间在Mortar和Flow上,我想我终于完成了大部分工作.我发现它比我原先想象的要复杂一点,主要是因为我还没有完全理解Dagger的ObjectGraph Scoping,Mortar非常依赖它.我在Dagger的网站上已经阅读了尽可能多的内容,但是我发现这个主题的信息在与Dagger特别相关时缺乏.
所以我有几个问题:1.我看到他们对@ Singleton的范围的例子:
@Layout(R.layout.screen_friend)
public class FriendScreen implements Blueprint {
@Override public String getMortarScopeName() {
return getClass().getName();
}
@Override public Object getDaggerModule() {
return new Module();
}
@dagger.Module(
injects = FriendView.class
)
static class Module {
}
@Singleton
public static class Presenter extends ViewPresenter<TestView> {
@Inject
public Presenter() {
Log.d("FriendScreen", "Friend Presenter Created");
}
@Override protected void onLoad(Bundle savedInstanceState) {
super.onLoad(savedInstanceState);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Presenter是否专门针对此模块,因为它是一个内部类?2.如何确保仅在此对象图中创建它的实例而不是全局应用程序对象图?2.如果演示者太大了,我想把它移到它自己的独立课程怎么办?我如何将其范围仅限于此模块?3.我注意到他们示例中的某些Module类是静态的,而其他类则不是.这对范围界定有什么影响吗?4.我在哪里可以阅读更多内容以更好地理解Dagger的对象图.我需要更好地理解includes,inject,addsTo以及如何在ObjectGraph创建中使用它们等:
@dagger.Module( //
includes = ActionBarModule.class,
injects = MainView.class,
addsTo = ApplicationModule.class, //
library …Run Code Online (Sandbox Code Playgroud) 我是匕首的新手,最近我开始在自己的一个项目中使用匕首,因为能够以不同的方式处理依赖注入的概念用于测试和生产,因此能够注入我可以用于测试的模拟对象很棒.
我修改了我的应用程序,以遵循dagger simple-android示例中的样式.
设置完毕后,我发现注入存在问题,并且我无法使用测试逻辑完全超载生产应用程序中的注入.
我正在寻找关于如何设置它的建议,以便我的测试可以实际注入与模拟或其他对象的差异,以便根据需要进行测试,而不是过于愚蠢.目前,MainActivityTest被正确注入,但是当我们到达MainActivity时,它会转到PhoneApplication并使用它的对象图注入
我已经把我下面的内容包括在内了.任何帮助将不胜感激!
这是我的PhoneApplication,基于DemoApplication.
public class PhoneApplication extends Application {
private ObjectGraph graph;
@Override
public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(getModules().toArray());
}
protected List<Object> getModules() {
return Arrays.asList(new AndroidModule(this), new PhoneModule());
}
public void inject(Object object) {
graph.inject(object);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的AndroidModule
@Module(library = true, injects = MainActivity.class)
public class AndroidModule {
private final Context context;
public AndroidModule(Context context) {
this.context = context;
} …Run Code Online (Sandbox Code Playgroud) Google Dagger 2是关于对象范围的,例如,当您在http请求期间需要对象时,您需要使用提示方法注释@RequestScope.
但是,一些提供的资源需要被释放例如CloseableHttpClient需要被关闭或ExecutorService的需要是关机.
当使用Google Dagger 2超出范围时,如何指定必须采取哪些操作才能释放对象?
我有什么选项可以在Android应用程序中创建所有模型类的单个实例?
我在下面添加了一个示例模型类
public class User
{
private String email;
private String name;
public String getEmail() { return this.email; }
public void setEmail(String email) { this.email = email; }
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
}
Run Code Online (Sandbox Code Playgroud)
我希望一旦数据存储在Model Class中,就可以在任何活动,类或片段中检索它.我应该使用单身人士,还是有更好的方法?
dagger2会在这种情况下工作吗?dagger2是创建单身人士的替代方案吗?
谢谢
Dagger 1.2.2,Gradle 2.4,Eclipse 4.5.0 Mars on OSX 10.9.5.
在Eclipse中尝试运行JUnit测试失败:"请确保为此模块运行代码生成."
这是Eclipse中的Gradle项目,其版本如上所示.
JUnit测试从命令行成功运行("./gradlew clean test").
项目属性:Java编译器:注释处理显示:选中所有复选框.生成的代码转到.apt_generated.未指定处理器选项.
项目属性:Java编译器:注释处理:工厂路径显示:存在并检查dagger-compiler-1.2.2.jar,存在并检查javawriter-2.5.0,存在并检查dagger-1.2.2.jar.
org.eclipse.jst.ws.annotations.core存在但未检查(检查它和重建似乎没有任何区别).
"已检查"的罐子都是从我的〜/ .gradle/caches目录中获取的.
.apt_generated目录中没有任何内容(我收集生成的类文件应该出现在那里;我从未见过.)
思考?[编辑:添加缺失的单词"line"]
我想用Dagger在IntelliJ但不能用。Dagger使用注释处理器,我猜IntelliJ不了解注释处理器。
您可以看到生成的Java文件,它是由Dagger2编译器生成的,但是我的Java源代码找不到它们。即使我设置build.gradle为在我的Java文件和生成的Java文件之间连接。
这是我的整个源项目文件。
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
jcenter()
}
def generatedSources = "$buildDir/generated/src"
def generatedOutputDir = file("$generatedSources")
compileJava {
doFirst {
generatedOutputDir.exists() || generatedOutputDir.mkdirs()
options.compilerArgs = [
'-s', "${generatedSources}"
]
}
}
sourceSets {
main {
java {
srcDirs += generatedOutputDir
}
}
}
dependencies {
compile "com.google.dagger:dagger:2.0"
compile "com.google.dagger:dagger-compiler:2.0"
compile "com.squareup:otto:1.3.8"
compile 'io.reactivex:rxjava:1.0.13'
compile "org.glassfish:javax.annotation:10.0-b28"
testCompile "junit:junit:4.12"
testCompile "org.mockito:mockito-core:1.9.5"
}
compileJava.dependsOn clean
Run Code Online (Sandbox Code Playgroud) 我正在尝试将新的Architecture Components添加ViewModel到我的应用程序中,同时用匕首注入它们.我的代码基于google 在这里显示的内容.我试图避免ViewModelFactory为每种ViewModel类型使用,所以我使用了ViewModelFactory它Map<Class<? extends ViewModel>, Provider<ViewModel>> creators.它适用于ViewModels具有@Singleton范围的依赖项.但是,我的一个人ViewModels有一个来自片段的依赖.这是该片段的模块:
@Module
public abstract class DownloadIssueDialogFragmentModule {
@Binds
abstract DialogFragment dialogFragment(DownloadIssueDialogFragment dialogFragment);
@Provides
@FragmentScope
static Issue provideIssue(DownloadIssueDialogFragment dialogFragment) {
return dialogFragment.getIssue();
}
}
Run Code Online (Sandbox Code Playgroud)
我的ViewModelModule:
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(DownloadIssueViewModel.class)
abstract ViewModel bindDownloadIssueViewModel(DownloadIssueViewModel viewModel);
}
Run Code Online (Sandbox Code Playgroud)
匕首说不能提供Issue.它Map<Class<? extends ViewModel>, Provider<ViewModel>>似乎有意义,因为它似乎是在编译时创建的.但我只会知道该片段范围内的参数.我怎样才能做到这一点?
谢谢.
编辑:
最后,我采用了不同的方法.现在我为每个ViewModel创建一个工厂,而不是注入ViewModel,我注入了工厂.
我创建了这个库: …
android mvvm dagger dagger-2 android-architecture-components
我正在努力了解新的Dagger2 API和对Android的支持。我正在使用Dagger2版本2.15:
implementation 'com.google.dagger:dagger:2.15'
implementation 'com.google.dagger:dagger-android:2.15'
implementation 'com.google.dagger:dagger-android-support:2.15'
annotationProcessor 'com.google.dagger:dagger-compiler:2.15'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.15'
Run Code Online (Sandbox Code Playgroud)
现在,在此版本中有一些类似的类DaggerApplication,DaggerAppCompatActivity但是我不确定如何使它们工作。
到目前为止,这是我所做的:
我在清单中添加的Application类:
class BaseApplication : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().create(this)
}
}
Run Code Online (Sandbox Code Playgroud)
我的AppComponent:
@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class
])
interface AppComponent : AndroidInjector<BaseApplication> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<BaseApplication>()
}
Run Code Online (Sandbox Code Playgroud)
我在所有创建的其他活动中扩展的基本Activity类:
abstract class BaseActivity : DaggerAppCompatActivity() {
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试制作或构建项目时,它会失败,而Dagger不会DaggerAppComponent为我生成。我想念什么?
我的软件规格如下:
Android Studio 3.4
dagger-android 2.16
Run Code Online (Sandbox Code Playgroud)
我有以下类传递一个MapboxGeocoder将执行并返回响应的类.
class GeocodingImp(private val mapboxGeocoder: MapboxGeocoder) : Geocoding {
override fun getCoordinates(address: String, criteria: String): AddressCoordinate {
val response = mapboxGeocoder.execute()
return if(response.isSuccess && !response.body().features.isEmpty()) {
AddressCoordinate(
response.body().features[0].latitude,
response.body().features[0].longitude)
}
else {
AddressCoordinate(0.0, 0.0)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它MapboxGeocoder是在编译时在匕首模块中生成的.所以我必须为地址指定字符串TYPE_ADDRESS.
@Reusable
@Named("address")
@Provides
fun provideAddress(): String = "the address to get coordinates from"
@Reusable
@Provides
@Named("geocoder_criteria")
fun provideGeocoderCriteria(): String = GeocoderCriteria.TYPE_ADDRESS
@Reusable
@Provides
fun provideMapboxGeocoder(@Named("address") address: String, @Named("geocoder_criteria") geocoderCriteria: String): …Run Code Online (Sandbox Code Playgroud) dagger ×10
android ×5
dagger-2 ×5
java ×3
android-architecture-components ×1
eclipse ×1
gradle ×1
mvvm ×1
object-graph ×1
proguard ×1
scope ×1
testing ×1
unit-testing ×1