Flutter 中那么多組件,難道要都學一遍?


在 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 組件。生成的組件樹如下:

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

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

生成的組件樹如下:

給應用程序添加 AppBar:

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

生成的組件樹如下:

StatefulWidget vs StatelessWidget

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博客地址(330個控件用法):http://laomengit.com

歡迎加入Flutter交流群(微信:laomengit)、關注公眾號【老孟Flutter】:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM