1. dagger2的@Named,無(wú)法使用
在Kotlin使用Dagger2的時(shí)候,因?yàn)橛聾Module標(biāo)注的類(lèi)里面有返回兩個(gè)類(lèi)型一樣的方法,需要用@Named來(lái)分開(kāi)標(biāo)注,不然,會(huì)build的時(shí)候報(bào)錯(cuò)。在正常情況下,用@Named(''example1")來(lái)標(biāo)注method1;用@Named("example2")來(lái)標(biāo)注method2。然后用到的地方用@Inject@Named("example1")來(lái)標(biāo)注。就完成依賴了??墒堑搅薻otlin發(fā)現(xiàn)空指針,沒(méi)有依賴成功。我又試了一下@Qualifier自定義一個(gè)注解。因?yàn)锧Named也是依賴了@Qualifier來(lái)生成的。
java是這樣子生成一個(gè)注解的
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@interface FS {
}
kotlin是這樣子生成一個(gè)注解的
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
internal annotation class FS
然后我用@FS代替@Named來(lái)標(biāo)注方法和變量,運(yùn)行后一樣是沒(méi)依賴成功,返回空指針異常。
解決方法:
然后在dagger2的issue里面提到@Named配合@Inject要這樣子用@Inject @field:Named("example1"),同理你也可以用@field:FS來(lái)標(biāo)記,也是成功的。而@Module類(lèi)里面的方法繼續(xù)用@Named來(lái)標(biāo)注最后修改就成功了。
方法一:
//BeanModule.kt
@Named("fs")
@Provides
fun showCityFS(): City {
var city = City()
city.setName("fs")
return city
}
//MainActivity.kt
@Inject @field:Named("fs")
lateinit var city: City
方法二:
//BeanModule.kt
@FS
@Provides
fun showCityFS(): City {
var city = City()
city.setName("fs")
return city
}
//MainActivity.kt
@Inject @field:FS
lateinit var city: City