Java 匕首2不工作
我正试图通过构造函数注入为我的Java 匕首2不工作,java,android,dagger,Java,Android,Dagger,我正试图通过构造函数注入为我的片段注入一个演示者(这样我就不需要为演示者创建@提供方法) 我相信我做的是正确的,但我仍然收到以下错误: 如果没有@Provides-或@products注释方法,则无法提供MainFragmentPresenter 以下是我的设置: ApplicationComponent.java @Singleton @Component( modules = { NetworkModule.class } )
片段
注入一个演示者(这样我就不需要为演示者创建@提供
方法)
我相信我做的是正确的,但我仍然收到以下错误:
如果没有@Provides-或@products注释方法,则无法提供MainFragmentPresenter
以下是我的设置:
ApplicationComponent.java
@Singleton
@Component(
modules = {
NetworkModule.class
}
)
public interface ApplicationComponent {
NetworkService networkService();
}
@PerFragment
@Component(
dependencies = ApplicationComponent.class,
modules = MainFragmentPresenterModule.class
)
public interface MainFragmentComponent {
MainFragmentView view();
void inject(MainFragment mainFragment);
}
@Module
public class MainFragmentPresenterModule {
private final MainFragmentView _view;
public MainFragmentPresenterModule(MainFragmentView view) {
_view = view;
}
@Provides
@PerFragment
MainFragmentView provideMainFragmentView() {
return _view;
}
}
@Module
public class NetworkModule {
@Provides
@Singleton
OkHttpClient provide_OkHttpClient() {
return new OkHttpClient();
}
@Provides
@Singleton
OpenWeatherEndpoints provide_OpenWeatherAPI(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.openweathermap.org/data/2.5/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(OpenWeatherEndpoints.class);
}
@Provides
@Singleton
YoutubeEndpoints provide_YoutubeEndpoints(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.googleapis.com/youtube/v3/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(YoutubeEndpoints.class);
}
@Provides
@Singleton
NetworkService provide_NetworkService(OpenWeatherEndpoints openWeatherEndpoints, YoutubeEndpoints youtubeEndpoints) {
return new NetworkService(openWeatherEndpoints, youtubeEndpoints);
}
}
@Scope
@Retention(RUNTIME)
@interface PerFragment {
}
public class MainFragmentPresenterImpl implements MainFragmentPresenter {
private final MainFragmentView _view;
private NetworkService _service;
@Inject MainFragmentPresenterImpl(MainFragmentView view, NetworkService networkService) {
_view = view;
_service = networkService;
}
}
MainFragmentComponent.java
@Singleton
@Component(
modules = {
NetworkModule.class
}
)
public interface ApplicationComponent {
NetworkService networkService();
}
@PerFragment
@Component(
dependencies = ApplicationComponent.class,
modules = MainFragmentPresenterModule.class
)
public interface MainFragmentComponent {
MainFragmentView view();
void inject(MainFragment mainFragment);
}
@Module
public class MainFragmentPresenterModule {
private final MainFragmentView _view;
public MainFragmentPresenterModule(MainFragmentView view) {
_view = view;
}
@Provides
@PerFragment
MainFragmentView provideMainFragmentView() {
return _view;
}
}
@Module
public class NetworkModule {
@Provides
@Singleton
OkHttpClient provide_OkHttpClient() {
return new OkHttpClient();
}
@Provides
@Singleton
OpenWeatherEndpoints provide_OpenWeatherAPI(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.openweathermap.org/data/2.5/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(OpenWeatherEndpoints.class);
}
@Provides
@Singleton
YoutubeEndpoints provide_YoutubeEndpoints(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.googleapis.com/youtube/v3/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(YoutubeEndpoints.class);
}
@Provides
@Singleton
NetworkService provide_NetworkService(OpenWeatherEndpoints openWeatherEndpoints, YoutubeEndpoints youtubeEndpoints) {
return new NetworkService(openWeatherEndpoints, youtubeEndpoints);
}
}
@Scope
@Retention(RUNTIME)
@interface PerFragment {
}
public class MainFragmentPresenterImpl implements MainFragmentPresenter {
private final MainFragmentView _view;
private NetworkService _service;
@Inject MainFragmentPresenterImpl(MainFragmentView view, NetworkService networkService) {
_view = view;
_service = networkService;
}
}
MainFragmentPresenterModule.java
@Singleton
@Component(
modules = {
NetworkModule.class
}
)
public interface ApplicationComponent {
NetworkService networkService();
}
@PerFragment
@Component(
dependencies = ApplicationComponent.class,
modules = MainFragmentPresenterModule.class
)
public interface MainFragmentComponent {
MainFragmentView view();
void inject(MainFragment mainFragment);
}
@Module
public class MainFragmentPresenterModule {
private final MainFragmentView _view;
public MainFragmentPresenterModule(MainFragmentView view) {
_view = view;
}
@Provides
@PerFragment
MainFragmentView provideMainFragmentView() {
return _view;
}
}
@Module
public class NetworkModule {
@Provides
@Singleton
OkHttpClient provide_OkHttpClient() {
return new OkHttpClient();
}
@Provides
@Singleton
OpenWeatherEndpoints provide_OpenWeatherAPI(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.openweathermap.org/data/2.5/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(OpenWeatherEndpoints.class);
}
@Provides
@Singleton
YoutubeEndpoints provide_YoutubeEndpoints(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.googleapis.com/youtube/v3/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(YoutubeEndpoints.class);
}
@Provides
@Singleton
NetworkService provide_NetworkService(OpenWeatherEndpoints openWeatherEndpoints, YoutubeEndpoints youtubeEndpoints) {
return new NetworkService(openWeatherEndpoints, youtubeEndpoints);
}
}
@Scope
@Retention(RUNTIME)
@interface PerFragment {
}
public class MainFragmentPresenterImpl implements MainFragmentPresenter {
private final MainFragmentView _view;
private NetworkService _service;
@Inject MainFragmentPresenterImpl(MainFragmentView view, NetworkService networkService) {
_view = view;
_service = networkService;
}
}
NetworkModule.java
@Singleton
@Component(
modules = {
NetworkModule.class
}
)
public interface ApplicationComponent {
NetworkService networkService();
}
@PerFragment
@Component(
dependencies = ApplicationComponent.class,
modules = MainFragmentPresenterModule.class
)
public interface MainFragmentComponent {
MainFragmentView view();
void inject(MainFragment mainFragment);
}
@Module
public class MainFragmentPresenterModule {
private final MainFragmentView _view;
public MainFragmentPresenterModule(MainFragmentView view) {
_view = view;
}
@Provides
@PerFragment
MainFragmentView provideMainFragmentView() {
return _view;
}
}
@Module
public class NetworkModule {
@Provides
@Singleton
OkHttpClient provide_OkHttpClient() {
return new OkHttpClient();
}
@Provides
@Singleton
OpenWeatherEndpoints provide_OpenWeatherAPI(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.openweathermap.org/data/2.5/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(OpenWeatherEndpoints.class);
}
@Provides
@Singleton
YoutubeEndpoints provide_YoutubeEndpoints(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.googleapis.com/youtube/v3/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(YoutubeEndpoints.class);
}
@Provides
@Singleton
NetworkService provide_NetworkService(OpenWeatherEndpoints openWeatherEndpoints, YoutubeEndpoints youtubeEndpoints) {
return new NetworkService(openWeatherEndpoints, youtubeEndpoints);
}
}
@Scope
@Retention(RUNTIME)
@interface PerFragment {
}
public class MainFragmentPresenterImpl implements MainFragmentPresenter {
private final MainFragmentView _view;
private NetworkService _service;
@Inject MainFragmentPresenterImpl(MainFragmentView view, NetworkService networkService) {
_view = view;
_service = networkService;
}
}
PerFragment.java
@Singleton
@Component(
modules = {
NetworkModule.class
}
)
public interface ApplicationComponent {
NetworkService networkService();
}
@PerFragment
@Component(
dependencies = ApplicationComponent.class,
modules = MainFragmentPresenterModule.class
)
public interface MainFragmentComponent {
MainFragmentView view();
void inject(MainFragment mainFragment);
}
@Module
public class MainFragmentPresenterModule {
private final MainFragmentView _view;
public MainFragmentPresenterModule(MainFragmentView view) {
_view = view;
}
@Provides
@PerFragment
MainFragmentView provideMainFragmentView() {
return _view;
}
}
@Module
public class NetworkModule {
@Provides
@Singleton
OkHttpClient provide_OkHttpClient() {
return new OkHttpClient();
}
@Provides
@Singleton
OpenWeatherEndpoints provide_OpenWeatherAPI(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.openweathermap.org/data/2.5/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(OpenWeatherEndpoints.class);
}
@Provides
@Singleton
YoutubeEndpoints provide_YoutubeEndpoints(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.googleapis.com/youtube/v3/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(YoutubeEndpoints.class);
}
@Provides
@Singleton
NetworkService provide_NetworkService(OpenWeatherEndpoints openWeatherEndpoints, YoutubeEndpoints youtubeEndpoints) {
return new NetworkService(openWeatherEndpoints, youtubeEndpoints);
}
}
@Scope
@Retention(RUNTIME)
@interface PerFragment {
}
public class MainFragmentPresenterImpl implements MainFragmentPresenter {
private final MainFragmentView _view;
private NetworkService _service;
@Inject MainFragmentPresenterImpl(MainFragmentView view, NetworkService networkService) {
_view = view;
_service = networkService;
}
}
MainFragmentPresenterImpl.java
@Singleton
@Component(
modules = {
NetworkModule.class
}
)
public interface ApplicationComponent {
NetworkService networkService();
}
@PerFragment
@Component(
dependencies = ApplicationComponent.class,
modules = MainFragmentPresenterModule.class
)
public interface MainFragmentComponent {
MainFragmentView view();
void inject(MainFragment mainFragment);
}
@Module
public class MainFragmentPresenterModule {
private final MainFragmentView _view;
public MainFragmentPresenterModule(MainFragmentView view) {
_view = view;
}
@Provides
@PerFragment
MainFragmentView provideMainFragmentView() {
return _view;
}
}
@Module
public class NetworkModule {
@Provides
@Singleton
OkHttpClient provide_OkHttpClient() {
return new OkHttpClient();
}
@Provides
@Singleton
OpenWeatherEndpoints provide_OpenWeatherAPI(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.openweathermap.org/data/2.5/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(OpenWeatherEndpoints.class);
}
@Provides
@Singleton
YoutubeEndpoints provide_YoutubeEndpoints(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.googleapis.com/youtube/v3/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(YoutubeEndpoints.class);
}
@Provides
@Singleton
NetworkService provide_NetworkService(OpenWeatherEndpoints openWeatherEndpoints, YoutubeEndpoints youtubeEndpoints) {
return new NetworkService(openWeatherEndpoints, youtubeEndpoints);
}
}
@Scope
@Retention(RUNTIME)
@interface PerFragment {
}
public class MainFragmentPresenterImpl implements MainFragmentPresenter {
private final MainFragmentView _view;
private NetworkService _service;
@Inject MainFragmentPresenterImpl(MainFragmentView view, NetworkService networkService) {
_view = view;
_service = networkService;
}
}
当我尝试将演示者注入我的片段时
public class MainFragment extends Fragment implements MainFragmentView {
public static final String TAG = "MainFragment";
@Inject
MainFragmentPresenter _presenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerMainFragmentComponent.builder()
.applicationComponent(WeatherForecastApp.get(getContext()).getAppComponent())
.mainFragmentPresenterModule(new MainFragmentPresenterModule(this))
.build()
.inject(this);
}
}
非常感谢您的帮助!谢谢。您需要添加从MainFragmentPresenterImpl到MainFragmentPresenter的绑定。Dagger不会在类型之间强制转换,所以您需要使用方法显式地执行此操作@Binds相当于只返回其参数的@Provides方法,但它的实现效率更高。只需按以下方式更改模块:
@Module
public abstract class MainFragmentPresenterModule {
...
@Binds
abstract MainFragmentPresenter(MainFragmentPresenterImpl impl);
}
DaggerMainFragmentComponent.builder()
.applicationComponent(WeatherForecastApp.get(getContext()).getAppComponent())
.mainFragmentView(this)
.build()
.inject(this);
此外,您还可以通过使用
现在,由于您的模块没有构造函数,Dagger不需要提供实例,因此您可以这样构造组件:
@Module
public abstract class MainFragmentPresenterModule {
...
@Binds
abstract MainFragmentPresenter(MainFragmentPresenterImpl impl);
}
DaggerMainFragmentComponent.builder()
.applicationComponent(WeatherForecastApp.get(getContext()).getAppComponent())
.mainFragmentView(this)
.build()
.inject(this);