Android 安卓匕首2

Android 安卓匕首2,android,dependency-injection,dagger,Android,Dependency Injection,Dagger,我对Android中的Dagger2感到困惑。 我使用两个示波器@单态,@PerActivity 这是我的密码。我简化了我的代码 //ApplicationComponent.java @Singleton @Component(modules = {ApplicationModule.class}) public interface ApplicationComponent { @Named("packageName") String packageName(); } //Appl

我对Android中的Dagger2感到困惑。 我使用两个示波器@单态,@PerActivity

这是我的密码。我简化了我的代码

//ApplicationComponent.java
@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    @Named("packageName") String packageName();
}


//ApplicationModule.java
@Module
public class ApplicationModule {  

    @Provides
    @Singleton
    public Context provideApplicationContext() {
        return MyApplication.getContext();
    }

    @Provides
    @Singleton
    @Named("packageName")
    public String providePackageName(Context context) {
        return context.getPackageName();
    }
}

//UserComponent.java
@PerActivity
@Component(modules = {UserModule.class})
public interface UserComponent {
    void inject(MainActivity activity);
}

//UserModule.java
@Module
public class UserModule {
    String packageName;

    public UserModule(String packageName) {
        this.packageName = packageName;
    }


    @Provides
    @PerActivity
    UserRepositoryImpl provideUserRepositoryImpl() {
        return new UserRepositoryImpl(packageName);
    }
}
对于InjectAppVersion,用户模块中的packagename

DaggerChatComponent.builder()
                .userModule(new UserModule(getApplicationComponent().packageName()))
                .build();

但是看起来不太好。当使用不同的作用域时,如何进行注入???

您的应用程序模块.java是正确的

@Module
public class ApplicationModule {

    private Application application;

    public ApplicationModule(Application application){
        this.application = application;
    }

    @Provides
    @Singleton
    Context provideContext(){
        return application;
    }

    @Provides
    @Singleton
    @Named("packagename")
    public String providePackageName(Context context) {
        return context.getPackageName();
    }
}
而且它的组件类也是正确的ApplicationComponent.java

@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {


    @Named("packagename") String providepackagename();
}
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {
}
但是在UserModule.java中,您不需要传递包名对象,dagger的对象图可以为您完成这项工作

@Module
public class UserModule {


    public UserModule() {
    }


    @Provides
    @PerActivity
    UserRepositoryImpl provideUserRepositoryImpl(@Named("packagename") String packageName) {
        return new UserRepositoryImpl(packageName);
    }
}
下一步是在为该模块编写组件类时,将应用程序组件添加为依赖项,即UserComponent.java如下所示

@PerActivity
@Component(dependencies = {ApplicationComponent.class},modules = {UserModule.class})
public interface UserComponent {

    void inject(MainActivity mainActivity);
}
活动范围为PerActivity.lava

@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {


    @Named("packagename") String providepackagename();
}
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {
}
在本例中,UserRepositoryImpl.javaas

class UserRepositoryImpl {

    private String packagename;

    public UserRepositoryImpl(String packagename){

        this.packagename = packagename;
    }

    String getPackagename(){
        return packagename;
    }
}
您最终可以将其注入到活动中