kotlin中針對(duì)api27getContext()為Nullable的解決方案

基礎(chǔ)知識(shí)

  1. 在 Kotlin 中细卧,其類(lèi)型系統(tǒng)嚴(yán)格區(qū)分一個(gè)引用是否可以容納null尉桩。也就是說(shuō),一個(gè)變量是否可空必須顯示聲明酒甸,對(duì)于可空變量魄健,在訪(fǎng)問(wèn)其成員時(shí)必須做空處理,否則無(wú)法編譯通過(guò)插勤。

    var a: String = "abc"
    a = null // 編譯錯(cuò)誤
    
    var b: String? = "abc" //String? 表示該 String 類(lèi)型變量可為空
    b = null // 編譯通過(guò)
    
  2. 盡管當(dāng)前kotlin在android項(xiàng)目開(kāi)發(fā)中占比在逐步提高沽瘦,但是大量開(kāi)發(fā)還是Java代碼。供應(yīng)用層調(diào)用的framework代碼也是java實(shí)現(xiàn)的农尖,所以大量情景下是kotlin和java代碼混合開(kāi)發(fā)的析恋。那當(dāng)kotlin調(diào)用Java代碼,Java代碼是如何定義是否能容納null呢盛卡?

    //不為空
      @NonNull
      public final Context requireContext() {
        Context context = getContext();
        if (context == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to a context.");
        }
        return context;
    }
    
    //可為空
    @Nullable
    public Context getContext() {
        return mHost == null ? null : mHost.getContext();
    }
    

    函數(shù)參數(shù)是否容納null判斷也是同理用@Nullable和@NonNull標(biāo)記

問(wèn)題

  1. 最近將compileSdkVersion助隧、targetSdkVersion更新到27,然后收到了些編譯錯(cuò)誤滑沧,例如:context is now nullable(context?) instead of non-null, 特別在fragment中的getActivity(),fragmentManager等都有編譯報(bào)錯(cuò)并村,扒了下代碼查找報(bào)錯(cuò)的問(wèn)題

    //報(bào)錯(cuò) tpye mismatch required:context found:context?
     val viewDialog = AlertDialog.Builder(context)
    
    //context參數(shù)要求為  @NonNull
    public Builder(@NonNull Context context) {
            this(context, resolveDialogTheme(context, 0));
        }  
        
    

//返回的context為 Nullable
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}

```

邊緣報(bào)錯(cuò)的原因應(yīng)該一目了然了。

解決

  1. 直接告訴變壓器context不可能為null滓技,編譯時(shí)候不去null檢查哩牍。嗯,現(xiàn)在編譯是不報(bào)錯(cuò)了令漂,當(dāng)然造成結(jié)果就是一旦為null直接掛了膝昆。而且既然API寫(xiě)的是Nullable丸边,那就是存在為null的情況的

     builder = AlertDialog.Builder(context!!)
    
  2. 這個(gè)是在網(wǎng)上看到的解決方案,大概就是在basefragment中重寫(xiě)getContext()方法荚孵,跟1換湯不換藥妹窖。

     override fun getContext(): Context {
        return super.getContext()!!
    

}
```

  1. 其實(shí)APi27中新加了requireContext()方法,類(lèi)似還有requireActivity()收叶,requireHost()方法

       @NonNull
    public final Context requireContext() {
        Context context = getContext();
        if (context == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to a context.");
        }
        return context;
    }
    

}
```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骄呼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滔驾,更是在濱河造成了極大的恐慌谒麦,老刑警劉巖俄讹,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哆致,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡患膛,警方通過(guò)查閱死者的電腦和手機(jī)摊阀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)踪蹬,“玉大人胞此,你說(shuō)我怎么就攤上這事≡镜罚” “怎么了漱牵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)疚漆。 經(jīng)常有香客問(wèn)我酣胀,道長(zhǎng),這世上最難降的妖魔是什么娶聘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任闻镶,我火速辦了婚禮,結(jié)果婚禮上丸升,老公的妹妹穿的比我還像新娘铆农。我一直安慰自己,他們只是感情好狡耻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布墩剖。 她就那樣靜靜地躺著,像睡著了一般夷狰。 火紅的嫁衣襯著肌膚如雪岭皂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天孵淘,我揣著相機(jī)與錄音蒲障,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揉阎,可吹牛的內(nèi)容都是我干的庄撮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼毙籽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洞斯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坑赡,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烙如,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后毅否,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體亚铁,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年螟加,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了徘溢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捆探,死狀恐怖然爆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黍图,我是刑警寧澤曾雕,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站助被,受9級(jí)特大地震影響剖张,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恰起,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一修械、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧检盼,春花似錦肯污、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至貌亭,卻和暖如春柬唯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圃庭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工锄奢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留失晴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓拘央,卻偏偏與公主長(zhǎng)得像涂屁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灰伟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容