Dagger 2.11及以上的简便用法
关于 Dagger2 的使用网上有很多的例子,这里就不在多说了。但是dagger2在使用的过程中我们几乎需要在每个页面去调用类似代码如下:
MainComponent component = DaggerMainComponent.builder()
.mainModule(new MainModule()).build();
component.inject(this);
虽然我们会在Base类中进行各种封装,但是不管怎么样都会有些不尽人意,仍然需要在每个页面重写部分代码,但是在 dagger 2.11 中已经完美的解决的这个问题。虽然在 dagger 2.11 版本就可以,但是建议使用最新的版本,至少 dagger 2.15 以上,在这篇文章的代码使用的 dagger 2.20 进行编写。
下面就使用这种简便方法集成 dagger 到项目中(看以下代码需要对dagger2的用法基本了解)。
1.在 build.gradle 文件中导入 dagger 相关库
implementation 'com.google.dagger:dagger-android:2.20'
implementation 'com.google.dagger:dagger-android-support:2.20' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.20'
annotationProcessor 'com.google.dagger:dagger-compiler:2.20'
2.新建 AppModule.java 文件
@Module
public class AppModule {
@Provides
public ArrayList<String> provideArrayList(){
return new ArrayList<>();
}
@Provides
public HashMap<String,String> providerHashMap(){
return new HashMap<>();
}
}
这是一个Module,作用就是创建实例对象。AppModule 用于创建全局共用的实例对象。
3.新建 ActivityBuilder.java 文件 和 FragmentBuilder.java 文件
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector()
abstract MainActivity bindMainActivity();
@ContributesAndroidInjector(modules = SecondActivityModule.class)
abstract SecondActivity bindSecondActivity();
}
@Module
public abstract class FragmentBuilder {
@ContributesAndroidInjector()
abstract Fragment1 buildFragment1();
@ContributesAndroidInjector()
abstract Fragment2 buildFragment2();
}
所有的页面都需要在这2个文件中进行注册,ActivityBuilder 注册 Activity,FragmentBuilder 注册 Fragment;当然,也可以放在一个类中,这里为了便于区分 Activity 和 Fragment ,所以创建2个类。
注解:@ContributesAndroidInjector
为必须,参数 modules
可选,表示在这个页面需要创建额外的(独立的)实例对象,如:
@Module
public class SecondActivityModule {
@Provides
public ArrayList<Fragment> provideList(){
return new ArrayList<>();
}
}
4.建立 AppComponent
桥梁类,关联 AndroidSupportInjectionModule
、AppModule
等 Module
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class, ActivityBuilder.class, FragmentBuilder.class})
public interface AppComponent extends AndroidInjector<MyApplication> {
@Override
void inject(MyApplication instance);
}
5.重写 Application
继承 DaggerApplication
public class MyApplication extends DaggerApplication {
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
AppComponent appComponent = DaggerAppComponent
.builder()
.build();
appComponent.inject(this);
return appComponent;
}
}
6.在 Activity
或者 Fragment
中使用
Activity
继承 DaggerAppCompatActivity
public class MainActivity extends DaggerAppCompatActivity {
@Inject
ArrayList<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list.add("aaa");
list.add("bbb");
tvContent.setText("==> " + list);
}
}
Fragment
继承 DaggerFragment
public class Fragment1 extends DaggerFragment {
public static Fragment1 newInstance() {
Fragment1 fragment1 = new Fragment1();
return fragment1;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, null);
return view;
}
}
这样的话,我们就不需要在每个 Activity
或者 Fragment
中重复的编写那段代码了