Flutter實戰篇:計數器實例Demo分析

2021-01-13 全棧技術博客周刊
Flutter技術總結

1.Flutter Widget框架

Flutter Widget採用現代響應式框架構建,這是從React中獲得的靈感,中心思想是用widget構建你的UI。Widget描述了他們的視圖在給定其當前配置和狀態時應該看起來像什麼。當widget的狀態發生變化時,widget會重新構建UI,Flutter會對比前後變化的不同, 以確定底層渲染樹從一個狀態轉換到下一個狀態所需的最小更改(譯者語:類似於React/Vue中虛擬DOM的diff算法)。

Flutter是一款行動應用程式SDK,一份代碼可以同時生成iOS和Android兩個高性能、高保真的應用程式。Flutter目標是使開發人員能夠交付在不同平臺上都感覺自然流暢的高性能應用程式。我們兼容滾動行為、排版、圖標等方面的差異。為什麼要用Flutter?

Flutter有什麼優勢?它可以幫助你:

提高開發效率

同一份代碼開發iOS和Android用更少的代碼做更多的事情輕鬆迭代在應用程式運行時更改代碼並重新加載(通過熱重載)修復崩潰並繼續從應用程式停止的地方進行調試創建美觀,高度定製的用戶體驗受益於使用Flutter框架提供的豐富的Material Design和Cupertino(iOS風格)的widget實現定製、美觀、品牌驅動的設計,而不受原生控制項的限制

Flutter分層架構

Flutter包括一個現代的響應式框架、一個2D渲染引擎、現成的widget和開發工具。這些組件可以幫助您快速地設計、構建、測試和調試應用程式。

Flutter分層架構

Flutter組件一切皆是Widget

widget組件

Widget是Flutter應用程式用戶界面的基本構建塊。每個Widget都是用戶界面一部分的不可變聲明。 與其他將視圖、控制器、布局和其他屬性分離的框架不同,Flutter具有一致的統一對象模型:widget。

2.計數器應用示例

創建Flutter工程的方法創建一個新的Flutter工程,命名為"yzjflutter"。創建好後,就會得到一個計數器應用的Demo。

詳細源碼

import'package:flutter/material.dart'; // 1.引入material庫// 2.Flutter的入口函數main,裡面調用runApp(MyApp())voidmain()=> runApp(MyApp());// 3. MyApp 繼承StatelessWidget無狀態的widgetclassMyAppextendsStatelessWidget{// This widget is the root of your application. 應用進程的入口@overrideWidget build(BuildContext context){return MaterialApp(title: 'Flutter Demo', // 設置title theme: ThemeData( // 設置theme// This is the theme of your application.//// Try running your application with "flutter run". You'll see the// application has a blue toolbar. Then, without quitting the app, try// changing the primarySwatch below to Colors.green and then invoke// "hot reload" (press "r" in the console where you ran "flutter run",// or simply save your changes to "hot reload" in a Flutter IDE).// Notice that the counter didn't reset back to zero; the application// is not restarted. primarySwatch: Colors.blue, // 狀態欄顏色 ),// 設置入口home為MyHomePage home: MyHomePage(title: 'Flutter Demo Home Page'), ); }}// MyHomePage繼承 StatefulWidget有狀態的WidgetclassMyHomePageextendsStatefulWidget{ MyHomePage({Key key, this.title}) : super(key: key);// This widget is the home page of your application. It is stateful, meaning// that it has a State object (defined below) that contains fields that affect// how it looks.// This class is the configuration for the state. It holds the values (in this// case the title) provided by the parent (in this case the App widget) and// used by the build method of the State. Fields in a Widget subclass are// always marked "final".final String title;// 重寫createState方法返回_MyHomePageState狀態@override_MyHomePageState createState()=> _MyHomePageState(); }class_MyHomePageStateextendsState<MyHomePage> {int _counter = 0; // 點擊次數_counter私有// 看注釋講的很明白:狀態改變了,需要更新狀態及UIvoid_incrementCounter(){ setState(() {// This call to setState tells the Flutter framework that something has// changed in this State, which causes it to rerun the build method below// so that the display can reflect the updated values. If we changed// _counter without calling setState(), then the build method would not be// called again, and so nothing would appear to happen. _counter++; }); }// 實現build構建過程:@overrideWidget build(BuildContext context){// This method is rerun every time setState is called, for instance as done// by the _incrementCounter method above.//// The Flutter framework has been optimized to make rerunning build methods// fast, so that you can just rebuild anything that needs updating rather// than having to individually change instances of widgets.return Scaffold( // Scaffold 是Material庫中提供的頁面腳手架 appBar: AppBar(// Here we take the value from the MyHomePage object that was created by// the App.build method, and use it to set our appbar title. title: Text(widget.title), ), body: Center(// Center is a layout widget. It takes a single child and positions it// in the middle of the parent. child: Column(// Column is also layout widget. It takes a list of children and// arranges them vertically. By default, it sizes itself to fit its// children horizontally, and tries to be as tall as its parent.//// Invoke "debug painting" (press "p" in the console, choose the// "Toggle Debug Paint" action from the Flutter Inspector in Android// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)// to see the wireframe for each widget.//// Column has various properties to control how it sizes itself and// how it positions its children. Here we use mainAxisAlignment to// center the children vertically; the main axis here is the vertical// axis because Columns are vertical (the cross axis would be// horizontal). mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Hello,World', style: new TextStyle(fontSize: 14)), Text('You have pushed the button this many times:', ), Text('$_counter', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, // 點擊事件onPressed tooltip: 'Increment', child: Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); }}

