Внедрение деятельности необходим член - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно вставить экземпляр "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 29 июня в 18:39 комментарий: Так. Я внедряю хэш активности в MainActivity (это работа), но он не наследуется в MapFragment. Могу ли я решить эту проблему с помощью dagger-android lib? (Или использовать решение старой моды в стиле кинжала 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

Так что мне нужен хэш активности из MainActivityModule в MapFragment.

1 Ответ

0 голосов
/ 28 июня 2018

Если ваш MapFragmentSubModule включен в подкомпонент Activity с помощью dagger.android, то у вас будет доступ в вашем MapFragmentSubModule к конкретному подклассу Activity, который вы вводите.

@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, а не саму активность. Это частично для согласованности: фрагменты могут быть вложены в другие фрагменты (так, чтобы внедрение фрагмента было неоднозначным, если привязки суперкласса были автоматическими). Для менее двусмысленных привязок вы можете захотеть @Binds Activity bindActivity(YourActivity activity).

Если у вас нет подкомпонента Activity, вам нужно извлечь Activity из фрагмента, что означает установку RxPermissions на субкомпоненте Fragment.

@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, что означает использование подкомпонента в области действия (при его создании) и аннотирование вашего метода @Provides с помощью @ActivityScope или любого другого назвал аннотацию области действия подкомпонента своей деятельности.

...