Dagger和ButterKnife在Android中的区别

69
有人能指出 DaggerButterknife 的区别吗?我知道 Butterknife 是一个视图注入库,而 Dagger 是一个依赖注入库。但是在线文档对于我来说有些过于复杂了。根据 Butterknife 文档所述,你也可以进行非活动注入,这就是 Dagger 所做的事情?或者我理解错了什么?
5个回答

98
ButterKnife的目标是仅注入视图。非活动注入意味着您可以提供自己的视图根来注入视图(例如手动膨胀的视图等)。 Dagger要复杂一些。只要指定了满足这些依赖项的Module类(或者您可以使用构造函数注入),它就可以注入任何您想要的东西。 总之,我会说ButterKnife帮助您避免创建视图的所有样板代码(也称为(TextView)findViewById(R.id.some_text_view);)。不更多。在幕后,它仍然执行所有那些无聊的代码。因此,它并不真正注入。 还值得一提的是,Jake Wharton是这两个很棒的库的开发人员之一。 以下是一些有用的链接: GitHub上的Dagger示例项目 Devoxx上的Dagger演示(Jake Wharton)

Dagger与Dagger开发人员的聚会

没有太多有用的ButterKnife链接。它非常简单和直接,希望你不需要任何帮助。


2
那么你的意思是我们可以使用Dagger来注入TextView、EditText等控件吗? - user2511882
2
我相信您可以使用限定符(请参见Dagger文档中的QUALIFIERS部分)在Dagger中注入视图,其中您将ID作为限定符传递,但这看起来确实很奇怪。如果Dagger的创建者发现有人正在使用Dagger进行视图注入,他们可能会感到非常惊讶:) 但从技术上讲,我没有看到任何理由它不能工作... - Pavel Dudka
2
说实话,在网上关于如何使用Dagger、ButterKnife的文档并不多。我正在寻找一些教程,但是找不到任何有用的。而且官方文档似乎对我来说有点过于繁琐,难以掌握所有内容。无论如何,我会接受你的答案,但如果你能提供一些有用的链接,那就太好了。干杯! - user2511882
96
如果你使用Dagger来尝试注入视图,你会遇到很多问题 :) 试着把Butter Knife看作是绑定视图的一种方式,而不是注入。我之所以称它为注入,是因为所有转换为RoboGuice的人都在抱怨缺乏Dagger中的“视图注入”。但实际上它并不是真正的注入。就像答案中提到的那样,这只是一种减少样板代码的方法。在底层,它只是像你平常调用findViewById一样! - Jake Wharton
1
依我看,Dagger和Butterknife两者相辅相成。我们可以在项目中同时使用它们。 - Abhishek Jain
显示剩余3条评论

5

@JakeWharton在评论中部分回答了这个问题:

简而言之:它们互补。使用Butterknife注入视图,Dagger注入其余部分。

如果你试图使用Dagger来注入视图,你会遇到很多麻烦 :) 尝试把Butter Knife看作是绑定视图的一种方式,而不是注入。我只是称它为注入,因为所有的RoboGuice转换者都在抱怨Dagger缺乏“视图注入”。实际上它并不是注入。正如答案所提到的,它只是一种减少样板代码的方法。在底层,它只是像你一样调用findViewById!


1
难怪在最新版本中被重命名为“ViewBinder”。 - EpicPandaForce

5
这里是Butterknife文档的链接。它非常简单明了。然而,文档没有提到但是Butter Knife的设计暗示着你也可以在自定义视图中使用Butter Knife。只需将“this”替换为“context”或“getContext”,以确定范围。

Link: http://jakewharton.github.io/butterknife/

我在我的项目中结合使用Butter Knife、parcelable和easyAdapter来处理列表视图。原因是减少样板代码,并且通过使用parcelable可以更快速、更清晰地实现打包。因此,如果您有很多ListViews,我建议使用这种方法。

链接:

https://github.com/johncarl81/parceler

https://github.com/ribot/easy-adapter


4
区别很明显:Butter Knife就像Dagger,只是无限不锋利。正如文档所指出的那样。

4
我实际上在文档中读到了这个,但最终来到这里是为了更好的解释。 - Maurice Gavin
但是使用Dagger只会导致更多的样板代码用于视图绑定,因为你必须转换任何可能获取的View子类。ButterKnife在编译时确定转换类型。你无法告诉Dagger这样做。 - Louis CAD
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - naXa stands with Ukraine

0

ButterKnife旨在简化注册点击监听器并减少findViewById()调用提供的样板代码。

Dagger和Dagger2是通用依赖注入系统。

忽略Guice和MVVM上的文本,阅读Dependency InjectionThe Android Way。这基本上回答了Dagger的目的和简化。

https://spring.io/blog/2011/08/26/clean-code-in-android-applications


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,