Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匕首2不工作_Java_Android_Dagger - Fatal编程技术网

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);