Прежде всего, я новичок, только начинаю изучать кинжал, у меня есть некоторые проблемы с пониманием, поэтому надеюсь, что кто-то может мне помочь.
Я много читал о кинжале, но до сих пор не могу понять некоторые детали.
Я создал свой 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);
}
И он отлично работает, все инжектится правильно, но теперь я хочу углубиться в dagger API и использовать Custom Scope
У меня есть модуль под названием PermissionModule
, он используется для версий Android M.
@PerActivity
@Module
public class PermissionModule {
@Provides
@PerActivity
PermissionController providePermissionController(Activity activity) {
return new PermissionManager(activity);
}
}
И я хочу, чтобы он был введен в мою деятельность и находился в памяти только тогда, когда активность также находится в памяти (жизненный цикл активности)
@PerActivity
@Component(modules = {
ActivityModule.class,
PermissionModule.class
})
public interface ActivityComponent {
Activity activity();
void inject(BaseActivity baseActivity);
PermissionModule permissionModule();
}
My 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- или @Produces. .ui.activities.base.BaseActivity.mPermissionController
Что не так в моем коде?
Также не создавать новый вопрос, связанный с этой темой.
Как dagger2 разбирает аннотацию Scope
, я не могу понять. Насколько я понимаю, кинжал распознает только аннотацию Singleton
, а все остальные аннотации не влияют на решение кинжала, потому что все остальные аннотации будут иметь сферу действия?