MyApp({super.key})——因為一個語法糖,我研究了一晚上。

魂祈梦發表於2024-06-22

背景

心血來潮又回去看flutter,因為當初就是半桶水,連dart都沒好好學。於是建立一個新專案之後,立馬就把我難住了,程式碼該寫哪兒?

過程

於是我把初始化的demo看了一下,大致回憶了一下結構,大差不差。但是看到下面這一句,我立馬懵逼了。

const MyApp({super.key});

有兩個疑點。

  1. 為什麼MyApp這個建構函式不需要定義就能直接呼叫?
  2. 為什麼只寫了super.key而沒有對應值?

我按我的理解先分析,{}看起來像一個解構的寫法(js的理解),在dart中這是命名引數的寫法,我認為這樣設計有可能是向js靠攏(降低學習成本),因為js中如果要實現類似命名引數的效果,就會傳入一個{}物件字面量。在js中,當變數名和約定的引數名相同時,可以簡寫為引數名(而不需要寫成冒號形式)。事實上確實是類似的設計,首先就把key:key的冒號簡化掉了。

我到最後都沒有靠自己想通這是什麼寫法。

結果

從Dart 2.17版本開始,引入了“超級初始化器”(super initializer)功能。
簡單來說就是引入了一個語法糖

const MyApp({super.key});
// 上面這個寫法是下面寫法的語法糖
const MyApp({Key? key}) : super(key: key);

這有一種為了簡化寫法放棄可讀性的感覺,首先一個定義看起來簡直和呼叫一樣,而且根據我的直觀感受,更像是將父類的key屬性傳給子類的構造(而實際上正好相反,優先使用子類的key引數並傳給父類構造)。

設計的原因

https://medium.com/dartlang/dart-2-17-b216bfc80c5d
如圖,flutter中有大量的類的建構函式需要呼叫父類的構造方法,並將自身的引數原模原樣地傳給父類構造,當存在大量引數時,就會產生大量的冗餘。因此,雖然不太喜歡這種寫法(主要是沒見識過),要使用flutter來編寫應用程式,還是有必要使用這種語法糖來簡化程式碼編寫的。
image

相關文章