[译] 全新 Android 注入器 _ Dagger 2(三),android 开发架构方案
public AndroidInjector<android.app.Fragment
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 包的 Fragment 到 dagger。所以如果你想在 v4.fragment 中使用注入,那么你应该在你的 AppComponent modules 中添加 AndroidSupportInjectionModule.class。
我们改变了 AppComponent 的注入方式。那么 Application 类需要做什么改变。
跟 DaggerActivity 和 DaggerFragment 一样,我们也让 Application 类继承 DaggerApplication 类。
之前的 Application 类的代码如下:
public class AndroidSampleApp extends Application implements HasActivityInjector {
@InjectDispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;
@Overridepublic void onCreate() {super.onCreate();DaggerAppComponent.builder().application(this).build()











评论