Flutter炒的很火,各種吹噓多好多好。
抱着試試看的心態學了學,立馬就被Flutter奇葩的語法和理念擊垮了......
這是什麼鬼語言?
我要列舉一下Flutter最讓我費解的一些語法特點:
1. 無窮的嵌套層級,讓人反感的代碼結構。
@override
Widget build(BuildContext context) {
return Container(
child: Scaffold(
appBar: AppBar(
title: Text("Welcome to Flutter!"),
),
body: this._pageList[_currentIndex],
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text("首頁"),
),
BottomNavigationBarItem(
icon: Icon(Icons.category),
title: Text("分類"),
),
],
type: BottomNavigationBarType.fixed,
currentIndex: _currentIndex,
onTap: (index) {
setState(() {
this._currentIndex = index;
});
},
),
),
);
}
之前寫iOS的時候,創建UI的過程是順序的,一個一個的UI對象順序的創建,然後再綁定各個UI之間的關係和屬性。而Flutter很有新意的把組件之間的父子關係映射到代碼級別,讓父組件包含子組件的代碼。其實這個思路挺好的,但是複雜的UI組件的層級是非常深的。最大的痛點在於我很難找到一個組件的開頭和結尾。不是找不到,是很不清晰。我要註釋代碼的時候,鼠標從開始往下拖,尷尬的事就是你不知道鼠標要拖到哪裏......
2. 強迫症一般的“萬物皆Widget”。
@override
Widget build(BuildContext context) {
return Container(
child: Center(child: Text("首頁"),),
);
}
Flutter強調一切都是Widget,小到一個字符串,大到一個頁面,都是Widget。然而這就讓我們寫代碼變得非常的繁瑣。我只是想在一個按鈕上寫幾個字符,我卻不能只寫:“Press me”,而是得寫:Text("Press me")。非得包一個組件的構造函數,太太太繁瑣了!而且Flutter不像HTML,把樣式都交給CSS操作,而是樣式和定義都混在一起,導致代碼非常龐大。比如我想給一個Text賦予fontSize和Color,那麼就不能單獨寫一個CSS文件,而是得在你定義的地方這麼寫:Text("Press me", style:TextStyle(fontSize:20))。我只寫個fontsize不行麼?爲什麼外面還要包一個TextStyle的構造函數???太繁瑣!
3. 有狀態Widget代碼太複雜。
class HomePage extends StatefulWidget {
HomePage({Key key}) : super(key: key);
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Container(
child: Center(child: Text("首頁"),),
);
}
}
我只是想定義一個全屏的div,然後中間有一個文本顯示“首頁”倆字,就要寫上面的一堆代碼。需要兩個類,第一個類還必須實現createState()方法。Flutter把太多東西暴露給開發者,這些東西都是無用的代碼字符,當數量變得龐大起來之後非常影響閱讀的清晰性。你想想,如果一個界面需要定義30個組件,每個組件都要這麼寫,那就是60個類,而且有一半的類都是固定寫法,真的就覺得這個語言實在是太糟糕了。
然而,吐槽也沒卵用,該學的還得學。其實可能是我對這種語法不適應,而不是Flutter語法糟糕。Flutter所呈現出來的功能和先進性是我不能否認的,因此在業務面前,這點技術潔癖就沒必要堅持了。(我還是覺得Swift語言纔是最有美學特質的編程語言,非常的嚴謹、優雅,而Dart卻像個四不像,不如JS靈活,不如Java流行,不如C高效,且沒有突破性的語法規則)