每当我注入kotlin类时,我都会在构建中得到这个注释(顺便说一下,我有一个混合的android项目同时使用kotlin和java).
例如,在这个gradle任务之后:compileStagingDebugJavaWithJavac(StagingDebug是我的构建变体),我收到以下消息:
"注意:为com.packageNameXXX.CourseDiscoveryMapFragment生成一个MembersInjector或Factory.更喜欢在该类上运行dagger处理器."
我的CourseDiscoveryMapFragment代码可以在这里看到:
class CourseDiscoveryMapFragment : Fragment(){
@Inject
lateinit var presenter: CourseDiscoveryMapPresenter
lateinit var mapView: MapView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_discovery_map, container, false)
MapsInitializer.initialize(activity)
mapView = view.mapView
mapView.onCreate(savedInstanceState?.getBundle(BUNDLE_KEY_MAP_STATE))
(activity as BaseActivity)
.activityComponent.inject(this)
}
Run Code Online (Sandbox Code Playgroud)
我的ActivityComponent是:
@ActivityScope
@Subcomponent(modules = ActivityModule.class)
public interface ActivityComponent {
void inject(BaseActivity baseActivity);
void inject(CourseDiscoveryMapFragment fragment);
//Exposed to sub-graphs.
Activity activity();
}
Run Code Online (Sandbox Code Playgroud)
所以,我有用Java编写的匕首组件和模块,同时在Kotlin中进行匕首注射.
这是我应该担心的吗?
谢谢.
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和Butterknife之间的区别?我知道Butterknife是一个视图注入库,而Dagger是一个依赖注入库.但是在线文档对我来说似乎有些开销.根据Butterknife的文档,您也可以进行非活动注射,这是Dagger的作用吗?还是我误解了什么?
我正在评估Android应用程序的依赖注入(DI)框架.最有力的竞争者是:Dagger(有Butter Knife)和Android Annotations.据我所知,Dagger和ButterKnife来自同一个源头,他们相互补充.这是我正在寻找的关键矩阵:
android dependency-injection android-annotations dagger butterknife
所以我在Android文章中遇到了关于内存性能的最佳实践.
http://developer.android.com/training/articles/memory.html
他们说
避免依赖注入框架
使用依赖注入框架(如Guice或RoboGuice)可能很有吸引力,因为它们可以简化您编写的代码并提供对测试和其他配置更改有用的自适应环境.但是,这些框架倾向于通过扫描代码进行注释来执行大量进程初始化,这可能需要将大量代码映射到RAM中,即使您不需要它也是如此.这些映射页面被分配到干净的内存中,因此Android可以删除它们,但是直到页面长时间留在内存中才会发生这种情况.
但他们声称快速的Dagger呢?不确定我应该去哪一个?
我有一个简单的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上有适当的应用程序示例?
我正在尝试将Dagger添加到我的android项目中.对于应用程序项目,我很容易清楚,如何构建ObjectGraph.但我不知道在我的android库项目中最好的方法是什么.
我应该继续在应用程序的Application类中构建ObjectGraph并将OG传递给LibraryModule - 将库的OG插入到Apps OG中吗?或者我应该在库中构建整个ObjectGraph?
如果我需要在库中注入一个类ObjectGraph.inject(this)怎么办?在我的Apps项目中,我可以从Application类中获取OG.但是如何在图书馆处理这个?我应该为ObjectGraph添加@Provides方法吗?
非常感谢你的帮助.
编辑:简而言之:如何ObjectGraph.inject(this)在我的库项目中调用我无法访问OG的项目,因为它正在Application类中构建?