dagger-2 - Dagger 1 到 2 迁移 - 成员注入(inject)方法只能返回注入(inject)的类型或 void

标签 dagger-2

我试图将我们当前的系统从 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);
}

运行它时,providerRawSharedPreferencesStore 中不断出现此错误:

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



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

最佳答案

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

  • 将某些东西注入(inject)某个对象,这就是您看到的错误。这些方法通常返回 void,但如果您尝试使用类似 builder 的东西,您可以只返回相同的对象。
    MyInjectedObject inject(MyInjectedObject object); // or
    void inject(MyInjectedObject object);
    
  • 子组件,您可以将所需的模块作为参数包含在内(如果它们需要初始化)
    MySubcomponent plus(MyModuleA module);
    
  • 基本上只是“getter”或正确调用提供方法来公开对象,从组件手动获取它们,以及您的子组件
    MyExposedThing getMything();
    

  • 这是其中哪一个?
    // the line you get your error:
    SharedPreferencesStore provideRawSharedPreferencesStore(
            @Named("RawPreferences") SharedPreferences sharedPreferences);
    

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

    看来您只是尝试制作 SharedPreferencesStore可访问,如 3. 中所述.如果您只是在同一范围/组件内依赖它,则可以删除整个组件。如果你需要 getter,你应该删除参数。您的模块知道如何创建它。
    SharedPreferencesStore provideRawSharedPreferencesStore(); // should work.
    

    关于dagger-2 - Dagger 1 到 2 迁移 - 成员注入(inject)方法只能返回注入(inject)的类型或 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37149407/

    相关文章:

    android - Dagger 2 的依赖注入(inject)

    kotlin - 注入(inject)不适用于第二个构造函数

    android - 使用 Dagger 跨两个/或多个 fragment 和一个 Activity 共享 ViewModel

    android - 带有动态拦截器的 Okhttp3 Dagger2 中的最佳作用域

    android - ERROR : error. NonExistentClass Kotlin 在多模块 Dagger 项目中

    dependency-injection - 是否有任何简单的方法可以用 dagger2 替换 Guice 中的 DI 实现

    android - 尝试使用 Dagger2 了解 Android 上的依赖注入(inject)

    java - Dagger 2 不生成组件

    android - 在 dagger 模块的上下文中,Kotlin 对象和类有什么区别

    Kotlin:使用扩展运算符将数组传递给可变参数方法