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 {
@override
Widget build(BuildContext context) {
return Container(
child: Center(child: Text("首页"),),
);
}
}
我只是想定义一个全屏的div,然后中间有一个文本显示“首页”俩字,就要写上面的一堆代码。需要两个类,第一个类还必须实现createState()方法。Flutter把太多东西暴露给开发者,这些东西都是无用的代码字符,当数量变得庞大起来之后非常影响阅读的清晰性。你想想,如果一个界面需要定义30个组件,每个组件都要这么写,那就是60个类,而且有一半的类都是固定写法,真的就觉得这个语言实在是太糟糕了。
然而,吐槽也没卵用,该学的还得学。其实可能是我对这种语法不适应,而不是Flutter语法糟糕。Flutter所呈现出来的功能和先进性是我不能否认的,因此在业务面前,这点技术洁癖就没必要坚持了。(我还是觉得Swift语言才是最有美学特质的编程语言,非常的严谨、优雅,而Dart却像个四不像,不如JS灵活,不如Java流行,不如C高效,且没有突破性的语法规则)