我试图将我们当前的系统从 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 种类型的方法:
MyInjectedObject inject(MyInjectedObject object); // or
void inject(MyInjectedObject object);
MySubcomponent plus(MyModuleA module);
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/