Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子组件中的Dagger 2模块超控_Java_Android_Dependency Injection_Dagger_Dagger 2 - Fatal编程技术网

Java 子组件中的Dagger 2模块超控

Java 子组件中的Dagger 2模块超控,java,android,dependency-injection,dagger,dagger-2,Java,Android,Dependency Injection,Dagger,Dagger 2,我有一个应用程序,它的子组件是这样的 -------- ApplicationComponent ------------ | | | | | | Service Component Activity Component |

我有一个应用程序,它的子组件是这样的

-------- ApplicationComponent ------------
        |                    |
        |                    |
        |                    |
    Service Component      Activity Component
                              |
                              |
                              |
                           Fragment Component
一切正常,但我想做一件事。

Android M
需要运行时权限,所以我决定创建
Controller
,类似于helper类的东西,它将被注入到
Fragment
活动中` 公共接口

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;
    }
片段
实现

   @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);

}
对于
片段

@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
组件

如果要控制继承的依赖项,必须使用组件依赖项。组件依赖关系允许您仅继承由provision方法指定的绑定


如果您不想修补新的构建器,那么我建议使用
@Named(“activity”)
@Named(“fragment”)
注释来指定要注入的权限处理程序的类型。你必须把它放在你的
@Inject
注释字段和
@提供的
注释方法上。

谢谢你的回答,我按照你昨天建议的做了,效果很好