Dagger 2.11及以上的简便用法

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 桥梁类,关联 AndroidSupportInjectionModuleAppModule 等 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 中重复的编写那段代码了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值