android 注入框架-Dagger2-Module构造方法传参

    xiaoxiao2022-06-24  185

    1.环境创建

    Module:app dependencies { implementation 'com.google.dagger:dagger:2.8' annotationProcessor "com.google.dagger:dagger-compiler:2.8" annotationProcessor 'org.glassfish:javax.annotation:10.0-b28' }

    2.创建实例化的类

    package com.example.dagger2test2; import android.util.Log; public class LoginCtrl { private LoginStore mLoginStore; public LoginCtrl(LoginStore store){ mLoginStore = store; } public void login(String name,String pass){ Log.e("tag@@", "name:"+name+" pass:"+pass); } }

    3.创建module类

    package com.example.dagger2test2; import android.content.Context; import dagger.Module; import dagger.Provides; @Module public class LoginModule { private Context mContext; //供给LoginStore使用 public LoginModule(Context context){ mContext = context; } //为LoginStore提供构造参数 @Provides Context provideStoreContext(){ return mContext; } @Provides LoginCtrl provideLoginCtrl(LoginStore storet){ return new LoginCtrl(storet); } }

    4.创建Component接口

    package com.example.dagger2test2; import dagger.Component; @Component(modules = LoginModule.class) public interface LoginComponent { //要添加方法,方法必须添加参数,参数类型必须和调用时候一致 void inject(MainActivity activity); }

    5.创建实例化的类的参数LoginStore

    package com.example.dagger2test2; import android.content.Context; import javax.inject.Inject; public class LoginStore { private Context mContext; //这里@Inject构造方法,然后在Module类里面还需要Provide一个String的方法 @Inject public LoginStore(Context mContext) { this.mContext = mContext; MainActivity activity = (MainActivity)mContext; activity.changeHelloWord("LoginStore call"); } }

    6.在Activity注入

    package com.example.dagger2test2; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import javax.inject.Inject; public class MainActivity extends AppCompatActivity { @Inject LoginCtrl loginCtrl; //注入的方式实例化LoginCtrl @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化注入,inject是LoginComponent接口里面自定义的方法; DaggerLoginComponent.builder() .loginModule(new LoginModule(this)) .build() .inject(this); // 然后就可以调用loginCtrl里面的方法了 loginCtrl.login("tianping","pass"); } public void changeHelloWord(String str){ TextView textView = findViewById(R.id.hl_id); textView.setText(str); } }

    运行效果 7.关系分析

    8.生成的源码

    // Generated by dagger.internal.codegen.ComponentProcessor (https://google.github.io/dagger). package com.example.dagger2test2; import android.content.Context; import dagger.MembersInjector; import dagger.internal.Preconditions; import javax.inject.Provider; public final class DaggerLoginComponent implements LoginComponent { private Provider<Context> provideStoreContextProvider; private Provider<LoginStore> loginStoreProvider; private Provider<LoginCtrl> provideLoginCtrlProvider; private MembersInjector<MainActivity> mainActivityMembersInjector; private DaggerLoginComponent(Builder builder) { assert builder != null; initialize(builder); } public static Builder builder() { return new Builder(); } @SuppressWarnings("unchecked") private void initialize(final Builder builder) { this.provideStoreContextProvider = LoginModule_ProvideStoreContextFactory.create(builder.loginModule); this.loginStoreProvider = LoginStore_Factory.create(provideStoreContextProvider); this.provideLoginCtrlProvider = LoginModule_ProvideLoginCtrlFactory.create(builder.loginModule, loginStoreProvider); this.mainActivityMembersInjector = MainActivity_MembersInjector.create(provideLoginCtrlProvider); } @Override public void inject(MainActivity activity) { mainActivityMembersInjector.injectMembers(activity); } public static final class Builder { private LoginModule loginModule; private Builder() {} public LoginComponent build() { if (loginModule == null) { throw new IllegalStateException(LoginModule.class.getCanonicalName() + " must be set"); } return new DaggerLoginComponent(this); } public Builder loginModule(LoginModule loginModule) { this.loginModule = Preconditions.checkNotNull(loginModule); return this; } } }

    最新回复(0)