Dagger2最简单注入使用

最为一个新手,关于Dagger2,在网上找了一天都是对新手不友好的博客,啥的不懂就直接把很多东西用上了。只能慢慢来了。

First:关于添加Dagger2的依赖

//增加部分
apply plugin: 'com.neenbedankt.android-apt'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }

dependencies {
      ..
      ..
      ..
    compile 'com.android.support:appcompat-v7:23.1.1'
    apt 'com.google.dagger:dagger-compiler:2.0'
    compile 'com.google.dagger:dagger:2.0'
    compile 'org.glassfish:javax.annotation:10.0-b28'
}

Dagger2最简单的依赖注入一个类:

//想要注入的类
public class ToastUtils {
    public Context context;
    public ToastUtils(Context context){
        this.context=context;
    }
    public void showToast(String text) {
        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
    }
}

此时在Activity中:

public class MainActivity extends AppCompatActivity {
    @Inject
    public ToastUtils toastUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         toastUtils.showToast("Activity");
    }
}

运行一下会发现报空指针。因为再次虽然申明要注入ToastUtils,但是没有真正注入进来,因为“药物”(ToastUtils)有了,“病人”(Activity)有了,还少了中间的“针”和”筒”,这个“筒”就是“Module”,用来存放ToastUtils,“针”是“Component”,用来将其注入到目标。

//筒
@Module
public class AppModule {
    public Context context;
    public AppModule(Context context){
        this.context=context;
    }

    @Provides
    ToastUtils provideToastUtils(){
        return new ToastUtils(context);
    }
}
//针
@Component(modules = {AppModule.class})
public interface AppComponent {
    void inject(MainActivity activity);
}

万事俱备,现在就可以往activivty中真正注入“ToastUtils”了

public class MainActivity extends AppCompatActivity {
    @Inject
    public ToastUtils toastUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DaggerAppComponent.builder().appModule(new AppModule(this)).build().inject(this);
        toastUtils.showToast("Activity");
        setContentView(R.layout.activity_main);

    }
}

PS:这里的AppComponent会自动在app/build/generated/source/apt下生成DaggerAppComponent
下面贴上此AppComponent生成的DaggerAppComponent代码

@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerAppComponent implements AppComponent {
  private Provider<ToastUtils> provideToastUtilsProvider;
  private MembersInjector<MainActivity> mainActivityMembersInjector;

  private DaggerAppComponent(Builder builder) {  
    assert builder != null;
    initialize(builder);
  }

  public static Builder builder() {  
    return new Builder();
  }

  private void initialize(final Builder builder) {  
    this.provideToastUtilsProvider = AppModule_ProvideToastUtilsFactory.create(builder.appModule);
    this.mainActivityMembersInjector = MainActivity_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), provideToastUtilsProvider);
  }

  @Override
  public void inject(MainActivity activity) {  
    mainActivityMembersInjector.injectMembers(activity);
  }

  public static final class Builder {
    private AppModule appModule;

    private Builder() {  
    }

    public AppComponent build() {  
      if (appModule == null) {
        throw new IllegalStateException("appModule must be set");
      }
      return new DaggerAppComponent(this);
    }

    public Builder appModule(AppModule appModule) {  
      if (appModule == null) {
        throw new NullPointerException("appModule");
      }
      this.appModule = appModule;
      return this;
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值