写点什么

[译] 全新 Android 注入器 _ Dagger 2(三),android 开发架构方案

用户头像
Android架构
关注
发布于: 刚刚

public AndroidInjector<android.app.Fragment


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


fragmentInjector() {return frameworkFragmentInjector;}}


从上面的代码可以看出 DaggerAppCompatActivity 跟我们自己写的 Activity 并没有多大的区别,所以可以让我们的 Activity 以继承 DaggerAppCompatActivity 的方式来减少模板代码。


DetailActivity 类如下:


public class DetailActivity extends AppCompatActivity implements HasSupportFragmentInjector, DetailView {


@InjectDispatchingAndroidInjector<Fragment> fragmentDispatchingAndroidInjector;


@InjectDetailPresenter detailPresenter;


@Overrideprotected void onCreate(Bundle savedInstanceState) {AndroidInjection.inject(this);super.onCreate(savedInstanceState);setContentView(R.layout.activity_detail);}


@Overridepublic void onDetailLoaded() {}


@Overridepublic AndroidInjector<Fragment> supportFragmentInjector() {return fragmentDispatchingAndroidInjector;}}


让我们的 DetailActivity 继承 DaggerAppCompatActivity 类,这样我们就不用让 DetailActivity 类实现 HasSupportFragmentInjector 接口以及重写方法了。


public class DetailActivity extends DaggerAppCompatActivity implements DetailView {


@InjectDetailPresenter detailPresenter;


@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_detail);}


@Overridepublic void onDetailLoaded() {}}


现在,是不是更简洁了。

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

看看还有哪些办法能够减少模板代码。我发现 AndroidInjector 能够帮助简化 AppComponent。你可以通过阅读 AndroidInjector 相关文档来获取相关信息。


下面是 AppComponent 类的代码。


@Component(modules = {AndroidInjectionModule.class,AppModule.class,ActivityBuilder.class})public interface AppComponent {


@Component.Builderinterface Builder {@BindsInstance Builder application(Application application);AppComponent build();}


void inject(AndroidSampleApp app);}


build()seedInstance() 方法已经在 AndroidInjector.Builder 抽象类中定义了,所以我们的 Builder 类可以通过继承 AndroidInjection.Builder<Application> 来去掉上面代码中 application()build() 这两个方法。


同样的,AndroidInjector 接口中已经有 inject() 方法了。所以我们可以通过继承 AndroidInjector<Application> 接口(接口是可以继承接口的)来删除 inject() 方法。


那么我们简化后的 AppComponent 接口的代码如下:


@Component(modules = {AndroidSupportInjectionModule.class,AppModule.class,ActivityBuilder.class})interface AppComponent extends AndroidInjector<AndroidSampleApp> {@Component.Builderabstract class Builder extends AndroidInjector.Builder<AndroidSampleApp> {}}


你有没有意识到我们的 modules 属性也改变了?我从 @Component 注解的 modules 属性中移除了 AndroidInjectionModule.class 并且添加了 AndroidSupportInjectionModule.class。这是因为我们使用的是支持库(v4 库)的 Fragment。而 AndroidInjectionModule 是用来绑定 app 包的 Fragmentdagger。所以如果你想在 v4.fragment 中使用注入,那么你应该在你的 AppComponent modules 中添加 AndroidSupportInjectionModule.class


我们改变了 AppComponent 的注入方式。那么 Application 类需要做什么改变。


DaggerActivityDaggerFragment 一样,我们也让 Application 类继承 DaggerApplication 类。


之前的 Application 类的代码如下:


public class AndroidSampleApp extends Application implements HasActivityInjector {


@InjectDispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;


@Overridepublic void onCreate() {super.onCreate();DaggerAppComponent.builder().application(this).build()

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
[译] 全新 Android 注入器 _ Dagger 2(三),android开发架构方案