【问题标题】:Dagger 1 to 2 migration - Members injection methods may only return the injected type or voidDagger 1 到 2 迁移 - 成员注入方法只能返回注入的类型或 void
【发布时间】:2016-05-10 21:38:56
【问题描述】:

我正在尝试将我们当前的系统从 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) 错误:成员注入方法只能返回注入的类型或void。

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

【问题讨论】:

    标签: dagger-2


    【解决方案1】:

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

    1. 将某些东西注入某个对象,这就是您看到的错误。这些方法通常返回 void,但如果您尝试使用 builder 之类的东西,您可以只返回相同的对象。

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

      MySubcomponent plus(MyModuleA module);
      
    3. 基本上只是“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.
    

    【讨论】:

    • 感谢您的快速回复。我对此很陌生。你是说组件作为模块的吸气剂吗?
    • @JuanAcevedo 这些提供方法只是让您可以从外部访问对象。模块将直接访问对象,因为它们是组件的一部分。他们不需要这种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多