問題タブ [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.

0 投票する
1 に答える
1313 参照

android - UIスレッドに注入し、注入が完了するのを待ってから続行する方法は?

Dagger では、UI スレッドに注入する必要があります。JUnit を実行しているときは、UI スレッドで実行していません。これを機能させるには、Runnable を UI スレッドに投稿し、注入が完了するまで待つ必要があります。

私のコードは次のようになります。

問題は、latch.await() を呼び出したときに myRunnable が開始されないことです。JUnit の実行時に Dagger に注入させる最良の方法は何ですか?

0 投票する
1 に答える
408 参照

android - Dagger & Android - テストでの競合状態?

Android プロジェクトのアクティビティに依存関係を挿入するために Dagger を使用しています。すべてのプロバイダーは、Applicationサブクラスによって格納および管理される 1 つのモジュールに保持されます。アクティビティは依存関係を に注入しonCreate()、コンテキストからモジュールを取得します。

テストでは、デフォルトのモジュールを別のモジュールに交換する必要がある場合があります。を使用してActivityAndroidTestCase2います。を呼び出す前にアプリケーション コンテキストを取得し、getActivity()次のようにモジュールを置き換えます。

MyApplicationコード:

sleep()悲しいことに、テストはときどき失敗します。それが最初のコード スニペットの理由です。スレッドがスリープする時間が長いほど、失敗の可能性は低くなりますが、問題が完全に解決されるわけではありません。

この奇妙な動作の原因と、この問題を解決する方法についてのアイデアはありますか?

0 投票する
3 に答える
5407 参照

android - Dagger を使用した Android の機能テスト

Mockito & Daggerで Activity をテストしようとしています。アプリケーションのアクティビティに依存関係を挿入できましたが、アクティビティをテストするときにアクティビティにモックを挿入できませんでした。Activity を注入してテストするか、getActivity() で作成する必要がありますか?

0 投票する
2 に答える
6278 参照

dependency-injection - コンストラクター引数を持つ短剣モジュール?

Guice では、モジュールがいつ構築されるかを完全に制御し、インストールしたコンストラクター引数でいくつかのモジュールを使用しました。

ただし、Dagger では、他のモジュールを参照する方法は @Module includes アノテーションを介して行われ、インストールするモジュールを作成する同じ方法は提示されません。

コンストラクター引数を持つ複数のモジュールから適切な ObjectGraph を作成することは可能ですか? 特に短剣コンパイラで動作し、循環グラフに陥らないものは?

0 投票する
5 に答える
12842 参照

android - Using Dagger for dependency injection on constructors

So, I'm currently redesigning an Android app of mine to use Dagger. My app is large and complicated, and I recently came across the following scenario:

Object A requires a special DebugLogger instance which is a perfect candidate for injection. Instead of passing around the logger I can just inject it through A's constructor. This looks something like this:

So far this makes sense. However, A needs to be constructed by another class B. Multiple instances of A must be constructed, so following Dagger's way of doing things, I simple inject a Provider<A> into B:

Ok, good so far. But wait, suddenly A needs additional inputs, such as an integer called "amount" that is vital to its construction. Now, my constructor for A needs to look like this:

Suddenly this new parameter interferes with injection. Moreover, even if this did work, there would be no way for me to pass in "amount" when retrieving a new instance from the provider, unless I am mistaken. There's several things I could do here, and my question is which one is the best?

I could refactor A by adding a setAmount() method that is expected to be called after the constructor. This is ugly, however, because it forces me to delay construction of A until "amount" has been filled in. If I had two such parameters, "amount" and "frequency", then I would have two setters, which would mean either complicated checking to ensure that construction of A resumes after both setters are called, or I would have to add yet a third method into the mix, like so:

The other alternative is that I don't use constructor-based injection and go with field-based injection. But now, I have to make my fields public. This doesn't sit well with me, because now I am obligated to reveal internal data of my classes to other classes.

So far, the only somewhat elegant solution I can think of is to use field-based injection for providers, like so:

Even still, I'm unsure about the timing, since I'm not sure if Dagger will inject the provider before my constructor is called.

Is there a better way? Am I just missing something about how Dagger works?

0 投票する
1 に答える
2556 参照

dependency-injection - ダガーでバインディングをオーバーライドできますか?

クラスのデフォルトの impl があり、それが @Inject コンストラクターを定義している場合、それは素晴らしいことです。システムがそれを拾います。

1 つのアプリがそのデフォルトの impl をサブクラスでオーバーライドしたい場合、そのモジュールで @Provides を定義し、独自のコードでそのサブクラスで「new」を呼び出すことができ、dagger は代わりにその impl を使用します (これまでのところ、私が知る限り、これは機能します)。

ただし、短剣でそのサブクラスをインスタンス化する場合、@Module で「override=true」を宣言せずに実行する方法はありますか? ビルド時のすべての重複チェックで適切な警告が表示されるように、override=true を使用しないのが好きです。

もちろん、それを行う 1 つの方法は、すべてのアプリに @Provides を直接宣言させることです。それは膨満感を増すだけです。

私は以前に GIN (Guice for GWT) を使用したことがあり、.class 参照によって必要なクラスへのバインディングを定義できますが、短剣に似たものは見当たりません。

0 投票する
1 に答える
116 参照

dependency-injection - ダガーのコンパイルに予期しないキーがあります

短剣から次のエラーが表示されます。

これは、注入可能な依存関係のないクラスがあるために発生すると考えています。クラスには空のパブリックコンストラクター (@Inject を使用) があり、メンバーにも注入するものはありません。@Provides を宣言する必要がないようにこれを行いました。@Inject を持つクラスは、上記のエラー メッセージにリストされているクラスのサブクラスであることに注意してください。

これは短剣のバグですか、それとも何か不足していますか?

@Inject を削除しても @Provides をモジュールに追加しない場合、ダガーはすべての依存関係で @Inject または @Provides を必要とするため、もちろんまったく機能しません。

0 投票する
1 に答える
1380 参照

dependency-injection - ダガー フィールドの注入とエントリ ポイント

プロジェクトの 1 つで短剣を試していますが、「フィールド インジェクションは、クラスをモジュール定義のエントリ ポイントとして宣言した場合にのみ機能します。」という状況が発生しています。

これは正しい動作ですか?

Messenger.class がエントリ ポイントとして宣言されていない場合、以下の依存関係は Messenger クラスに注入されません。コンストラクター インジェクターは正常に動作しますが、マルチパラメーター コンストラクターを宣言したくありません。

0 投票する
1 に答える
445 参照

android - Android-Bootstrap mvn クリーン パッケージ エラー

Android ブートストラップを使用しようとしています: https://github.com/donnfelker/android-bootstrap

コードのクローンを作成しますが、アプリディレクトリから次のコマンドを試すと、次のようになります。

しかし、何かが間違っています。

シンボル「entryPoints」を認識できません。