【问题标题】:Dagger 2 Module Override in Subcomponent子组件中的 Dagger 2 模块覆盖
【发布时间】:2016-04-07 19:33:04
【问题描述】:

我有这样的Subcomponents 应用程序

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

一切正常,但我想做一件事。 Android Mrequires runtime permissions so I decided to createController, something like helper class that will be injected intoFragmentorActivity` 通用接口

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 被注入了。

【问题讨论】:

    标签: java android dependency-injection dagger dagger-2


    【解决方案1】:

    @Subcomponent 继承了超作用域组件的所有绑定。在本例中,即为 @ActivityScope 组件。

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

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

    【讨论】:

    • 感谢您的回答,我按照您昨天的建议做了同样的事情,效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2011-10-05
    相关资源
    最近更新 更多