Невозможно ввести зависимость во фрагмент, используя dagger2 в Java Android - PullRequest
0 голосов
/ 29 ноября 2018

Я умею вводить зависимость в действия и нормально работать.но вызов той же зависимости во фрагменте не дает доступа.

Это то, что я сделал.

App.Java

public class App extends MultiDexApplication implements HasActivityInjector, HasFragmentInjector {

    @Inject
    DispatchingAndroidInjector<Activity> activityInjector;

    @Inject
    DispatchingAndroidInjector<Fragment> fragmentInjector;

    private AppComponent mComponent;

    @Override
    public void onCreate() {
    super.onCreate();
    mComponent = DaggerAppComponent.builder().application(this).build();
    mComponent.inject(this);
    }

    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
    return activityInjector;
    }

    @Override
    public AndroidInjector<Fragment> fragmentInjector() {
    return fragmentInjector;
    }
}

Это AppComponent.Java

@Singleton
@Component(modules = { AndroidInjectionModule.class, ActivityModule.class, FragmentModule.class})
public interface AppComponent extends AndroidInjector<App> {

    void inject(App app);

    @Component.Builder
    interface Builder {
    @BindsInstance
    Builder application(Application application);
    AppComponent build();
    }
}

Это класс ActivityModule.Java

@Module
public abstract class ActivityModule {
    @ContributesAndroidInjector
    abstract MainActivity contributeMainActivityInjector();

    @ContributesAndroidInjector
    abstract MyActivity contributeCampaignActivityInjector();
}

Это класс FragmentModule.java

@Module
public abstract class FragmentModule {
    @ContributesAndroidInjector
    abstract MyFragment bindMyFragment();
}

Теперь в моем классе MyFragment, где я хочу внедрить эту зависимость.сверху я добавляю эти строки внутри класса

@Inject
ImageDownloaderApi imageDownloaderApi;

, а затем, чтобы проверить функцию onCreateView, я сделал это, чтобы проверить, работает ли моя зависимость следующим образом

boolean injected = imageDownloaderApi == null ? false : true;
    Log.d(this.getClass().getSimpleName(), "Dependency worked: "+ String.valueOf(injected));

И она возвращает мне falseEverytime.

, где в активах работает один и тот же код.еще одна вещь, которую я делаю в действиях, это добавление этой строки ниже в onCreate, как это

  @Override
protected void onCreate(Bundle savedInstanceState) {
    AndroidInjection.inject(this);    // this line
    super.onCreate(savedInstanceState);

, когда при попытке добавить ту же строку в onCreateView во фрагменте

AndroidInjection.inject(this);    

она отображает красную линиюниже этого.и если я заменю это getActivity.Это дало мне ошибку во время выполнения.

Пожалуйста, посмотрите и руководство, где я не прав?

Правильный ли процесс, который я делаю для фрагмента?как это явно работает в деятельности.

Заранее спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я предполагаю, что вы используете Fragment -s из библиотеки поддержки.Попробуйте изменить public class App extends MultiDexApplication implements HasActivityInjector, HasFragmentInjector на public class App extends MultiDexApplication implements HasActivityInjector, HasFragmentInjector, HasSupportFragmentInjector с последующим предоставлением соответствующего инжектора.

Это простая статья , которая проясняет эту тему.Кроме того, HasSupportFragmentInjector использование интерфейса также описано здесь.

0 голосов
/ 29 ноября 2018

при попытке добавить ту же строку в onCreateView во фрагменте

AndroidInjection.inject (this);

это должно быть сделано в onAttach вашегофрагмент, и если вы используете фрагмент из библиотеки поддержки, как вы должны, строка будет AndroidSupportInjection.inject(this)

override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
}
...