我正在關注谷歌代碼實驗室。在那里我遇到了以下代碼:
class Calculator: Fragment() {
private var _binding: FragmentCalculatorBinding? = null
private val binding get() = _binding!!
}
需要什么get()?
我們可以通過以下方式做到這一點:
class Calculator: Fragment() {
private var _binding: FragmentCalculatorBinding? = null
private val binding = _binding!!
}
那里給出的解釋是:
在這里,get()表示此屬性是“僅獲取”。這意味著您可以獲得該值,但是一旦分配(就像這里一樣),您就不能將其分配給其他東西。
但我不明白。請幫我解決一下這個。
uj5u.com熱心網友回復:
在這里擁有第二個屬性的全部意義在于允許將第一個屬性設定回 null。(第二個屬性是為了方便起見,應該只在已知片段附加到 Activity 時使用。)使用 getter 意味著它在_binding!!每次訪問時都進行評估。如果沒有get()它,當類被實體化并將結果分配給支持欄位時,它會對其進行一次評估。由于_binding在類實體化時為 null,這將保證失敗。即使它沒有失敗,如果片段被分離并重新附加,它也會有一個過時的參考。
您對“僅獲取”含義的描述被顛倒了。要么代碼實驗室把他們的解釋倒過來,要么你把它倒過來解釋。
uj5u.com熱心網友回復:
在這種情況下,你不會。在我看來這是非常混亂的。
只需使用:
private lateinit var binding: FragmentCalculatorBinding
它與您現有的代碼做同樣的事情 - 如果您在實體化之前使用該變數,則會引發例外。
請記住,您必須在使用它之前對其進行實體化( 的重點lateinit var)。
uj5u.com熱心網友回復:
如果使用這樣的,你必須設定的非常明確的方式binding-你把它用做_binding(這可能只是發生一次,onCreateView()對于所有在那里你實際使用它的地方,你可以使用。binding如果這兩個檢查都_banding具有實際上已設定,并且不能意外更改,因為它是不可變的,從而使您免于潛在的錯誤。
話雖如此 - 我可能也會使用 a lateinit var,并失去所有空檢查,但我認為這是個人品味的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325531.html
標籤:安卓 安卓工作室 科特林 android-fragments
