gpt4 book ai didi

java - 子组件中的 Dagger 2 模块覆盖

转载 作者:行者123 更新时间:2023-11-30 02:58:46 25 4
gpt4 key购买 nike

我有一个带有这样的子组件的应用程序

-------- ApplicationComponent ------------
| |
| |
| |
Service Component Activity Component
|
|
|
Fragment Component

一切正常,但我想做一件事。
Android M需要运行时权限,因此我决定创建Controller,类似于将注入(inject)到FragmentActivity中的辅助类。通用接口(interface)

public interface PermissionController {

boolean hasPermissionInManifest(String permissionName);

boolean isPermissionGranted(String permission);

/**
* Request permission for Android 6
*
* @param permission permission that is requested
* @param requestCode request code
* @return if user is going to be asked about permission so we need to handle callback, otherwise
* user was already asked or permission is not required cause of android lower version
*/
boolean requestPermission(int requestCode, String permission);

void requestPermissions(int requestCode, String... permissions);

}

以及来自不同实现PermissionActivityManagerPermissionFragmentManager的一种方法

   @Override
public boolean requestPermission(int requestCode, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (mContext.checkSelfPermission(permission)
!= PackageManager.PERMISSION_GRANTED) {
mContext.requestPermissions(new String[]{permission},
requestCode);
return true;
}
}
return false;
}

Fragment实现

   @Override
public boolean requestPermission(int requestCode, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(mFragment.getActivity(), permission)
!= PackageManager.PERMISSION_GRANTED) {
mFragment.requestPermissions(new String[]{permission},
requestCode);
return true;
}
}
return false;
}

希望你有想法。

但是关于问题,我的 FragmentComponentActivityComponent 的子组件

它们都有PermissionModule

@PerActivity
@Subcomponent(
modules = {
ActivityModule.class,
PermissionModule.class
})
public interface ActivityComponent {
Activity activity();

FragmentComponent fragmentComponent(FragmentModule module);

void inject(BaseActivity baseActivity);

void inject(MainAppActivity mainAppActivity);

}

对于 fragment

@Subcomponent(
modules = {
FragmentModule.class,
ProviderModule.class,
PermissionModule.class
})
@PerFragment
public interface FragmentComponent {
Fragment fragment();

void inject(BaseFragment baseFragment);

}

除了注释和返回的实例之外,模块是相同的。

@PerFragment
@Module
public class PermissionModule {
@PerFragment
@Provides
PermissionController providePermissionController(Fragment fragment) {
return new PermissionFragmentManager(fragment);
}
}

@PerActivity
@Module
public class PermissionModule {
@PerActivity
@Provides
PermissionController providePermissionController(Activity activity) {
return new PermissionActivityManager(activity);
}
}

所以我的问题是 - 是否有任何方法可以覆盖父组件中使用的 provide 方法,或者还有其他方法来解决问题?因为在我的例子中,PermissionActivityManager 被注入(inject)了。

最佳答案

@Subcomponent 继承 super 作用域组件的所有绑定(bind)。在本例中,即为 @ActivityScope 组件。

如果你想控制继承的依赖关系,你必须使用组件依赖关系。组件依赖项允许您仅继承由提供方法指定的绑定(bind)。

如果您不想修改新的构建器,那么我建议使用 @Named("activity")@Named("fragment")注释来指定您想要注入(inject)的权限处理程序的类型。您必须将其放在 @Inject 带注释的字段和 @Provides 带注释的方法上。

关于java - 子组件中的 Dagger 2 模块覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485540/

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