2016-08-04 44 views
0

因此,我們在我們的應用程序內使用匕首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作爲構造參數來分析類。然後在你的Dagger Module provides方法中,在參數中包含deviceInfo。這意味着您需要讓Dagger爲您創建您的Analytics對象。 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);