2016-08-04 7 views
0

私たちはアプリ内でdagger 2を使用していますが、今はアクティビティやフラグメントではないクラスに注入したいと考えています。これどうやってするの。だから私は次のクラスを私に注入したい:Android - 非アクティビティやフラグメントへの短剣の挿入

public class Analytics { 

    private final PageMap pagesByActivity; 
    private final HitFactory hitFactory; 
    private final Provider<String> storeIdProvider; 
    private final Provider<StockChecker> stockCheckerProvider; 
    public Analytics(PageMap pagesByActivity, HitFactory hitFactory, 
            Provider<String> storeIdProvider, 
            Provider<Checker> checkerProvider, 
            String suiteIds) { 

      this.pagesByActivity = pagesByActivity; 
      this.hitFactory = hitFactory; 
      this.storeIdProvider = storeIdProvider; 
      this.checkerProvider = checkerProvider; 
    } 
} 

このクラスジョブは、分析をオフにすることです。私はすでに提供メソッドを持っているdeviceInfoというクラスに感染したい。

私が試してみて、今で注入した場合は、コンパイルし、実行したが、その後

答えて

1

は解析クラスのコンストラクタのパラメータとしてDEVICEINFOを追加私にnullオブジェクトを与えてクラッシュします。次にDagger Module providesメソッドで、パラメータにdeviceInfoを含めます。つまり、Daggerにアナリティクスオブジェクトを作成させる必要があります。 Daggerは最初にDeviceInfoオブジェクトを作成してから、次にAnalyticsオブジェクトを作成します。あなたのモジュールのコードは、以下に類似しているはずです。

@Provides 
DeviceInfo provideDeviceInfo(){ 
    return new DeviceInfo(); 
} 

@Provides 
Analytics provideAnalytics(DeviceInfo deviceInfo){ 
    return new Analytics(deviceInfo, [... other parameters]); 
} 
1

これはまた、コンストラクタ・インジェクションによって行うことができる

public class Analytics { 

    @Inject 
    public Analytics(PageMap pagesByActivity, HitFactory hitFactory, 
            Provider<String> storeIdProvider, 
            Provider<Checker> checkerProvider, 
            String suiteIds, 
            DeviceInfo deviceInfo) { 

      this.deviceInfo = deviceInfo; 
    } 
} 

あなたは私たちのようなコンストラクタを持っていないところクラスに注入しますBroadcastReceiverは次に、以下を行います。

public class Receiver extends BroadcastReceiver { 
    @Inject 
    AlarmReceiver alarm; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ((AppApplication)context.getApplicationContext()).getComponent().inject(this); 
     alarm.setAlarm(context); 
    } 
} 

AppComponent

void inject(BootReceiver receiver); 
を追加で
関連する問題