我正试图给Glide注入dagger。
所以我有了AppModule:
@Module
class AppModule {
@Provides
fun provideRequestOptions(): RequestOptions {
return RequestOptions()
.placeholder(R.drawable.white_background)
.error(R.drawable.white_background)
}
@Provides
fun provideGlideInstance(application: Application, requestOptions: RequestOptions): RequestManager{
return Glide.with(application).setDefaultRequestOptions(requestOptions)
}
@Nullable
@Provides
fun provideAppDrawable(application: Application): Drawable? {
return ContextCompat.getDrawable(application, R.drawable.logo)
}
}
和AuthActivity:
class AuthActivity : DaggerAppCompatActivity() {
lateinit var binding: ActivityAuthBinding
@Inject
lateinit var logo: Drawable
@Inject
lateinit var requestManager: RequestManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityAuthBinding.inflate(layoutInflater)
setContentView(binding.root)
setLogo()
}
private fun setLogo() {
requestManager.load(logo).into(binding.loginLogo)
}
}
AppModule中的provideAppDrawable()
必须返回可为null的Drawable?
。当我试图构建应用程序时,Dagger抱怨它的可空性:
AppComponent.java:7: error: [Dagger/Nullable] android.graphics.drawable.Drawable is not nullable, but is being provided by @org.jetbrains.annotations.Nullable @androidx.annotation.Nullable @Provides android.graphics.drawable.Drawable com.example.daggercodingwithmitch.di.AppModule.provideAppDrawable(android.app.Application)
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.example.daggercodingwithmitch.BaseApplication> {
首先,我试图使AuthActivity
中的logo
var可以为null,但lateinit不能为null。如果我不使用lateinit并做这样的事情:var logo: Drawable? = null
我会在计算私有字段注入时出现奇怪的错误,即使它不是私有的:
AuthActivity.java:10: error: Dagger does not support injection into private fields
private android.graphics.drawable.Drawable logo;
我该怎么修?Thx。
将徽标字段设为可为null。Dagger将不允许向不可为null的字段注入可为null对象。
@Inject
var logo: Drawable?=null
在Java中,
@Nullable
@Inject
Drawable logo;
您需要标记字段"徽标"@也可以为null
如果@Providers方法被标记为@Nullable,Dagger将只允许注入标记为@Nullable的站点。试图将@Nullable提供与非@Nullaable注入站点配对的组件将无法编译。
https://dagger.dev/api/2.28/dagger/Provides.html
最简单的方法是让provideAppDrawable返回Drawable而不是Drawable?并从中删除@Nullable。有没有任何情况下返回null而不是bug?如果不是,它就不应该是一个可以为null的变量。