MyApp類代表Flutter應用,它繼承了StatelessWidget類,這也就意味著應用本身也是一個widget。在Flutter中,大多數東西都是widget,包括對齊(alignment)、填充(padding)和布局(layout)。Flutter在構建頁面時,會調用組件的build方法,widget的主要工作是提供一個build()方法來描述如何構建UI界面(通常是通過組合、拼裝其它基礎widget)。MaterialApp是Material庫中提供的Flutter APP框架,通過它可以設置應用的名稱、主題、語言、首頁及路由列表等。MaterialApp也是一個widget。Scaffold是Material庫中提供的頁面腳手架,它包含導航欄和Body以及FloatingActionButton(如果需要的話)。 本書後面示例中,路由默認都是通過Scaffold創建。home為Flutter應用的首頁,它也是一個widget。_MyHomePageState的build過程:Flutter框架會調用Widget的build方法來構建widget樹,最終將widget樹渲染到設備屏幕上。

Scaffold是Material庫中提供的一個widget, 它提供了默認的導航欄、標題和包含主屏幕widget樹的body屬性。widget樹可以很複雜。body的widget樹中包含了一個Center widget,Center可以將其子widget樹對齊到屏幕中心,Center子widget是一個Column widget,Column的作用是將其所有子widget沿屏幕垂直方向依次排列, 此例中Column包含兩個Text子widget,第一個Text widget顯示固定文本 「You have pushed the button this many times:」,第二個Text widget顯示_counter狀態的數值。floatingActionButton是頁面右下角的帶「」的懸浮按鈕,它的onPressed屬性接受一個回調函數,代表它被點擊後的處理器,本例中直接將_incrementCounter作為其處理函數。現在,我們將整個流程串起來:當右下角的floatingActionButton按鈕被點擊之後,會調用_incrementCounter,在_incrementCounter中,首先會自增_counter計數器(狀態),然後setState會通知Flutter框架狀態發生變化,接著,Flutter會調用build方法以新的狀態重新構建UI,最終顯示在設備屏幕上。

為什麼要將build方法放在State中,而不是放在StatefulWidget中?

這主要是為了開發的靈活性。如果將build()方法在StatefulWidget中則會有兩個問題:

狀態訪問不便繼承StatefulWidget不便

