天天看點

【Flutter實戰】Flutter 中那麼多元件,難道要都學一遍?曆史上的今天正文

【Flutter實戰】Flutter 中那麼多元件,難道要都學一遍?曆史上的今天正文

曆史上的今天

通古斯因隕星墜落發生大爆炸,1908年6月30日上午7時,在中西伯利亞上空,一個雪亮的火球從東南向西北掠空而過。一個幾十萬噸重的大流星落在通古斯河以北。從葉尼塞河至勒拿河之間1500公裡的範圍都曾看見,爆炸聲在直徑為2000公裡範圍可聽到,世界各地的地震儀都有地震波記錄下來。

流星降落的頭幾夜,天光明亮,在高加索不用點燈即可看報。像通古斯這樣的巨型隕星,迄今發現的隻有10個,其中最大的兩個均落在西伯利亞。另一個于1947年2月12日上午11時,落在海參崴附近的老爺嶺山脈,故稱老爺嶺隕星。通古斯卡隕星以每秒60公裡的速度向地球迎面沖擊。由于速度太快,在空中都燒毀了,地面上難以找到它的碎片。

正文

在 Flutter 中一切皆是 元件,僅僅 Widget 的子類和間接子類就有 350 多個,整理的 Flutter元件繼承關系圖(文末有位址) 可以幫助大家更好的了解學習 Flutter,回歸正題,如此多的元件到底如果學習,真的需要學習 350 多個元件?

在經濟學中有一個著名的定律 二八定律

二八定律 是意大利經濟學家帕累托發現的。帕累托認為任何一組東西中最重要的隻占其中一小部分約占20%,其餘80%盡管是多數,卻是次要的。

學習 Flutter 也同樣适用于二八定律,大部分元件是平時很少用到的,是以作為初學者,隻需學習那 20% 常用的元件即可,常用的元件及案例位址:http://laomengit.com/guide/introduction/mobile_system.html

除了常用元件外,還總結了300多個其餘元件的詳細用法,這些元件可以作為手冊,需要的時候再查閱即可,位址:http://laomengit.com/flutter/widgets/widgets_structure.html

元件樹

Flutter 建立App的時候,所有的元件最後會生成一個元件樹,例如如下代碼:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
      ),
      home: Scaffold(
        body: Text('老孟'),
      ),
    );
  }
}
           

複制

main 函數是應用程式開始的地方,運作 MyApp 元件。生成的元件樹如下:

【Flutter實戰】Flutter 中那麼多元件,難道要都學一遍?曆史上的今天正文

讓 Text 元件居中,修改如下:

Scaffold(
  body: Center(
    child: Text('老孟'),
  ),
)
           

複制

生成的元件樹如下:

【Flutter實戰】Flutter 中那麼多元件,難道要都學一遍?曆史上的今天正文

給應用程式添加 AppBar:

Scaffold(
  appBar: AppBar(),
  body: Center(
    child: Text('老孟'),
  ),
)
           

複制

生成的元件樹如下:

【Flutter實戰】Flutter 中那麼多元件,難道要都學一遍?曆史上的今天正文

Stateful vs Stateless

Flutter 元件分為 無狀态元件(StatelessWidget) 和 有狀态元件(StatefulWidget) 兩種。它們唯一的差別就是運作時 重新加載 元件的方式不同,StatelessWidget 元件重新加載時重新建立目前元件的執行個體,而StatefulWidget元件重新加載時不會重新建立執行個體,而是重新執行 build 函數。

StatelessWidget 元件建立的方式:

class StatelessWidgetDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
           

複制

build 函數傳回目前元件,此元件一旦建立将不可改變,build 函數隻能執行一次。如果想重新繪制此元件,隻能重新建立此元件新的執行個體。

StatefulWidget 元件建立的方式:

class StatefulWidgetDemo extends StatefulWidget {
  @override
  _StatefulWidgetDemoState createState() => _StatefulWidgetDemoState();
}

class _StatefulWidgetDemoState extends State<StatefulWidgetDemo> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
           

複制

StatefulWidget 元件的建立方式和 StatelessWidget 不同,State<> 中的 build 函數傳回目前元件,有狀态的元件可以在其生命周期内多次重繪,即多次調用 build 函數,而不是建立一個新的執行個體。

StatefulWidget 元件重繪需要調用 setstate 方法,setState 會使其自身及其子元件重繪,是以盡量封裝 StatefulWidget 元件,避免無效的重建和重繪,影響性能。

快速書寫小技巧:在 Android Studio 和 VS Code 中 輸入 stl 然後點選回車,可以快速建立 StatelessWidget 元件,同理輸入 stf 點選回車,可以快速建立 StatefulWidget 元件,這是編輯器 Live Templates 的功能。

Material vs Cupertino

Flutter 中包含兩套風格的元件,分别是 Material 和 Cupertino ,Cupertino 是 iOS風格的元件,命名都帶 Cupertino 字首,比如 CupertinoSlider 、 CupertinoDatePicker 等, Material Design 是由 Google 推出,旨在為手機、平闆電腦、桌上型電腦和“其他平台”提供更一緻、更廣泛的“外觀和感覺”。

Flutter 使用一套代碼在不同的平台上表現一緻,它不會根據不同的平台繪制不同的外形,比如使用 AlertDialog 彈出警告框,不管在 Android 上,還是在 iOS上效果是一樣。

但有一些功能 Flutter 區分平台,比如 ListView 滑動到底部時繼續滑動,Android 底部會出現淡藍色(預設情況下)拱形,而 iOS 上則沒有,這是因為 Flutter 在封裝此元件時在代碼中區分了平台,是以在檢視 Flutter 源碼到過程中會經常看到根據不同的平台做不同處理的情況。

Flutter元件繼承關系圖位址:http://laomengit.com/flutter/widgets/widgets_structure.html

【Flutter實戰】Flutter 中那麼多元件,難道要都學一遍?曆史上的今天正文