注入活动所需的成员



我需要将"RxPermissions"RX Permissions lib 实例注入我的片段。 这是我的(基本(片段类:

public class MapFragment extends Fragment {  
//an empty ctor
@Inject
RxPermissions rxPermissions; //need inject.
@Override
public void onAttach(Context context) {
AndroidSupportInjection.inject(this); //for injection
super.onAttach(context);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//When i not use injection for rxPermissions -> rxPermissions = new RxPermissions(getActivity());
if(rxPermission.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)){
///TODO: implement isGranted logic
}
}
}

这是我的MapFragmentSubComponent和MapFragmentSubModule,用于注入MapFragment:

@Subcomponent
public interface MapFragmentSubComponent extends AndroidInjector<MapFragment> {
@Subcomponent.Builder
public abstract class Builder extends AndroidInjector.Builder<MapFragment>{
}
}

@Module(subcomponents = MapFragmentSubComponent.class)
public abstract class MapFragmentSubModule {
@Binds
@IntoMap
@FragmentKey(MapFragment.class)
abstract AndroidInjector.Factory<? extends Fragment> bindMapFragmentInjectorFactory(MapFragmentSubComponent.Builder builder);
//Contains here my provider method for example viewmodelfactory provide.
//I need (i think) provide rxPermissions here. but how ?
}

和 MapFragmentSubModule 安装在 AppComponent 上,带有 @Component(modules = {MapFragmentSubmodule.class}(

那么如何将 RxPermissions 注入片段或其他?(前活动?

@Jeff Bowman 6月29日18:39评论更新:所以。我在MainActivity中注入了活动哈希(这是工作(,但这在MapFragment中没有继承。我可以用dagger安卓库解决这个问题吗?(或者使用老式dagger 2 实现来解决这个问题? 这是我的错误消息:

error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)]   java.lang.Integer cannot be provided without an @Inject constructor or an @Provides-annotated method.
java.lang.Integer is injected at
.ui.main.map.MapFragment.activityHash
.ui.main.map.MapFragment is injected at
dagger.android.AndroidInjector.inject(T)
component path: .component.AppComponent ? .module.BuildersModule_BindMapFragment.MapFragmentSubcomponent

所以我需要来自MapFragment中MainActivityModule的activityHash。

如果您的 MapFragmentSubModule包含在使用 dagger.android 的活动子组件中,那么您将在 MapFragmentSubModule 中访问您正在注入的特定活动子类。

@Module(subcomponents = MapFragmentSubComponent.class)
public abstract class MapFragmentSubModule {
// ...
// You probably want @ActivityScope; see below.
@Provides static RxPermissions provideRxPermissions(YourActivity activity) {
return new RxPermissions(activity);
}
}

请注意,dagger.android 只能注入您的子类 YourActivity,而不能注入 Activity 本身。这部分是为了保持一致性:片段可以嵌套在其他片段中(这样,如果超类绑定是自动的,注入片段将是模棱两可的(。对于不太明确的绑定,您可能需要@Binds Activity bindActivity(YourActivity activity).

如果您没有活动子组件,则需要从片段中获取活动,这意味着改为在片段子组件上安装 RxPermissions。

@Subcomponent(modules = MapFragmentSubComponent.Module.class)
public interface MapFragmentSubComponent extends AndroidInjector<MapFragment> {
@Subcomponent.Builder
public abstract class Builder extends AndroidInjector.Builder<MapFragment> {    
}
@dagger.Module public abstract class Module {
@Provides static RxPermissions provideRxPermissions(MapFragment fragment) {
return new RxPermissions(fragment.getActivity());
}
}
}

也就是说,我假设您希望 RxPermissions 对象在 Activity 中保持一致,这意味着使用活动范围的子组件(如有必要,创建一个(并使用@ActivityScope或任何您命名的活动子组件范围注释来注释您的@Provides方法。

最新更新