gpt4 book ai didi

android - Dagger 2 瞄准镜说明

转载 作者:行者123 更新时间:2023-11-29 14:16:51 25 4
gpt4 key购买 nike

首先,我是新手,刚开始接触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 为此提供了两种方式,subcomponentscomponent 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com