Кинжал 2: Как использовать инъекцию с фрагментом - PullRequest
0 голосов
/ 18 сентября 2018

Я использую AndroidInjection.inject(this) для добавления компонентов в действие.

AndroidInjection также имеет перегруженный метод, который принимает android.app.Fragment в качестве параметра. Но мои фрагменты расширяются android.support.v4.app.Fragment и нет соответствующего метода.

Вопрос: Как использовать инъекцию, если фрагмент расширяется android.support.v4.app.Fragment?

1 Ответ

0 голосов
/ 18 сентября 2018

Для поддержки фрагментов библиотеки вам необходимо использовать поддержку внедрения.Вот некоторый пример:

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class, // Important
        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();
    }
}

Приложение, вы можете использовать DaggerApplication или простой HasSomeIjection, если вам нужно, например, Мультидексная реализация :

public class App extends MultiDexApplication implements
    HasActivityInjector,
    HasFragmentInjector {

    @Inject DispatchingAndroidInjector<Activity> activityInjector;
    @Inject DispatchingAndroidInjector<Fragment> fragmentInjector;
    private AppComponent mComponent;

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

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

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

Следующий модуль:

@Module
public abstract class FragmentModule {
    @ContributesAndroidInjector
    abstract ContactsFragment bindContactsFragment();
}

Модуль активности:

@Module
public abstract class ActivityModule {
    @ContributesAndroidInjector
    abstract ContactsActivity bindContactsActivity();
}

И фрагмент:

import com.some.ContactsPresenter;
import dagger.android.support.DaggerFragment;

public class ContactsFragment extends DaggerFragment {

    @Inject
    ContactsPresenter mContactsPresenter;

    // .....
}

Если вы не хотите использовать DaggerFragment, вы можете открыть его реализацию и скопировать в свойфрагмент с необходимыми изменениями.Основной особенностью здесь является использование AndroidSupportInjectionModule.Надеюсь, это поможет вам

...