[译] 全新 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()
评论