- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我是新手,刚开始接触dagger,理解上有些问题,希望有人能帮助我。
我已经阅读了很多关于 dagger 的内容,但仍然无法弄清楚某些部分。
我创建了我的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);
}
它工作得很好,一切都正确注入(inject),但现在我想更深入地研究 dagger API 并使用 Custom Scope
我有一个名为 PermissionModule
的模块,它用于 Android M 版本。
@PerActivity
@Module
public class PermissionModule {
@Provides
@PerActivity
PermissionController providePermissionController(Activity activity) {
return new PermissionManager(activity);
}
}
我希望它被注入(inject)到我的 Activity 中,并且只有当 Activity 也在内存中时( Activity 生命周期)才在内存中
@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 cannot be provided without an @Provides- or @Produces-annotated method. .ui.activities.base.BaseActivity.mPermissionController
我的代码有什么问题?
也不要创建新问题,它与此主题相关。
dagger2 如何解析 Scope
注解,我想不通。据我了解, Dagger 只识别 Singleton
注释,所有其他注释不影响 Dagger 决策,因为所有其他注释都具有 Activity 范围?
最佳答案
所以问题是你先调用了ApplicationComponent的inject方法
application.getApplicationComponent().inject(this);
它试图注入(inject)所有成员,包括 PermissionController。但是 ApplicationComponent 不能提供这个,这就是 Dagger 所提示的。
解决方案是只调用 ActivityComponent 的 inject() 方法。
很可能在某些时候您确实需要 ApplicationComponent 提供的依赖项。要存档,您需要将这两个组件组合起来。 Dagger 为此提供了两种方式,subcomponents和 component dependencies
当使用组件依赖时,rou 最终会在 Activity 的 onCreate() 方法中得到这样的结果:
DaggerActivityComponent
.builder()
.applicationComponent(application.getApplicationComponent())
.activityModule(new ActivityModule(this))
.build().inject(this);
当您将组件更改为类似于以下内容时:
@PerActivity
@Component(
dependencies = ApplicationComponent.class,
modules = {
ActivityModule.class,
PermissionModule.class
}
)
public interface ActivityComponent {
...
}
请注意,当您在 ActivityComponent(或任何注入(inject)器)中需要时,您需要在 ApplicationComponent 中显式提供依赖项
关于android - Dagger 2 瞄准镜说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36350222/
我是一名优秀的程序员,十分优秀!