Подтвердить что ты не робот

поддержка андроида кинжалом для androidx.fragment

Как внедрить фрагмент из пакета androidx.fragment.app.Fragment?

Я использую Dagger-Android Framework для внедрения моих зависимостей в мой код.

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

@Override
public void onAttach(Activity activity) {
    AndroidInjection.inject(this);
    super.onAttach(activity);
    // ...
}

проблема в том, что класс AndroidSupportInjection принимает только фрагменты пакета android.support.v4.app.Fragment или если я использую класс AndroidInjection, принимаю только фрагменты пакета android.app.Fragment, и я хочу использовать фрагменты androidx.fragment. Приложение. Фрагмент пакета.

Также DaggerFrament расширяется от android.support.v4.app.Fragment и хочет использовать фрагмент из androidx

И если я пытаюсь реализовать HasSupportFragmentInjector, то и этот интерфейс использует фрагмент из android.support

4b9b3361

Ответ 1

У меня была такая же проблема в случае HasFragmentInjector. Вам нужно использовать HasSupportFragmentInjector для внедрения фрагмента. Это связано с тем, что HasFragmentInjector использует android.app.Fragment который не jetifier. Вам нужно добавить библиотеку android-dagger-support, jetifier преобразует все пакеты поддержки в androidx в Studio 3.3 (если включен jetifier).

Если jetifier не меняет пакеты поддержки на пакеты androidx. Вы можете скачать jetifier здесь и преобразовать файл android-dagger-support.aar вручную с помощью следующей команды.

./jetifier-standalone -i dagger-android-support-<version>.aar -o <output-name>

Затем добавьте библиотеку в ваш проект. Это класс HasSupportFragment после преобразования

import androidx.fragment.app.Fragment;
import dagger.android.AndroidInjector;

public interface HasSupportFragmentInjector {
    AndroidInjector<Fragment> supportFragmentInjector();
}

Каким-то образом утилита jetifier не конвертировала библиотеки в AndroidStudio. Я должен был сделать это вручную.

Ответ 2

добавьте приведенный ниже код в ваш gradle.properties

android.useAndroidX = верно
android.enableJetifier = верно

И если вы пытаетесь AndroidInjection.inject(this) фрагмент, вы должны заменить AndroidInjection.inject(this) на AndroidSupportInjection.inject(this)

Ответ 3

Добавьте следующее в ваш файл gradle.properties

android.useAndroidX = true
android.enableJetifier = true

Ответ 4

У меня была похожая ошибка, и это было связано с версией Dagger. В версии 2.17 есть странная проблема, но если вы откатитесь до версии 2.16, она прекрасно скомпилируется (кроме флагов на gradle.properties, которые выложил Пол).

Оттуда с помощью учебников у вас не будет проблем. Забыл упомянуть, что в моем проекте у меня была версия, отличная от androidX, затем я запустил миграцию androidX, которую предлагает студия android, и после этого мне пришлось переключить версию Dagger, но я полагаю, что если вы сделаете это с самого начала это то же самое.

Надеюсь, это поможет, если вы переключитесь, и это не сработает, опубликуйте немного информации о вашей реализации кинжала и версиях плагинов, и я постараюсь помочь больше!

Ответ 5

Просто для справки. У меня такая же проблема. Это был вопрос Jetifier. пожалуйста, обновите ваш плагин Gradle build Tools до версии 3.3.0

        classpath 'com.android.tools.build:gradle:3.3.0' 

Пример кода: https://github.com/jega-ms/android-dagger2-mvp-rx

Ответ 6

Это то, что я сделал для работы с пространством имен androidx для Dagger 2.21

  1. jetifier инструмент для создания jetifier здесь: https://developer.android.com/studio/command-line/jetifier

  2. Распакуйте в папку и откройте терминал, указывающий на извлеченную папку bin

  3. В Android Studio откройте класс, такой как DaggerFragment чтобы проверить путь к файлу, для меня (в MacOS) это что-то вроде этого: enter image description here

  4. Из терминала выполните эту команду (заменив на правильные переменные и путь)

    ./jetifier-standalone -i/Users/{YOUR_USER}/.gradle/caches/{PATH_TO_DAGGER_ANDROID_SUPPORT_FOLDER}/dagger-android-support-2.21.aar -o dagger-android-support-2.21.aar

    Преобразованный dagger-android-support-2.21.aar появится в вашей папке bin

  5. Теперь откройте файл вашего приложения build.gradle и измените эту строку
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    добавление части , '*.aar' в массив include

  6. Переместите сгенерированный dagger-android-support-2.21.aar из bin в папку libs внутри вашего проекта.

  7. Удалить (или закомментировать) эту строку из implementation "com.google.dagger:dagger-android-support:2.21 зависимостей implementation "com.google.dagger:dagger-android-support:2.21

    Теперь вы можете продолжить аннулирование кэша и перестроить проект, и теперь DaggerFragment будет указывать на вашу конвертированную версию, которая использует androidx.fragment.app.Fragment

ПРИМЕЧАНИЕ. Очевидно, что это временное решение, и вам следует перейти к официальной версии, как только это будет исправлено в Dagger.

Ответ 7

Решением моей конкретной проблемы было использование классов кинжалов Android в качестве интерфейсов вместо их расширения:

class MyFragment() : HasSupportFragmentInjector {

    @Inject
    lateinit var childFragmentInjector: DispatchingAndroidInjector<Fragment>

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

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return childFragmentInjector
    }

........

}

К моей деятельности

class MyActivity : HasSupportFragmentInjector {
    @Inject
    internal lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> = fragmentInjector

......}

а также у меня есть это в моем файле gradle.properties:

android.useAndroidX = true android.enableJetifier = true

Ответ 8

Этот ответ неизбежно основан на мнениях, но я думаю, что это проблема XY.

Не чувствуйте себя вынужденным использовать Dagger Android только потому, что Google говорит, что это новая лучшая практика. Google известен тем, что активно продвигает лучшие практики, которые в лучшем случае противоречивы. Не стесняйтесь использовать старый способ (когда компоненты Android получают компонент Dagger и вводят себя), пока вы не столкнетесь с проблемами, которые Dagger Android должен решить. Возможно, к тому времени Dagger Android созреет, и проблема, с которой вы столкнулись, не будет существовать.

Ваша ссылка содержит цитату,

Даже большая часть рекомендаций в Effective Java считается неприемлемой для Android.

Это утверждение противоречиво само по себе. Вероятно, они ссылаются на такие вещи, как рекомендации Google, чтобы не использовать перечисления, которые были широко дискредитированы.