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种类型的方法:
将某些东西注入某个对象,这就是您看到的错误。这些方法通常 return 无效,但如果您尝试拥有类似构建器的东西,您可以 return 同一个对象。
MyInjectedObject inject(MyInjectedObject object); // or
void inject(MyInjectedObject object);
子组件,您可以将所需的模块作为参数包括在内(如果它们需要初始化)
MySubcomponent plus(MyModuleA module);
基本上只是 "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.
我正在尝试将我们当前的系统从 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种类型的方法:
将某些东西注入某个对象,这就是您看到的错误。这些方法通常 return 无效,但如果您尝试拥有类似构建器的东西,您可以 return 同一个对象。
MyInjectedObject inject(MyInjectedObject object); // or void inject(MyInjectedObject object);
子组件,您可以将所需的模块作为参数包括在内(如果它们需要初始化)
MySubcomponent plus(MyModuleA module);
基本上只是 "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.