web-dev-qa-db-ja.com

dagger Android androidx.fragmentのサポート

パッケージからフラグメントを注入する方法androidx.fragment.app.Fragment

dagger-Android フレームワークを使用して、コードに依存関係を注入しています。

ドキュメントには、フラグメントを注入するためにこれを行うと書かれています

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

問題は、AndroidSupportInjectionクラスがパッケージAndroid.support.v4.app.Fragmentのフラグメントのみを受け入れるか、またはAndroidInjectionクラスは、Android.app.Fragmentパッケージのフラグメントのみを受け入れ、androidx.fragment.app.Fragmentパッケージのフラグメントを使用したい。

また、DaggerFramentはAndroid.support.v4.app.Fragmentから拡張し、からのフラグメントを使用したいandroidx

そして、HasSupportFragmentInjectorを実装しようとすると、このインターフェースもAndroid.supportからのフラグメントを使用します

16
Irving Lóp

gradle.propertiesに以下のコードを追加します

Android.useAndroidX = true
Android.enableJetifier = true

そして、フラグメントに注入しようとしている場合は、AndroidInjection.inject(this)AndroidSupportInjection.inject(this)に置き換える必要があります

3
cherif

HasFragmentInjectorの場合にも同じ問題がありました。フラグメントの注入には、HasSupportFragmentInjectorを使用する必要があります。これは、HasFragmentInjectorjetifierによって影響を受けないAndroid.app.Fragmentを使用するためです。 Android-dagger-supportライブラリを追加する必要があります。jetifierは、すべてのサポートパッケージをStudio 3.3のandroidxに変換します(jetifierが有効な場合)。

Jetifierがサポートパッケージをandroidxパッケージに変更しない場合。 jetifierツールを here からダウンロードして、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のライブラリを変換していませんでした。手動でやらなければなりませんでした。

3
mallaudin

私の特定の問題の解決策は、Android daggerクラスを拡張する代わりにインターフェイスとして使用することでした:

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

0
Irving Lóp

これは私がDagger 2.21のandroidx名前空間で作業するためにしたことです

  1. ここから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'_部分を追加

  6. 生成された_dagger-Android-support-2.21.aar_をbinからプロジェクト内のlibsフォルダーに移動します。

  7. 依存関係からこの行を削除(またはコメント)_implementation "com.google.dagger:dagger-Android-support:2.21_

    キャッシュの無効化を続行してプロジェクトを再構築すると、DaggerFragmentが_androidx.fragment.app.Fragment_を使用する変換されたバージョンを指すようになります。

注:これは明らかに一時的な回避策であり、Daggerで修正されるとすぐに公式バージョンに移行する必要があります

0
MatPag

同様のエラーが発生しましたが、これはDaggerバージョンが原因でした。バージョン2.17には奇妙な問題がありますが、バージョン2.16にロールバックすると、(Paulが投稿したgradle.propertiesのフラグを除き)完全にコンパイルされます。

そこからチュートリアルを使用すると、問題は発生しません。私のプロジェクトではすべての非AndroidXバージョンがあったことを忘れていましたが、androidX移行を実行しましたAndroidスタジオオファー、その後ダガーバージョンを切り替える必要がありましたが、あなたが最初からそれを行う場合、それは同じだと仮定します。

切り替えて機能しない場合は、これが役立つことを願っています。短剣の実装とプラグインのバージョンを少し投稿してください。私はもっと助けようとします!

0
Davidaz

参照用です。私は同じ問題を抱えていました。それはJetifierの問題でした。 gradleビルドツールプラグインを3.3.0にアップグレードしてください

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

サンプルコード: https://github.com/jega-ms/Android-dagger2-mvp-rx

0
Jega

Gradle.propertiesファイルに次を追加します

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