[android]Dagger 2 不能提供没有构造函数

发布时间: 2017/3/19 19:17:30
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

对不起,我的英语,现在,我开始学习 dagger2,我不能理解为什么我会有错误︰

错误:(9, 10) 错误︰ 不能提供 test.dagger.dagger.modules.MainActivityPresenterModule,没有 @Inject 构造函数或从 @Provides-或 @Produces-annotated 方法。 test.dagger.dagger.modules.MainActivityPresenterModule 注射在 test.dagger.view.activitys.MainActivity.mainActivityPresenterModule test.dagger.view.activitys.MainActivity 被注入 test.dagger.dagger.components.AppComponent.injectMainActivity(mainActivity)

应用程序

public class App extends Application {

    private static AppComponent component;

    @Override
    public void onCreate() {
        super.onCreate();
        component = DaggerAppComponent.create();
    }

    public static AppComponent getComponent() {
        return component;
    }

}

AppComponent

@Component(modules = {MainActivityPresenterModule.class})
public interface AppComponent {
    void injectMainActivity(MainActivity mainActivity);
}

MainActivityPresenterModule

@Module
public class MainActivityPresenterModule {

    @Provides
    MainActivityPresenter provideActivityPresenter(NetworkUtils networkUtils) {
        return new MainActivityPresenter(networkUtils);
    }

    @Provides
    NetworkUtils provideNetworkUtils(){
        return new NetworkUtils();
    }


}

NetworkUtils

public class NetworkUtils {

    public boolean isConnection() {
        return true;
    }

}

MainActivityPresenter

public class MainActivityPresenter {

    NetworkUtils networkUtils;

    public MainActivityPresenter(NetworkUtils networkUtils) {
        this.networkUtils = networkUtils;
    }

    public void getUser(){
        if(networkUtils.isConnection()) {
            Log.e("getUser", "getUser");
        } else {
            Log.e("no internet", "no internet connection");
        }
    }

}

MainActivity

public class MainActivity extends AppCompatActivity {


    @Inject
    MainActivityPresenterModule mainActivityPresenterModule;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        App.getComponent().injectMainActivity(MainActivity.this);


    }
}

解决方法 1:

你可以注入只有用批注的类中提供的东西 @Module (只有使用批注的方法在该模块内 @Provides )。所以,你可以做 @Inject MainActivityPresenter presenter ,例如,不试着注入整个模块,像你试着做。应该在上注册模块 Dagger 初始化,像这样 (在 App #onCreate)

component = DaggerAppComponent.builder()
    .mainActivityPresenterModule(MainActivityPresenterModule())
    .build()

在 MainActivity 中你只需要调用注入能够注入你 @Inject MainActivityPresenter presenter 或任何其他注入模块中所定义,像这样︰

@Inject MainActivityPresenter presenter    

override fun onCreate(savedInstanceState: Bundle) {
   super.onCreate(savedInstanceState)
   (application as App).component.inject(this)

   // after #inject(this) above you can start using your injections:

   presenter.getUser()
}

对不起,我写的activity中作为它的代码段是少得多,可以这样写,希望你就在 Java 中的查找的想法。

赞助商