問題タブ [dagger]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Android でのデバッグ ビルド用の代替アプリケーション サブクラス
DebugMyApplication
デバッグ コードがリリース APK に入るのを制限するために、デバッグ ビルドにサブクラスを使用しようとしていますがMyApplication
、リリースでは通常のクラスを使用しています。
デバッグ ビルドとリリース ビルドで代替Application
サブクラスを使用することは可能ですか? 私はもう試した:
- 要素の代替定義を使用して、src/debug のルートに AndroidManifest.xml ファイルを定義し
<application>
ます。Gradle は、メイン マニフェストには X がありますが、ライブラリには Y があり、使用されていないと警告していDebugMyApplication
ます。 - Application サブクラスの完全修飾名を、デバッグ res ファイルで個別に定義できるリソースとして宣言します
<application android:name="@string/xyz"/>
が、参照ではなくリテラル パッケージ名として解釈されます。
私のより広い目標の背景については、次のとおりです。
リリース APK には見られない静的なモック Web サービス レスポンスを提供する代替の Dagger モジュールを提供します。アプリケーションのメソッドをサブクラス化getModuleList()
し、モジュール リストの宣言を変更するのが最善の策のように思えました。
助けてくれてありがとう!
java - Dagger のオブジェクト グラフとシングルトン
私は短剣を使い始めたばかりで、シングルトン オブジェクトに関するいくつかの問題に遭遇しました。
したがって、シングルトンは次のようになります。
オブジェクト グラフが作成されるアプリケーション クラス:-
MainActivity.class:-
したがって、これを実行するたびに、シングルトン「MySingle」のインスタンス数は 1 になります。これは問題ありません。ただし、これらの行のコメントを外すと:-
インスタンスの数を 2 として取得します。ここから、Dagger がオブジェクト グラフごとにシングルトンを作成することがわかりますが、上記の 2 行を使用して理解したところから、既存のオブジェクト グラフに MainActivity.class を挿入しています。今のところ、私には明らかではありません..私はそれを試しているだけです.
java - 依存関係を持つオブジェクトでマップを構築する
私はインターフェースを持っています:
MyInterface の各実装には、独自の (異なる) 依存関係があります。例:
何百もの MyInterface 実装を持つことができます。今、私は次のようにマップを作成したいと思います:
残念ながら、このショート サーキット ダガーは、MyObjectOne、MyObjectTwo、...、および MyObjectN に何も注入しません。さらに、このコードはライブラリ/モジュールの一部であるため、現時点では ObjectGraph はありません。
解決策を探していたときに、Guice のMapBinderクラスに出くわしました。この機能は Dagger では使用できません。
私の問題は Dagger で解決できますか?
そうでない場合、MapBinder は Dagger 2.0 に組み込まれる可能性のある機能ですか?
乾杯と前もって感謝します。
android - インジェクションが行われないときに親クラスをインジェクトするように求められます
私は短剣を試していて、ObjectGraph をセットアップしようとしています。BaseModule
SharedPreferences や Bus などを格納する を作成しました。WidgetModule
画像読み込み用のピカソなどを含むを作成しました。
アダプタ クラスの 1 つに Picasso を挿入しようとしています。アダプター コンストラクターで ObjectGraph インスタンスを取得し、アダプターを挿入します。私は不平を言う実行時例外を受け取ります:
Caused by: java.lang.IllegalArgumentException: No inject registered for members/<ParentClass>$1. You must explicitly add it to the 'injects' option in one of your modules.
私はそのクラスで注射を行っていないので、これは私にとって奇妙です. ParentClass
アダプターを作成する場所ですが、注入はアダプター自体で行われます。injects
アノテーションに挿入されていない親クラスを本当に宣言する必要がありますか? これが私のアダプターコンストラクターです:
ここに私のモジュールがあります:
ご覧のとおり、アダプター クラスが にinjects
あるのに、なぜ親クラスに言及しているのでしょうか。
また、これは ObjectGraph を作成するための適切な構造ですか? includes
とのドキュメントaddsTo
は非常にまばらで、U2020 のようなすべてのデモ プロジェクトは、実際の意味があいまいです。必要に応じて簡単にオーバーライドできるように、モジュールを分離しようとしています。
編集:両方のモジュールに親クラスを追加しても、例外が発生することがわかりました。これは奇妙です。
android - ダガーがコンパイル依存関係に既に含まれている場合、Espresso を instrumentTest 依存関係に追加する
私は gradle プロジェクト (Gradle 1.9 を使用)を持っており、コンパイル依存関係に短剣があるプロジェクトにエスプレッソ ( https://github.com/JakeWharton/double-espressoから) を追加しようとしています。
これが私の依存構造です:
依存関係 {
}
今私の問題は、テストが開始された直後に「gradle connectedInstrumentTest」を介してテストを開始すると(アクティビティが起動されるのを確認します)、次のエラーが発生することです。
...activity.MainActivityTest > testItemText[Nexus 5 - 4.4.2] FAILED java.lang.IllegalStateException: オブジェクト グラフの作成エラー: com.google.android.apps.common.testing.ui.espresso.FailureHandler をバインドできませんでしたクラス com.google.android.apps.common.testing.ui.espresso.base.BaseLayerModule で必要なキー com.google.android.apps.common.testing.ui.espresso.FailureHandler :ClioAndroid:connectedInstrumentTest FAILED
除外グループ: 'com.squareup.dagger' をコメント アウトすると、別のエラーが発生します: 「http://b.android.com/65445」に従って予期される「java.lang.IllegalAccessError」が原因でインストルメンテーションの実行に失敗しました。
問題は、「除外グループ: 'com.squareup.dagger'」を追加すると、espresso の短剣オブジェクト グラフが台無しになることだと思います。そのための回避策を見つけることができませんでした。どんな助けでも大歓迎です。
android - Dagger - 「"do" と "how" を分ける」とはどういう意味ですか?
Dagger に関する Jake のスライドを見てきました。29ページ目で、彼は「「行う」を「どのように」から分離する」と述べています。それは具体的にどういう意味ですか?そして、その利点は何ですか?
https://speakerdeck.com/jakewharton/android-testing?slide=29
java - ダガーアシスト注射の例を探しています
オブジェクトグラフからいくつかの依存関係を取得し、実行時に呼び出し元から他の依存関係を取得するクラスがあります。
Factory を定義する解決策を思いつきました。
ImageDownloader
ここで、クライアントのコンストラクターに注入する代わりに、単純にそのメソッドを注入ImageDownloader.Factory
して呼び出します。create()
ご覧のとおり、これは非常に冗長で長いものです。また、複製とボイラープレートがたくさんあります。フィールド自体に で注釈を付けるにはいくつかの障害がある@Inject
ため、現時点ではこの可能性を無視しましょう。
Square の人々は、プロバイダーを使用して興味深い解決策を思いつきました。Factory
インターフェイスを定義し、
モジュールで提供し、
(再び、dagger-discuss@ から)。
MyImageDownloader
は、別のクラスによって注入されるクラスによって注入されるクラスであり、さらに別のクラスによって注入されるクラスであり、 ... で参照されます@Module
。これは何とか*機能し、すべてのクラスはビルド時に見つかります。さて、モジュールを追加するには、オブジェクト グラフにそれを明示的に知らせる必要があります。
新しいクラスを注入するのは非常に簡単ですが、新しいモジュールを追加するのは非常に面倒です。
私の質問は次のとおりです。補助注射は実際にどのように行われますか? 誰にも例がありますか?使用する場合、どのように使用ImageModule
すればよいですか?
* - 「どういうわけか」というのは、それが私にとって部分的に魔法であることを意味します。