web-dev-qa-db-fra.com

poignard Android support à androidx.fragment

Comment injecter un fragment du paquet androidx.fragment.app.Fragment?

J'utilise le framework dagger-Android pour injecter mes dépendances dans mon code.

Comme le dit la documentation, je fais cela pour injecter mon fragment

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

le problème est que la classe AndroidSupportInjection n'accepte que des fragments du package Android.support.v4.app.Fragment ou, si j'utilise la classe AndroidInjection, n'accepte que des fragments du package Android.app.Fragment et que je le souhaite. utilisez des fragments du package androidx.fragment.app.Fragment.

De plus, DaggerFrament s’étend de Android.support.v4.app.Fragment et souhaite utiliser un fragment d’androidx

Et si j'essaie d'implémenter HasSupportFragmentInjector, cette interface utilise également un fragment de Android.support

13
Irving Lóp

J'ai eu le même problème dans le cas de HasFragmentInjector. Vous devez utiliser HasSupportFragmentInjector pour l’injection de fragments. En effet, HasFragmentInjector utilise Android.app.Fragment qui est non affecté par jetifier. Vous devez ajouter la bibliothèque Android-dagger-support. jetifier convertit tous les support packages en androidx dans Studio 3.3 (si jetifier est activé).

Si jetifier ne change pas les packages support en packages androidx. Vous pouvez télécharger l'outil jetifier à partir de ici et convertir le fichier Android-dagger-support.aar manuellement à l'aide de la commande suivante.

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

Ajoutez ensuite la bibliothèque à votre projet. Ceci est la classe HasSupportFragment après conversion

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

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

D'une manière ou d'une autre, l'outil Jetifier ne convertissait pas les bibliothèques dans AndroidStudio . Je devais le faire manuellement.

2
mallaudin

Ajoutez les éléments suivants à votre fichier gradle.properties

Android.useAndroidX = true
Android.enableJetifier = true
1
Ayokunle Paul

J'ai eu une erreur similaire et c'était dû à la version Dagger. Il y a un problème étrange dans la version 2.17, mais si vous revenez à la version 2.16, la compilation est parfaite (à part les indicateurs de gradle.properties publiés par Paul). 

À partir de là, en utilisant les tutoriels, vous n'aurez aucun problème. J'ai oublié de mentionner que dans mon projet, j'avais la version non androidX de tout, puis j'ai exécuté la migration androidX proposée par le studio Android, puis j'ai dû changer de version, mais je suppose que si vous le faites dès le début c'est le même.

J'espère que cela vous aidera, si vous changez de serveur et que cela ne fonctionne pas, publiez un peu de votre implémentation de dague et vos versions de plugins et j'essaierai de vous aider davantage!

0
Davidaz

ajoutez le code ci-dessous à votre fichier gradle.properties

Android.useAndroidX = true
Android.enableJetifier = true

Et si vous essayez d’injecter dans un fragment, vous devez remplacer AndroidInjection.inject(this) par AndroidSupportInjection.inject(this).

0
cherif

Juste pour référence. J'ai eu le même problème. C'était le problème de Jetifier. veuillez mettre à jour votre plugin Gradle Build Tools vers la version 3.3.0 

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

Exemple de code: https://github.com/jega-ms/Android-dagger2-mvp-rx

0
Jega