Android - Dagger 注入非 Activity 或片段
Android - Dagger injection into a non Activity or fragment
所以我们在应用程序中使用了 dagger 2,但现在我想注入一个 class,它不是 activity 或片段。我怎样才能做到这一点。所以我有以下 class 我想注入:
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;
}
}
这项 class 工作是启动分析。我想感染一个名为 deviceInfo 的 class,我已经有一个 provides 方法。
如果我现在尝试注入,它会编译并运行,但随后崩溃并给我一个空对象
将 deviceInfo 作为构造函数参数添加到 Analytics class。然后在你的 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]);
}
这也可以通过构造函数注入来完成
public class Analytics {
@Inject
public Analytics(PageMap pagesByActivity, HitFactory hitFactory,
Provider<String> storeIdProvider,
Provider<Checker> checkerProvider,
String suiteIds,
DeviceInfo deviceInfo) {
this.deviceInfo = deviceInfo;
}
}
如果您想在 class 中注入我们没有像 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);
所以我们在应用程序中使用了 dagger 2,但现在我想注入一个 class,它不是 activity 或片段。我怎样才能做到这一点。所以我有以下 class 我想注入:
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;
}
}
这项 class 工作是启动分析。我想感染一个名为 deviceInfo 的 class,我已经有一个 provides 方法。
如果我现在尝试注入,它会编译并运行,但随后崩溃并给我一个空对象
将 deviceInfo 作为构造函数参数添加到 Analytics class。然后在你的 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]);
}
这也可以通过构造函数注入来完成
public class Analytics {
@Inject
public Analytics(PageMap pagesByActivity, HitFactory hitFactory,
Provider<String> storeIdProvider,
Provider<Checker> checkerProvider,
String suiteIds,
DeviceInfo deviceInfo) {
this.deviceInfo = deviceInfo;
}
}
如果您想在 class 中注入我们没有像 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);