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);