Dagger 1到2迁移 - 成员注入方法可能只返回注入类型或void

Jua*_*edo 6 dagger-2

我试图将我们当前的系统从匕首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);
}
Run Code Online (Sandbox Code Playgroud)

我的组件:

@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);
}
Run Code Online (Sandbox Code Playgroud)

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

错误:(168,28)错误:成员注入方法可能只返回注入的类型或void.

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

Dav*_*jak 16

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

  1. 在某个对象中注入某些东西,这就是你看到的错误.这些方法通常返回void,但是如果你尝试使用类似构建器的东西,则可以返回相同的对象.

    MyInjectedObject inject(MyInjectedObject object); // or
    void inject(MyInjectedObject object);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 子组件,您可以将所需的模块作为参数包含(如果需要初始化)

    MySubcomponent plus(MyModuleA module);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 并且基本上只是"getters"或正确调用提供方法来公开对象,手动从组件和子组件中获取它们

    MyExposedThing getMything();
    
    Run Code Online (Sandbox Code Playgroud)

这是哪一个?

// the line you get your error:
SharedPreferencesStore provideRawSharedPreferencesStore(
        @Named("RawPreferences") SharedPreferences sharedPreferences);
Run Code Online (Sandbox Code Playgroud)

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

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

SharedPreferencesStore provideRawSharedPreferencesStore(); // should work.
Run Code Online (Sandbox Code Playgroud)