Прежде всего, я новичок, только начинаю изучать кинжал, у меня есть некоторые проблемы с пониманием, поэтому надеюсь, что кто-то может мне помочь.Кинжал 2 Объяснение объяснений
Я много читал о кинжале, но до сих пор не могу понять некоторые детали.
Я создал мой ApplicationComponent
, и это выглядит как этот
@Singleton
@Component(modules = {
ApplicationModule.class,
ThreadingModule.class,
NetworkModule.class,
DatabaseModule.class,
ServiceModule.class,
ParseModule.class,
PreferencesSessionModule.class})
public interface ApplicationComponent {
void inject(BaseActivity baseActivity);
void inject(MainAppActivity mainAppActivity);
void inject(BaseFragment baseFragment);
}
И он прекрасно работает все впрыскивает правильно, но теперь я хочу, чтобы погрузиться глубже в крестик API и использовать Custom Scope
я модуль называется PermissionModule
он используется для версий Android M.
@PerActivity
@Module
public class PermissionModule {
@Provides
@PerActivity
PermissionController providePermissionController(Activity activity) {
return new PermissionManager(activity);
}
}
И я хочу ему быть введен в моей деятельности и быть в памяти только тогда, когда активность также в памяти (actvity жизненный цикл)
@PerActivity
@Component(modules = {
ActivityModule.class,
PermissionModule.class
})
public interface ActivityComponent {
Activity activity();
void inject(BaseActivity baseActivity);
PermissionModule permissionModule();
}
Мои ActivityComponent
@PerActivity
@Component(modules = {
ActivityModule.class,
PermissionModule.class
})
public interface ActivityComponent {
Activity activity();
void inject(BaseActivity baseActivity);
PermissionModule permissionModule();
}
И мои BaseActivity
public abstract class BaseActivity extends AppCompatActivity implements SpiceManagerProvider, NetworkRequestsExecutor {
// Dependencies are injected by ApplicationComponent
@Inject
protected ApplicationSettingsManager mApplicationSettingsManager;
@Inject
protected SpiceManager mSpiceManager;
@Inject
protected ScheduledThreadPoolExecutor mPoolExecutor;
!!!!!!
Should be injected by activity component
@Inject
protected PermissionController mPermissionController;
И в onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
// Injecting dependencies
MyApplication application = MyApplication.get(this);
application.getApplicationComponent().inject(this);
DaggerActivityComponent.builder().activityModule(new ActivityModule(this)).build().inject(this);
mPermissionController.requestPermission(Manifest.permission.ACCESS_FINE_LOCATION);
mPermissionController.requestPermission(Manifest.permission.CAMERA);
super.onCreate(savedInstanceState);
}
я получил ошибку
PermissionController не может быть обеспечена без @ Provides- или @ Выдает-аннотированный метод. .ui.activities.base.BaseActivity.mPermissionController
Что плохого в моем коде?
Также не создавать новый вопрос и это связано с этой темой.
Как сделать dagger2 parse Scope
аннотация, я не могу понять это. Насколько я понимаю, кинжал распознает только аннотацию Singleton
, и все остальные аннотации не влияют на решение кинжала, потому что все остальные аннотации будут иметь сферу деятельности?
Спасибо за ответ, только я удивляюсь, это чистый способ сделать это? Или, может быть, есть еще один вариант? – dugdthndwytn
, как я уже говорил, вы можете сделать это и с субкомпонентами. но, кроме объединения графика зависимости и использования результата для решения зависимостей, я не думаю, что есть более чистое решение. определение области видимости также имеет смысл только в том случае, если у вас есть только один граф объектов. иначе вы можете получить несколько экземпляров для области. – nosyjoe