2017-07-03 20 views
1

ちょうど開始Dagger2にはとても新しいです。私はこのようなものを達成したいが、成功はしない。ここでDagger2どのように@異なる2つの実装を持つ1つのタイプを提供する

私のモジュールは

@Module 
public class UtilModule 
{ 
    @Provides 
    @Named("fragmentUtilActivity") 
    public FragmentUtils providesFragmentUtilForActivity(Context context) 
    { 
     return new FragmentUtils(context); 
    } 

    @Provides 
    @Named("fragmentUtilFragment") 
    FragmentUtils providesFragmentUtilForFragment(Fragment fragment) 
    { 
     return new FragmentUtils(fragment); 
    } 

} 

であり、これは私のコンポーネント

@Component(modules = UtilModule.class) 
public interface UtilComponent 
{ 
    @Named("fragmentUtilActivity") 
    FragmentUtils fragmentUtilsActivity(Context context); 

    @Named("fragmentUtilFragment") 
    FragmentUtils fragmentUtilsFragment(Fragment fragment); 
} 

であり、これは私が欲しいもの、私のFragmentUtilクラス

package myms.utils; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.content.Context; 

import javax.inject.Inject; 

import myms.R; 

public class FragmentUtils 
{ 
    private Context context; 

    private Fragment hostFragment; 

    public FragmentUtils(Context context) 
    { 
     this.context = context; 
    } 

    public FragmentUtils(Fragment hostFragment) 
    { 
     this.hostFragment = hostFragment; 
    } 

    public void addFragment(Fragment fragment, boolean addToBackStack) 
    { 
     FragmentTransaction transaction = ((Activity) context).getFragmentManager() 
                   .beginTransaction(); 
     transaction.add(R.id.fragment_container, fragment, null); 

     if(addToBackStack) 
     { 
      transaction.addToBackStack(null); 
     } 

     transaction.commit(); 
    } 

    public void addNestedFragment(Fragment fragment, boolean addToBackStack) 
    { 
     FragmentTransaction transaction = hostFragment.getChildFragmentManager().beginTransaction(); 
     transaction.add(R.id.nested_fragment_container, fragment, null); 

     if(addToBackStack) 
     { 
      transaction.addToBackStack(null); 
     } 

     transaction.commit(); 
    } 

    public void replaceNestedFragment(Fragment fragment, boolean addToBackStack) 
    { 
     FragmentTransaction transaction = hostFragment.getChildFragmentManager().beginTransaction(); 
     transaction.replace(R.id.nested_fragment_container, fragment, null); 

     if(addToBackStack) 
     { 
      transaction.addToBackStack(null); 
     } 

     transaction.commit(); 
    } 
} 

がfragmentUtilsのインスタンスを使用することです2つの異なる実装で1つはアクティビティ用であり、もう1つはフラグメント用です。私が間違っていることを教えてください。

また、@Componentインターフェイスのvoid injection(SomeClass)の目的を理解してください。

よろしく

+0

いずれか.......? –

+0

エラーが表示されますか?あなたが直面している正確な問題の説明を含めてください。 –

+0

'FragmentUtils'は2つの異なるクラスのように見えます。一つはホストフラグメントで動作し、もう一つはアクティビティで動作します。 2組のメソッドがあり、間違ったものを呼び出すとNullPointerExceptionが発生します。これは、このコードを2つの異なるクラスに分割する必要があることを示す_really_強い兆候です。 –

答えて

2

オーケー努力した後、私はとても基本的に私は私の場合、コンテキストとフラグメントのように私のメソッドの依存関係を提供する必要が

package myms.modules; 

import android.app.Fragment; 
import android.content.Context; 

import javax.inject.Named; 

import dagger.Module; 
import dagger.Provides; 
import myms.utils.FragmentUtils; 


@Module 
public class UtilModule 
{ 
    private Context context; 

    private Fragment fragment; 


    public UtilModule(Context context) 
    { 
     this.context = context; 
    } 

    public UtilModule(Fragment fragment) 
    { 
     this.fragment = fragment; 
    } 

    @Provides 
    @Named("fragmentUtilActivity") 
    public FragmentUtils providesFragmentUtilForActivity(Context context) 
    { 
     return new FragmentUtils(context); 
    } 

    @Provides 
    @Named("fragmentUtilFragment") 
    FragmentUtils providesFragmentUtilForFragment(Fragment fragment) 
    { 
     return new FragmentUtils(fragment); 
    } 

    @Provides 
    Context provideContext() 
    { 
     return context; 
    } 

    @Provides 
    Fragment provideFragment() 
    { 
     return fragment; 
    } 

} 

私UtilMoudleクラスを変更することによって、それを解決することができますよ。そして最後に、私はこのようにする必要があるインスタンスを取得します。たとえば、アクティビティの場合

UtilComponent component = DaggerUtilComponent.builder() 
                .utilModule(new UtilModule(this)) 
                .build(); 
     FragmentUtils fragmentUtils = component.fragmentUtilsActivity(); 

これはグラフを作成する際にコンテキストを提供するため、注意してください。

私はこのダガーのことにとても興味がありますので、この方法を慎重に使用してください。保証/ノークレームは適用されません。ハッピーダッガリング:)

関連する問題