相關焦點

  • 解決flutter運行報錯:flutter_tools depends的處理方法
    我是您的朋友義縣遊學電子科技.今天帶來的flutter的錯誤解決方法是關於web平臺運行時提示:"Because flutter_tools depends on shelf_packages_handler any which doesn't exist(could not find package
  • 「老孟Flutter」Stateful 組件的生命周期
    老孟導讀:關於生命周期的文章共有2篇,第一篇是介紹 Flutter 中Stateful 組件的生命周期。此篇文章介紹 StatefulWidget 組件的生命周期, StatefulWidget 組件的生命周期時非常重要的知識點,就像 Android 中 Activity 的生命周期一樣,不僅在以後的工作中經常用到,面試也會經常被問到。
  • Flutter到底香不香?
    今晚停電,導致沒法寫代碼,聊一聊flutter,早就想聊了,一直沒時間。每個新的框架的出現都會引來大家的討論,flutter也不例外。大公司對於新技術會比較慎重的,穩定才是王道。去年在我開發一款代購產品時,我決定嘗試使用flutter,使用一周以後我徹底愛上了它。flutter中萬物皆為widget的思想與Java中的萬物皆對象如出一轍。很多人不習慣flutter手寫布局的方式,但是這麼長時間用下來之後,我覺得效率並不低。
  • 三菱FX PLC入門之定時器和計數器
    定時器在梯形圖中非常常用,所以在課程中,李老師舉了好幾個典型的實例,為了節省大家的閱讀時間(並不是為了偷懶哦),我就抽其中一個例子吧。每一個定時器的定時時間是有限制的,那麼,如果我們需要的定時時間超過定時器的最長定時時間,怎麼辦呢?簡單,一個不夠,兩個來湊。
  • flutter控制項:pageview的使用案例分析和重點說明
    今天我來跟您介紹一下flutter的控制項使用案例。一是工作之餘興趣愛好,二是作為一個學習總結,把學習的過程記錄下來。那我今天會把一個項目中用到的控制項逐一進行總結,希望大家多多支持。因為從這個事例中我們可以完全連接flutter的開發思想和編程方法,話不多說我們進入正題。1.配置好你的flutter環境,我這邊以web瀏覽器環境為演示的平臺。開發工具為vs code.如果不出意外,你只要把我這邊的代碼複製到vs code裡就應該可以正常運行的。
  • Flutter和桌面應用的最新進展
    https://github.com/flutter/flutter/issues/38477https://github.com/flutter/flutter/issues/38478https://en.wikipedia.org/wiki/Ahead-of-time_compilation桌面級體驗無論您要構建的是獨立可執行文件還是
  • Flutter 實現刮刮卡效果
    作者:Shaiq khan原文連結:https://medium.com/flutterdevs/scratch-card-in-flutter-8e8c6f335be2我們拿起手機,然後把錢寄給我們的朋友,以獲得一些現金返還。現金返還是一種提高使用戶粘度的有效舉動。
  • 潔淨室用雷射塵埃粒子計數器,在線式粒子計數器工作流程
    在無塵車間中,我們需要用儀器來測量空氣中的塵埃微粒數量以及粒徑分布,這樣可以為空氣潔淨度的評定提供依據,而雷射塵埃粒子計數器就是用來測量空氣中塵埃微粒的數量及粒徑分布的儀器,常見的雷射塵埃粒子計數器是光散射式(DAPC)的,測量粒徑範圍0.1-10μ m,此外還有凝聚核式的雷射塵埃粒子計數器( CNC),可測量尺寸更小的塵埃粒子。
  • 頻率計數器測量功能介紹
    頻率計數器測量功能介紹本文主要介紹頻率計數器基本測量功能。先給出頻率計數器簡介,隨後分別介紹常見測量功能,最後討論頻率計數器應用。關鍵字:頻率測量,頻率計數器一、頻率計數器簡介電子工程師經常需要測量頻率、時間間隔、相位和對事件計數,精確的測量離不開頻率計數器或它的同類產品,如電子計數器和時間間隔分析儀。
  • 如何實現頻率測量 高頻雙計數器測量方法
    信號所包含的頻率成份往往是我們所感興趣的,這種分析方法稱為頻域分析或譜分析。這類分析方法主要應用在聲音、振動等領域,這裡就不加以討論了。 另一方面,數位訊號頻率的獲取相對要簡單些。對於如圖2 中描述的簡單數位訊號, 周期就是兩個上升沿或下降沿間的時間。
  • cd4017計數器電路圖(三款cd4017計數器電路)
    打開APP cd4017計數器電路圖(三款cd4017計數器電路) 發表於 2018-01-31 13:58:06
  • 如何使用BLoC架構開發Flutter應用
    逐步集成BLoC體系結步驟1:將BLoC架構添加到您的項目中您需要將flutter_bloc:^ 2.0.1依賴項添加到pub spec.yaml文件中。狀態類的實例將出現在BlocBuilder中。請記住,第一個狀態是先前在initialState方法中創建的狀態。 為避免內存洩漏,在創建BlocBulider類時不應創建Bloc類的實例。如果這樣做,將無法關閉Bloc類中的流。
  • 74LS161集成計數器電路(2、3、4、6、8、10、60進位計數器)
    74LS161功能介紹 74LS161是4位二進位同步計數器,該計數器能同步並行預置數據,具有清零置數,計數和保持功能,具有進位輸出端,可以串接計數器使用。 二、74LS161集成計數器電路(60進位計數器) 實現60進位加法計數器需要2片161,它們之間的連接方式又分同步和異步兩種。 1)異步連接方式。低位的161通過置數法設計為十進位加法計數器,每十個CP向高位161進一。當高位161計數到0110(即6)時,對兩片161同時清零,電路回到0狀態。電路圖如圖5所示。
  • Google同時啟動Flutter 1.2和Dart 2.2
    dart flutterFlutter 1.2的新功能1.更多的插件Flutter基本上,Dart DevTools是一個基於Web的應用程式開發工具編程套件,主要致力於緩解調試和分析應用程式整個代碼的問題。根據Flutter開發人員對Android Studio和Visual Studio Code的編碼需求,打包了此套編程工具。據說,新的Flutter SDK版本將進一步激勵更多公司選擇Flutter 應用程式。
  • 四位二進位計數器這樣組成8421BCD碼十進位計數器,原理簡單
    十進位計數器與4位二進位計數器有些相似,但4位二進位計數器需要計數到1111然後 才能返回到0000,而十進位計數器要求計數到1001 (相當於9)就返回0000。8421BCD碼 十進位計數器是一種最常用的十進位計數器。
  • 用於潔淨室粒子濃度檢測的塵埃粒子計數器使用方法及注意事項
    用於潔淨室粒子濃度檢測的塵埃粒子計數器主要功能特點兼備可攜式功能優點隨機列印充電同時對用戶任意自設六個粒徑通道採樣分析高解析度背光顯示可更換鋰電池自動定時延時採樣和超限報警過濾器效率分析測試檢查汙染源分析粒徑分布分析用於潔淨室粒子濃度檢測的塵埃粒子計數器主要技術參數型號:CW-HPC600測量粒子粒徑:用戶可根據需要,在0.3~5μm
  • 阿里內部年末知識總結:springboot最牛皮的實戰筆記
    內部總結:spring boot基於以下幾個技術點總結出下面這份spring boot實戰筆記版本新Elasticsearch和Solr、JPA和Mybatis技術點新講解了時下流行的RESTful、Redis、RabbitMQ體例科學用「知識點+實例
  • 塵埃粒子計數器的使用方法及注意事項
    塵埃粒子計數器是測試空氣塵埃粒子顆粒的粒徑及其分布的專用儀器,由顯微鏡發展而來,經歷了顯微鏡、沉降管、離心沉降儀、沉降儀、顆粒計數器、雷射空氣粒子計數器、凝結核粒子計數器、多通道多功能粒子計數器等過程,目前 廣泛應用於為各省市藥檢所、血液中心、防疫站、疾控中心、質量監督所等權威機構
  • 數字電路中簡單的觸發器就可以組成計數器
    數字電路板計數器種類有二進位計數器、十進位計數器和任意進位計數器,這些計數器又有加法計數器(又稱遞增計數器)和減法計數器(也稱為遞減計數器)之分。電路板二進位計數器計數器可分為異步計數器和同步計數器。 1-1二進位計數器原理異步二進位加法計數器圖1-1所示是一個3位二進位異步加法計數器的電路結構,它由3個JK觸發器組成, 其中