匕首2可零点注射



我正试图给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中的logovar可以为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的变量。

最新更新