android - 依赖注入(inject)提供 Activity

标签 android dependency-injection dagger-2

我想添加一个 Activity 作为我的一个类的依赖项

class ViewHandler{
    @inject public ViewHandler(Myactivity myactivity){
        this.activity = myactivity;
    }
}

如何在不被 Activity 生命周期阻碍的情况下做到这一点

最佳答案

为此,您需要使用带有模块的子范围组件。

@Singleton
@Component(modules={SomethingModule.class})
public interface ApplicationComponent {
    Something something();
}

@Module
public class SomethingModule {
    @Provides
    @Singleton
    public Something something() {
        return new Something();
    }
}

@ActivityScope
@Component(dependencies={ApplicationComponent.class}, modules={MyActivityModule.class})
public interface MyActivityComponent extends ApplicationComponent {
    ViewHandler viewHandler();

    void inject(Myactivity myActivity);

}

@Module
public class MyActivityModule {
    private Myactivity myActivity;

    public MyActivityModule(Myactivity myActivity) {
        this.myActivity = myActivity;
    }

    @Provides
    public Myactivity myActivity() {
        return myActivity;
    }

    @Provides
    @ActivityScope
    public ViewHandler viewHandler(Myactivity myActivity) {
        return new ViewHandler(myActivity);
    }
}

public class CustomApplication extends Application {
    ApplicationComponent applicationComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        applicationComponent = DaggerApplicationComponent.create();
    }

    public ApplicationComponent getApplicationComponent() {
        return applicationComponent;
    }
}


public class Myactivity extends AppCompatActivity {
    MyActivityComponent myActivityComponent;

    @Inject
    ViewHandler viewHandler;

    @Override 
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        CustomApplication customApp = (CustomApplication)getApplicationContext();
        this.myActivityComponent = DaggerMyActivityComponent.builder()
            .applicationComponent(customApp.getApplicationComponent())
            .myActivityModule(new MyActivityModule(this))
            .build(); //preserve the state of your dependencies in onSaveInstanceState();
        myActivityComponent.inject(this);
    }
}

编辑:另一种选择是 @Subcomponent 注释

@Singleton
@Component(modules={SomethingModule.class})
public interface ApplicationComponent {
    Something something();

    MyActivityComponent newMyActivityComponent(MyActivityModule myActivityModule);
}

@ActivityScope
@Subcomponent(modules={MyActivityModule.class}) 
public interface MyActivityComponent {
    ViewHandler viewHandler();
    void inject(Myactivity myActivity);
}

public class Myactivity extends AppCompatActivity {
    MyActivityComponent myActivityComponent;

    @Inject
    ViewHandler viewHandler;

    @Override 
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        CustomApplication customApp = (CustomApplication)getApplicationContext();
        this.myActivityComponent = customApp.getApplicationComponent()
                                            .newMyActivityComponent(new MyActivityModule(this));
        myActivityComponent.inject(this);
    }
}

关于android - 依赖注入(inject)提供 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34379361/

相关文章:

android - Dagger : Can't provide Map<java. lang.Class<? extends android.arch.lifecycle.ViewModel> 没有 @Provides-annotated 方法

java - 无法在 Android 中使用更新的 Dagger 2.11 API

java - 第二次显示 ViewPager 时出现 NullPointerException

java - Android 中的套接字异常

android - 具有自定义字体和粗体样式的文本

c# - IoC/DI 框架与智能客户端 Winform 应用程序 : How should I approach this?

java - 了解 Dagger2 流程(提供的示例)

kotlin - kotlin 中的字段注入(inject)始终为空

java - 我想在长按时删除 ListView 上的项目

c++ - c++中的单虚拟继承编译器优化?