Конструктор @Inject с параметрами - PullRequest
0 голосов
/ 10 ноября 2019

Я видел метод использования @inject аннотации с конструктором параметров. Я не нашел смысла в @module во всех частях проекта. Я не понимаю, как этот код вводит или предоставляет параметры в конструкторе.

Можете ли вы помочь мне проанализировать это? Где находится менеджер данных?

Во всем проекте @module + @provide не используется для управления данными. Я только знаю, что @inject может аннотировать только конструктор без параметров. Я не знаю, где создать экземпляр объекта управления данными без параметров. Спасибо за вашу помощь

приложение:

 public class Scallop extends Application {
        private ApplicationComponent applicationComponent;

        @Override
        public void onCreate() {
            super.onCreate();
            applicationComponent = DaggerApplicationComponent.builder()
                    .applicationModule(new ApplicationModule(this))
                    .build();
        }

        public ApplicationComponent getApplicationComponent() { 
            return applicationComponent;
        }
    }

прикладной модуль:

    @Module
    public class ApplicationModule {
        private Scallop application;

        public ApplicationModule(Scallop application) { // 提供类的构造器,传入Applicaton
            this.application = application;
        }

        @Provides
        @Singleton
        Application provideApplication() { 
            return application;
        }

        @Provides
        @ApplicationContext
        Context provideContext() { 
            return application;
        }

        @Provides
        @Singleton
        Retrofit provideRetrofit() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Constants.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
            return retrofit;
        }

        @Provides
        @Singleton
        GankIOService provideGankIOService(Retrofit retrofit) { 
            return retrofit.create(GankIOService.class);
        }
    }

    @Singleton
    @Component(modules = ApplicationModule.class)
    public interface ApplicationComponent {
        Application getApplication();  

        DataManager getDataManager();
    }
```

один класс:

   @Singleton
    public class DataManager {
        private GankIOService gankIOService;
        private PreferencesHelper preferencesHelper;

        @Inject
        public DataManager(GankIOService gankIOService, PreferencesHelper preferencesHelper) {
            this.gankIOService = gankIOService;
            this.preferencesHelper = preferencesHelper;
        }
    }

фрагментный модуль:

    @FragmentScope
    @Component(modules = FragmentModule.class, dependencies = ApplicationComponent.class)
    public interface FragmentComponent {  
        void inject(HomeFragment homeFragment);

        void inject(GanHuoPageFragment pageFragment);

        void inject(XianDuFragment xianDuFragment);

        void inject(XianDuPageFragment xianDuPageFragment);

        void inject(PicturesFragment picturesFragment);

        void inject(MoreFragment moreFragment);
    }

    @FragmentScope
    @Documented
    @Scope
    @Retention(value = RetentionPolicy.RUNTIME)
    public @interface FragmentScope {
    }

   ``` 

здесь Не могу понять конструктор с параметром @inject

     public class GanHuoPagePresenter extends BasePresenter<GanHuoPageContract.View>
            implements GanHuoPageContract.Presenter {
        private DataManager dataManager;
        private Disposable disposable;

        @Inject
        public GanHuoPagePresenter(DataManager dataManager) { // here here
            this.dataManager = dataManager;
        }

        @Override
        public void detachView() {
            super.detachView();
            if (disposable != null) {
                disposable.dispose();
            }
        }

        @Override
        public void getGanHuo(String category, final int page) {
            final List<GanHuo> ganHuoList = new ArrayList<>();
            Observable<BaseResponse<GanHuo>> observable = dataManager.getGanHuo(category, page);
            disposable = observable.subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .concatMap(new Function<BaseResponse<GanHuo>, ObservableSource<GanHuo>>() {
                @Override
                public ObservableSource<GanHuo> apply(@NonNull BaseResponse<GanHuo> ganHuoBaseResponse)
                        throws Exception {
                    return Observable.fromIterable(ganHuoBaseResponse.getResults());
                }
            }).filter(new Predicate<GanHuo>() {
                @Override
                public boolean test(@NonNull GanHuo ganHuo) throws Exception {
                    return !ganHuo.getType().equals("福利");
                }
            }).subscribe(new Consumer<GanHuo>() {
                @Override
                public void accept(GanHuo ganHuo) throws Exception {
                    ganHuoList.add(ganHuo);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    getView().showError(throwable.getMessage());
                }
            }, new Action() {
                @Override`enter code here`
                public void run() throws Exception {
                    getView().showList(ganHuoList, page);
                }
            });
        }
    }

Вот как он используется в V в режиме MVP:

@Inject GanHuoPagePresenter presenter

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Это не правда, что @Inject может аннотировать только конструктор без параметров. Из документации

Инжектируемые конструкторы аннотируются @Inject и принимают в качестве аргументов ноль или более зависимостей.

Я нашел "ваш" проект в Github , поэтому давайте посмотрим, откуда берутся зависимости для GanHuoPagePresenter.

@Inject
public GanHuoPagePresenter(DataManager dataManager) {
    this.dataManager = dataManager;
}

@Inject
public DataManager(GankIOService gankIOService,PreferencesHelper preferencesHelper){
// gankIOService is provided by ApplicationModule and preferencesHelper uses constructor injection
    this.gankIOService = gankIOService;
    this.preferencesHelper = preferencesHelper;
}

@Inject
public PreferencesHelper(@ApplicationContext Context context){
// context is provided again by ApplicationModule
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
0 голосов
/ 10 ноября 2019

Это инжектор конструктора . Помечая конструктор @Inject, Даггер знает об объекте и может создать его при необходимости. Модули не нужны, например, ниже приведена правильная установка Dagger для создания Foo.

public class Foo {
    @Inject
    public Foo() {}
}

@Component
interface MyComponent {
    Foo getFoo();
}
...