Dagger 1 到 2 迁移 - 成员注入方法只能 return 注入类型或无效

Dagger 1 to 2 migration - Members injection methods may only return the injected type or void

我正在尝试将我们当前的系统从 dagger 1 迁移到 2,我在这上面停留了半天。我不认为我理解得很好。

这是我的模块:

public class BaseModule {

private final Context context;
private final SharedPreferences rawSharedPreferences;

public BaseModule(
        Context context,
        @Named("RawPreferences") SharedPreferences rawSharedPreferences
        ) {
    this.context = context;
    this.rawSharedPreferences = rawSharedPreferences;
}

@Provides
@Singleton
public Context provideContext() {
    return context;
}

@Provides
@Singleton
public DevicePlatform provideDevicePlatform(AndroidDevicePlatform devicePlatform) {
    return devicePlatform;
}

@Provides
@Named("RawPreferences")
@Singleton
public SharedPreferences provideRawSharedPreferences() {
    return rawSharedPreferences;
}

@Provides
@Named("RawPreferencesStore")
@Singleton
public SharedPreferencesStore provideRawSharedPreferencesStore(
        @Named("RawPreferences") SharedPreferences sharedPreferences) {
    return new AndroidSharedPreferencesStore(sharedPreferences);
}

我的组件:

@Singleton
@Component(
    modules = {BaseModule.class}
)
public interface BaseComponent {
    void inject (DefaultClientController defaultClientController);
    void inject (StatisticsProvider statisticsProvider);


    Context provideContext();

    AndroidDevicePlatform provideDevicePlatform(AndroidDevicePlatform devicePlatform);

    SharedPreferences provideRawSharedPreferences();

    SharedPreferencesStore provideRawSharedPreferencesStore(
            @Named("RawPreferences") SharedPreferences sharedPreferences);
}

当我 运行 它时,我在 provideRawSharedPreferencesStore 中不断收到此错误:

Error:(168, 28) error: Members injection methods may only return the injected type or void.

我不明白为什么。有人可以帮帮我吗?谢谢!

一个组件可以包含3种类型的方法:

  1. 将某些东西注入某个对象,这就是您看到的错误。这些方法通常 return 无效,但如果您尝试拥有类似构建器的东西,您可以 return 同一个对象。

    MyInjectedObject inject(MyInjectedObject object); // or
    void inject(MyInjectedObject object);
    
  2. 子组件,您可以将所需的模块作为参数包括在内(如果它们需要初始化)

    MySubcomponent plus(MyModuleA module);
    
  3. 基本上只是 "getters" 或正确调用提供方法来公开对象,手动从组件中获取它们,以及您的子组件

    MyExposedThing getMything();
    

这是哪一个?

// the line you get your error:
SharedPreferencesStore provideRawSharedPreferencesStore(
        @Named("RawPreferences") SharedPreferences sharedPreferences);

您已经从您的模块中提供了 SharedPreferencesStore那里 你还声明了它对 RawPreferences: SharedPreferences 的依赖。您不必在您的组件中再次执行此操作。

您似乎只是尝试使 SharedPreferencesStore 可访问,如 3. 中所述。如果您只是在同一范围/组件内依赖它,则可以删除整个组件。如果您需要 getter,您应该只删除该参数。您的模块知道如何创建它。

SharedPreferencesStore provideRawSharedPreferencesStore(); // should work.