到目前为止我们使用Dagger创建的对象都Application级别,即和整个应用的生命周期相同的。那还有很多情况是我们需要创建的对象是和Activity或者Fragement生命周期绑定的。最好的做法是不同生命周期的对象应该有不同的Component,这样会避免很多麻烦。
还记得最初要做的那个例子吗?就是在ListView中展示Feed流信息。这样我们就需要一个Adapter来填充ListView。是不是下意识的在Activity中new一个Adapter ?既然是new一个话是不是相当于形成了依赖关系?那么为什么不用Dagger呢!编写一个HomeActivityComponent:
同时也要添加对应的Module提供所需的依赖。每次写完都需要build,这样Dagger才能帮我们生成代码。
这里面遇到一个问题,就是初始化AdapterRepos时需要Picasso对象。而Picasso在GithubApplicationComponent里提供。这时就需要告诉Dagger使用GithubApplicationComponent里提供的Picasso。代码如下:
不难看出,除了在HomeActivityModule提供依赖外,也在告诉Dagger如果在HomeActivityModule里找不到依赖的时候可以到GitHubApplicationComponent中找一找。(注意红色方框中的代码,
modules = HomeActivityModule.class, dependencies = GithubApplicationComponent.class
)那么在初始化这个Component的时候就需要做一些特殊的处理,把从Application中获取的component传到HomeActivityComponent中。代码如下:
事实上我们还可以在HomeActivityComponent添加
Picasso getPicasso();
和GithubService getGithubService();
两个方法,这样我们就不必在Application中提供这两个类,Application中的代码进一步简化。这其实就是Dagger使用的精华所在。这篇文章其实也是想讲Component之间的配合,希望可以从中学会如何使用。下篇文章将要讲@Inject的使用。
相关文章:
从实例出发理解Dagger2(一)
从实例出发理解Dagger2(二)
从实例出发理解Dagger2(三)
从实例出发理解Dagger2(四)
从实例出发理解Dagger2(五)
从实例出发理解Dagger2(六)
从实例出发理解Dagger2(七)
参考资料:https://www.youtube.com/watch?v=-Xk1LNrjarw&list=PLuR1PJnGR-Ih-HXnGSpnqjdhdvqcwhfFU&index=6