2017-07-10 4 views
0

私はモジュールFragmentModuleを持つパラメータアンドロイドダガー-2方式の依存関係をどのように提供するかは

@Module 
public class FragmentModule 
{ 
    @Provides 
    public static PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject) 
    { 
     PickerDashboardFragment fragment = new PickerDashboardFragment(); 
     Bundle b = new Bundle(); 
     b.putInt("status", status); 
     b.putString("name", name); 
     b.putInt("object", someComplexObject); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Provides 
    public static PickingFragment providesPickingFragment() 
    { 
     PickingFragment fragment = new PickingFragment(); 
     return fragment; 
    } 
} 

ここに私の活動で私のComponentクラス

@Component(modules = {UtilModule.class, FragmentModule.class}) 
public interface ApplicationComponent 
{ 
    void inject(PickerDashboardActivity target); 
} 

は私がPickerDashboardActivityを注入していますどのようにこれはされてい

@Inject 
PickerDashboardFragment frag; 

ApplicationComponent component = DaggerApplicationComponent.builder().build(); 
     component.inject(this); 

マイ質問 I状態、名前、someComplexObjectという、PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject)の依存関係を提供する最も簡単で簡単な方法は何ですか。

よろしく

+1

誰か他の人が答えたいですか? –

答えて

1

追加属性と、このようなあなたのモジュールへProvides方法:

@Module 
public class FragmentModule 
{ 

    private final int status; 
    private final String name; 
    private final Object someComplexObject; 

    public FragmentModule(int status, String name, Object someComplexObject) { 
     this.status = status; 
     this.name = name; 
     this.someComplexObject = someComplexObject; 
    } 

    @Provides 
    int providesStatus() { 
     return status; 
    } 

    @Provides 
    String providesName() { 
     return name; 
    } 

    @Provides 
    Object providesSomeComplexObject() { 
     return someComplexObjext; 
    } 

    @Provides 
    public static PickerDashboardFragment providesPickerDashboard(int status, String name, Object someComplexObject) 
    { 
     PickerDashboardFragment fragment = new PickerDashboardFragment(); 
     Bundle b = new Bundle(); 
     b.putInt("status", status); 
     b.putString("name", name); 
     b.putInt("object", someComplexObject); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Provides 
    public static PickingFragment providesPickingFragment() 
    { 
     PickingFragment fragment = new PickingFragment(); 
     return fragment; 
    } 
} 

はint型を提供するモジュールを有し、かつ、文字列は、おそらくあなたがするために(例えばNamedなど)いくつかの修飾子を使用するようになります衝突を避ける

+1

答えに感謝し、名前、ステータスなどの値はどこに来ましたか?フラグメントモジュールでは初期化していませんでした! –

+0

私の悪い、私はコンストラクタを忘れてしまった。私は答えを更新しました – Pelocho

+0

心配はありません。あなたの答えは正しいが、私たちがやるべきオーバーヘッドのように思える。より多くのメソッドと異なる引数を持つすべてのメソッドを持つこのモジュールについて考えると、私はより多くのコンストラクタを作成し、より多くのボイラープレートを作成する必要があります。メソッドの呼び出し時にその依存関係がいっぱいになると思っていましたか? –

1

ダガーを使用してアクティビティにフラグメントを挿入しないでください。なぜですか?フラグメントには、Android OSによって制御されるライフサイクルがあります。トランザクションを使用してアクティビティにフラグメントを追加すると、FragmentManagerはそのフラグメントへの参照を保持します。アクティビティinstanceStateが保存されると、FragmentManagerに追加されたフラグメントが保存されます。 Activityが復元されたときに、FragmentManagerのFragmentの有無をチェックせずに注入を要求すると、Fragmentの2つのインスタンスを参照してメモリリークを作成します。

このため、void onCreate(Bundle savedInstanceState)メソッドでは、Dagger 2からの注入を要求するのではなく、FragmentManagerに保持されているFragmentの存在をチェックする必要があります。フラグメントが保持されていない場合は、その時点でインスタンス化できます。このためにはnewキーワードまたは静的ファクトリを使用するのは問題ありません。

例:

MyFragment frag; 

void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.content); 
    frag = fragmentManager.findFragmentByTag(MyFragment.TAG); 
    if (frag == null) { 
     frag = MyFragment.instantiate(new Bundle()); 
    } 
} 

しかし、別のレベルでは、あなたがパラメータとの依存関係を組み合わせる方法を求めているようです。これらのための良い解決策は、しばしば工場です。

class CoffeeMaker { 

    private final Kettle kettle; 
    private final Grinder grinder; 
    private final BeanFlavour beanFlavour; 

    CoffeeMaker(Kettle kettle, Grinder grinder, BeanFlavour beanFlavour) { 
     this.kettle = kettle; 
     this.grinder = grinder; 
     this.beanFlavour = beanFlavour; 
    } 
} 

beanFlavourは(暗い、ローストなど)、可変であり、変わるので、より多くの依存よりもパラメータのようなものです:あなたはコーヒーメーカーを持っていると言います。その後、CoffeeMakerFactoryを書き、ダガー2を使用して、これを注入できます。

class CoffeeMakerFactory { 

    private final Kettle kettle; 
    private final Grinder grinder; 

    @Inject 
    CoffeeMakerFactory(Kettle kettle, Grinder grinder) { 
     this.kettle = kettle; 
     this.grinder = grinder; 
    } 

    public CoffeeMaker create(BeanFlavour beanFlavour) { 
     return new CoffeeMaker(kettle, grinder, beanFlavour); 
    } 
} 

工場は、依存関係の組み合わせのための標準的なソリューションであり、see hereをパラメータと彼らもGoogle Autoのようなコード生成ツールを使用して生成することができます。

+0

これを参考にしてください。フラグメントを挿入しないでください。 –

+0

@ecDroid Googleのサンプルプロジェクトを見てください。https://github.com/googlesamples/android-architecture –

+0

Davidさん、ありがとうございました。フラグメントを挿入しないように実装を変更します。私がダガーを注入してはならない他の成分を教えてください。 –

関連する問題