java - Dagger 2 : inject an interface in a constructor

标签 java android dependency-injection dagger-2 dagger

我正在尝试学习 dagger 2,但我对使用接口(interface)注入(inject)构造函数感到困惑。这是我的以下代码:

MainActivity.java

public class MainActivity extends AppCompatActivity implements MainView {

    // this keyword of request dependency . At compiling process, dagger will look at all of these annotations
    //to create the exact dependency

    @Inject MainPresenter mainPresenter ;
    TextView textView ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textview) ;
        DaggerPresenterComponent.create().inject(this);
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                mainPresenter.doThings(8555) ;
            }
        });

    }

    /**********************************/

    @Override
    public void invokeRandomViewMethod(String msg) {
        textView.setText(msg);
    }
}

MainPresenter.java

public class MainPresenter {

    private MainView mainView ;

    @Inject
    public MainPresenter(MainView mainView) {
        this.mainView = mainView;
    }

    public void doThings(int value){
        Random random = new Random();
        int rand= random.nextInt(value) ;
        if(mainView != null){
            mainView.invokeRandomViewMethod("You random number is "+rand);
        }
    }

public interface MainView {
    void invokeRandomViewMethod(String msg) ;
}
}

这是模块:

@Module
public class PresenterModule {

    @Provides
        // this is the method that will provide the dependancy
    MainPresenter provideMainPresenter(MainView mainView){
        return new MainPresenter(mainView);
    }
}

这是组件

@Component (modules = PresenterModule.class)
public interface PresenterComponent {
    void inject(MainActivity activity) ;
}

当我运行代码时,它显示了这个错误:

Error:(15, 10) error: com.imennmn.hellodagger2example.MainView cannot be provided without an @Provides-annotated method. com.imennmn.hellodagger2example.MainView is injected at com.imennmn.hellodagger2example.presenterInjection.PresenterModule.provideMainPresenter(mainView) com.imennmn.hellodagger2example.MainPresenter is injected at com.imennmn.hellodagger2example.MainActivity.mainPresenter com.imennmn.hellodagger2example.MainActivity is injected at com.imennmn.hellodagger2example.simpleInjection.DataComponent.inject(activity)

我的问题是如何通过用 Dagger 注入(inject)接口(interface) MainView 并绑定(bind) MainPresenter 和 MainActivity 来提供接口(interface)? 任何帮助,将不胜感激 !

最佳答案

通过以下代码:


    MainPresenter provideMainPresenter(MainView mainView) {
        return new MainPresenter(mainView);
    }

你在告诉 dagger:“嘿,每当我要求你注入(inject) MainPresenter 时,请使用 MainView 构建它”。 但是尖锐的提示,因为你没有具体说明他应该如何构建/获取 MainView

因此,在您的 PresenterModule 中执行此操作:


    @Module
    public class PresenterModule {

        MainView mainView;

        public PresenterModule(MainView mainView) {
            this.mainView = mainView;
        }

        @Provides
        MainPresenter provideMainPresenter() {
            return new MainPresenter(mainView);
        }

    }

然后在构建组件时:


    DaggerPresenterComponent.builder()
                            .presenterModule(new PresenterModule(this))
                            .build();

关于java - Dagger 2 : inject an interface in a constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47990601/

相关文章:

android - 在 Android 中使用相机拍照时出现致命信号 11 和奇怪的错误消息

java - 从 android 中的 SeekBar 获取值

go - 在 go 中使用接口(interface)进行依赖注入(inject)

c# - Ninject:将客户端的程序集作为构造函数参数传递并使用属性从客户端指定所需的实现

java - Play 中的 restful POST

java - Android Manifest - "Has No Default Constructor"带有 Activity/Runnable 类

android - 我们可以在编译期间或编译后为 android 更改比特率或将比特率传递给 opus 编解码器吗

c# - 测试友好的架构

java - 如何简单地控制 Java SE 中的模块依赖关系

java: 不能在抽象类中使用构造函数