- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白如何解决这个错误。在尝试将 fragment 添加到我的应用程序并使用 Dagger for DI 后出现此错误。这是错误堆栈:
error: [Dagger/IncompatiblyScopedBindings] di.component.ApplicationComponent (unscoped) may not reference scoped bindings: @Provides @di.ApplicationContext @di.ApplicationScope android.content.Context di.Module.ApplicationContextModule.getApplicationContext(application.MyApplication) @Provides @di.ApplicationScope android.content.SharedPreferences di.Module.SharedPreferencesModule.getSharedPreferences(@di.ApplicationContext android.content.Context) @Provides @di.ApplicationScope service.KeyStoreServiceInterface di.Module.KeyStoreModule.getKeyStoreService(@Named("KEY_STORE_FILE") java.io.File) @Provides @di.ApplicationScope repository.SharedPreferencesHelper di.Module.SharedPreferenceHelperModule.getSharedPreferencesHelper() @Provides @di.ApplicationScope service.CoinmarketcapService di.Module.CoinmarketcapModule.getCoinmarketcapService(com.google.gson.Gson, okhttp3.OkHttpClient) @Provides @di.ApplicationScope com.google.gson.Gson di.Module.GsonModule.getGson() @Provides @di.ApplicationScope okhttp3.OkHttpClient di.Module.OkHttpModule.getOkHttpClient() @Provides @di.ApplicationScope repository.WalletRepositoryInterface di.Module.WalletRepositoryModule.getWalletRepository(repository.SharedPreferencesHelper, service.KeyStoreService)
@Component(modules = {ApplicationContextModule.class,
SharedPreferencesModule.class,
KeyStoreModule.class,
SharedPreferenceHelperModule.class,
AndroidInjectionModule.class,
BindModule.class,
AndroidSupportInjectionModule.class,
OkHttpModule.class,
GsonModule.class,
CoinmarketcapModule.class,
WalletRepositoryModule.class})
@SuppressWarnings("unchecked")
public interface ApplicationComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(MyApplication myApplication);
ApplicationComponent build();
}
void inject(MyApplication myApplication);
@ApplicationContext
Context getApplicationContext();
SharedPreferences getSharedPreferences();
KeyStoreServiceInterface getKeyStoreService();
SharedPreferencesHelper getSharedPreferencesHelper();
CoinmarketcapService getCoinmarketcapService();
WalletRepositoryInterface getWalletRepository();
}
public class MyApplication extends MultiDexApplication implements HasActivityInjector, HasFragmentInjector {
private ApplicationComponent applicationComponent;
@Inject
DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Inject
DispatchingAndroidInjector<Fragment> fragmentDispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerApplicationComponent
.builder()
.application(this)
.build()
.inject(this);
Timber.plant(new Timber.DebugTree());
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
public ApplicationComponent getApplicationComponent() {
return applicationComponent;
}
@Override
public AndroidInjector<Fragment> fragmentInjector() {
return fragmentDispatchingAndroidInjector;
}
}
最佳答案
您尚未向我们展示 ApplicationContextModule,但从您的错误消息中可能包含以下内容:
@Provides @ApplicationContext @ApplicationScope
Context getApplicationContext(MyApplication application) {
return application.getApplicationContext();
}
您已注释此
@Provides
使用
@ApplicationScope
的方法,它指示 Dagger 将返回的 Context 保存在一个组件中——具体来说,您还使用
@ApplicationScope
注释的组件.在您对编辑进行更改之前,没有匹配的
@ApplicationScope
, Dagger 给了你这个信息。现在你有了一个,Dagger 知道在哪里存储保存的 Context 实例。
Since Dagger 2 associates scoped instances in the graph with instances of component implementations, the components themselves need to declare which scope they intend to represent. For example, it wouldn’t make any sense to have a @Singleton binding and a @RequestScoped binding in the same component because those scopes have different lifecycles and thus must live in components with different lifecycles. To declare that a component is associated with a given scope, simply apply the scope annotation to the component interface.
getApplicationContext
之外,您的范围并没有真正给您太多帮助。 ApplicationContextModule 中的方法。
@ApplicationScoped
绑定(bind)属于我的 ApplicationComponent?毕竟,Dagger 看到 ApplicationContextModule 安装在 ApplicationComponent 上,所以唯一有意义的方法是 ApplicationComponent 是隐式的
@ApplicationScoped
。”两个原因:首先,从某种意义上说,这是强制文档,它也有助于 Dagger 更清楚哪个绑定(bind)是错误的,因此您不会意外安装
@ActivityScoped
直接绑定(bind)到您的 ApplicationComponent 中,并让 Dagger 相信您的组件同时是应用程序范围和 Activity 范围的。其次,您还可以使用范围注释来注释可注入(inject)类,而 Dagger 将无法推断出任何东西,因为它没有可以读取的组件-安装-模块关系。在这两者之间,Dagger 强制你在文档中注释你的组件,我在上面引用过。
关于android - 错误 : [Dagger/IncompatiblyScopedBindings] (unscoped) may not reference scoped bindings:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53876311/
我不明白如何解决这个错误。在尝试将 fragment 添加到我的应用程序并使用 Dagger for DI 后出现此错误。这是错误堆栈: error: [Dagger/IncompatiblyScop
我是一名优秀的程序员,十分优秀!