子组件中的 Dagger 2 模块覆盖
Dagger 2 Module Override in Subcomponent
我有 Subcomponent
个这样的应用
-------- ApplicationComponent ------------
| |
| |
| |
Service Component Activity Component
|
|
|
Fragment Component
一切正常,但我想做一件事。
Android Mrequires runtime permissions so I decided to create
Controller, something like helper class that will be injected into
Fragmentor
Activity `
通用接口
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);
}
以及来自不同实现的一种方法 PermissionActivityManager
和 PermissionFragmentManager
@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;
}
希望你有想法。
但是关于这个问题,我的 FragmentComponent
是 ActivityComponent
的子组件
他们都有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
被注入了。
@Subcomponent
从超作用域组件继承所有绑定。在本例中,即 @ActivityScope
组件。
如果要控制继承的依赖关系,就得用Component Dependencies。组件依赖项允许您仅继承提供方法指定的绑定。
如果您不想修改新的构建器,那么我建议您使用 @Named("activity")
和 @Named("fragment")
注释来指定您想要注入的权限处理程序的类型。你必须把它放在你的 @Inject
注释字段和 @Provides
注释方法上。
我有 Subcomponent
个这样的应用
-------- ApplicationComponent ------------
| |
| |
| |
Service Component Activity Component
|
|
|
Fragment Component
一切正常,但我想做一件事。
Android Mrequires runtime permissions so I decided to create
Controller, something like helper class that will be injected into
Fragmentor
Activity `
通用接口
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);
}
以及来自不同实现的一种方法 PermissionActivityManager
和 PermissionFragmentManager
@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;
}
希望你有想法。
但是关于这个问题,我的 FragmentComponent
是 ActivityComponent
他们都有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
被注入了。
@Subcomponent
从超作用域组件继承所有绑定。在本例中,即 @ActivityScope
组件。
如果要控制继承的依赖关系,就得用Component Dependencies。组件依赖项允许您仅继承提供方法指定的绑定。
如果您不想修改新的构建器,那么我建议您使用 @Named("activity")
和 @Named("fragment")
注释来指定您想要注入的权限处理程序的类型。你必须把它放在你的 @Inject
注释字段和 @Provides
注释方法上。