问题描述
对不起,我的英语,现在我开始学习dagger2,我无法理解为什么有错误:
错误:(9,10)错误:没有@Inject构造函数或@ Provides-或@ Produces-注释方法无法提供test.dagger.dagger.modules.MainActivityPresenterModule。 将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();
}
}
网络实用程序
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");
}
}
}
主要活动
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
或模块中定义的任何其他注入,如下所示:
@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()
}
抱歉,我用Kotlin编写了代码片段,因为用这种方式编写的代码要少得多,希望您对它在Java中的外观有所了解。