【问题标题】:Dagger 2: inject an interface in a constructorDagger 2:在构造函数中注入接口
【发布时间】:2018-06-08 00:07:53
【问题描述】:

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

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) 错误:com.imennmn.hellodagger2example.MainView 不能 在没有 @Provides-annotated 方法的情况下提供。 com.imennmn.hellodagger2example.MainView 被注入到 com.imennmn.hellodagger2example.presenterInjection.PresenterModule.provideMainPresenter(mainView) com.imennmn.hellodagger2example.MainPresenter 被注入 com.imennmn.hellodagger2example.MainActivity.mainPresenter com.imennmn.hellodagger2example.MainActivity 被注入 com.imennmn.hellodagger2example.simpleInjection.DataComponent.inject(activity)

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

【问题讨论】:

    标签: java android dependency-injection dagger-2 dagger


    【解决方案1】:

    通过以下代码:

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

    你在告诉 dagger:“嘿,每当我要求你注入 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();

    【讨论】:

      【解决方案2】:

      您的provideMainPresenter 隐式依赖于MainView。匕首没有办法得到它。您需要添加一个方法来提供它:

      @Module
      public class PresenterModule {
      
          @Provides
          MainView provideMainView(){
              // Provide MainView here somehow so Dagger can use this to create a MainPresenter
          }
      
          @Provides
          // this is the method that will provide the dependancy
          MainPresenter provideMainPresenter(MainView mainView){
              return new MainPresenter(mainView);
          }
      }
      

      【讨论】:

        【解决方案3】:

        添加带有@Binds注解的抽象模块,看看我的实现:AbstractTestSettingsFragmentModule.java

        TestFragment.java

        public class TestFragment extends Fragment{
        
            @Inject TestFragmentContract.Presenter mPresenter;
        
            @Override
            public void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                AndroidSupportInjection.inject(this);
        
            }
        
         }
        

        TestFragmentPresenterImpl.java

        public class TestFragmentPresenterImpl implements TestFragmentContract.Presenter {
        
            @Inject
            public TestFragmentPresenterImpl(){
            }
        }
        

        AbstractTestSettingsFragmentModule.java

        @Module
        public abstract class AbstractTestSettingsFragmentModule {
        
            @Binds
            @NonNull
            public abstract TestSettingsFragmentContract.Presenter testSettingsFragmentPresenterImpl(TestSettingsFragmentImpl presenter);
        
        }
        

        ContributesModule.java

           @Module
            public abstract class ContributesModule {
        
                @ContributesAndroidInjector(modules = {AbstractTestSettingsFragmentModule.class})
                abstract TestSettingsFragment testSettingsFragment();
            }
        

        AppComponent.java

        @Singleton
        @Component(
                modules = {
                        AndroidSupportInjectionModule.class,
                        ContributesModule.class,
                        AppModule.class,
                      })
        public interface AppComponent extends AndroidInjector<DaggerApplication> {
        
            void inject(TheApplication theApplication);
        
            @Override
            void inject(DaggerApplication instance);
        
            @Component.Builder
            interface Builder {
        
                @BindsInstance
                Builder application(Application application);
        
                AppComponent build();
        
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-01
          • 2015-11-11
          • 1970-01-01
          • 1970-01-01
          • 2019-02-23
          • 2017-12-24
          • 1970-01-01
          相关资源
          最近更新 更多