手勢操作在 Flutter 中分為兩類:
網站建設哪家好,找創新互聯公司!專注于網頁設計、網站建設、微信開發、微信小程序開發、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了麻山免費建站歡迎大家使用!
第一類是原始的指針事件(Pointer Event),即原生開發中常見的觸摸事件,表示屏幕上觸摸(或鼠標、手寫筆)行為觸發的位移行為;
第二類則是手勢識別(Gesture Detector),表示多個原始指針事件的組合操作,如點擊、雙擊、長按等,是指針事件的語義化封裝。
指針事件表示用戶交互的原始觸摸數據,如手指接觸屏幕 PointerDownEvent、手指在屏幕上移動 PointerMoveEvent、手指抬起 PointerUpEvent,以及觸摸取消 PointerCancelEvent。在手指接觸屏幕,觸摸事件發起時,Flutter 會確定手指與屏幕發生接觸的位置上究竟有哪些組件,并將觸摸事件交給最內層的組件去響應。事件會從這個最內層的組件開始,沿著組件樹向根節點向上冒泡分發。通過 hitTestBehavior 去調整組件在命中測試期內應該如何表現,比如把觸摸事件交給子組件,或者交給其視圖層級之下的組件去響應。關于組件層面的原始指針事件的監聽,Flutter 提供了 Listener Widget,可以監聽其子 Widget 的原始指針事件。
Listener(
child: Container(
color: Colors.black,
width: 300,
height: 300,
),
onPointerDown: (event) = print("down $event"),// 手勢按下回調
onPointerMove:? (event) = print("move $event"),// 手勢移動回調
onPointerUp:? (event) = print("up $event"),// 手勢抬起回調
);
Gesture 是手勢語義的抽象,而如果我們想從組件層監聽手勢,則需要使用 GestureDetector 。GestureDetector 是一個處理各種高級用戶觸摸行為的 Widget,與 Listener 一樣,也是一個功能性組件。
GestureDetector(// 手勢識別
? ? child: Container(color: Colors.red,width: 50,height: 50),// 紅色子視圖
? ? onTap: ()=print("Tap"),// 點擊回調
? ? onDoubleTap: ()=print("Double Tap"),// 雙擊回調
? ? onLongPress: ()=print("Long Press"),// 長按回調
? ? onPanUpdate: (e) {// 拖動回調
? ? ? setState(() {
? ? ? ? // 更新位置
? ? ? ? _left += e.delta.dx;
? ? ? ? _top += e.delta.dy;
? ? ? });
? ? },
? ),
Dart作為高級語言,支持面向對象的很多特性,并且支持基于mixin的繼承方式,基于mixin的繼承方式是指:一個類可以繼承自多個父類,相當于其他語言里的多繼承。所有的類都有同一個基類Object,這和特性類似于Java語言,Java所有的類也都是繼承自Object,也就是說一切皆對象。
Dart 是一門面向對象的語言, 全部的類都是繼承自 Object , 除了支持傳統的 繼承、封裝、多態 , 還有基于組合(Mixin-based)的繼承特性
類型推導(var/final/const)
var
final和const的區別
3.非零即真( )
4.字符串
5.集合
Dart中變量初始值為null,即使是int類型也可以是null(java中int默認是0, boolean默認是false); Dart支持自識別,可以是用var定義變量,也可以直接指定具體類型; final或者const都可修飾不可變的變量,final變量只能賦值一次,const是編譯時常量。
int和double是num子類,沒有float類型; 支持字符串模板,用${expression}的方式來實現字符串效果,類似如字符串拼接; String可以使用單引號或者雙引號; Dart沒有數組,只有列表; 其中List,Set,Map不是抽象接口,是具體實現類,可直接使用; Map的key沒有指定類型,key類型不一致不會報錯;key不能相同,但是value可以相同,value可以為null。 var name = 'Tom';
方法也是對象,方法可賦值給一個變量; 如果方法的參數是解構出來的可以通過 @required 注解標注為必填 const Scrollbar({Key key, @required Widget child}); 支持可選參數,可選命名參數用{}包圍,可選位置參數寫在最后并且使用[]包圍 String say(String from, String msg, [String device]); 支持默認參數 void enableFlags({bool bold = false, bool hidden = false}) {…}; 以_開頭的方法都是私有的。 void main() {
支持閉包,閉包能夠訪問外部方法內部的局部變量
1.空替換?? expr1 ?? expr2,如果expr1是non-null,返回其值。否則執行expr2并返回其結果; 2.條件成員訪問?.P?.y = 4; 如果p是non-null,則設置y的值等于4; 3.類型判定操作符(as,is,is!); 4.級聯操作,可以在同一個對象上連續調用多個函數以及訪問成員變量;
和java不同的是,Dart可以拋出任意類型的對象; 程序不會強制要求開發中處理異常,但若發生異常,程序會中斷; 其中異常主要分為Error和Exception兩種類型。
創建對象可以不使用new關鍵字; Dart中沒有public,private,protected這些關鍵字; 沒有interfaces關鍵字,每一個類都是一個接口。我們可以用抽象類來類比java中的接口; Dart把多重繼承的類叫做Mixins。
支持語法糖 Point(this.x, this.y); 每個實例變量都會自動生成一個getter方法,Non-final變量還會自動生成一個setter; 命名構造函數,使用命名構造函數可以為一個類實現多個構造函數,也能更加清晰的表明你的意圖;
斷言是如果條件表達式不滿足則停止代碼執行; 斷言只在檢查模式下運行有效,如果在生產模式下運行則不會執行。
Dart 以兩種模式運行: Dart 1.x 有生產模式和檢查模式兩種模式, Dart 2.x 中移除了檢查模式。
注:建議在開發/測試模式中使用 檢查模式 運行 Dart VM ,因為它會添加警告和錯誤以幫助開發和調試過程;選中的模式會強制執行各種檢查,例如類型檢查等。
dart標識符可以包括字符和數字,但不能以 數字開頭 。
Dart 是一種面向對象的編程語言。
代碼說明:定義了一個類 TestClass ,這個類擁有一個方法 disp() ,方法可以實現在終端打印字符串 Hello Dart! ,使用 new 關鍵字創建類的對象,該對象調用方法 disp() 。
關于dart的學習還有很多;我列出如下: Flutter高級工程師進階學習資料;需要可以私信我。發送“核心筆記”或“手冊”,即可領取資料!
用于創建二維網格列表。
GridView.count 是在交叉軸上創建固定個數的網格,crossAxisCount為必須的屬性,表示交叉軸網格的個數,而GridView.extent是在交叉軸上創建最大可容納的網格,maxCrossAxisExtent是必須的屬性,表示交叉軸上網格的最大的寬度。
本地Flutter 2.10.1,Mac版Android Studio Bumblebee | 2021.1.1 Patch 2
我是小栗子,初學Flutter ,文章會根據學習進度不定時更新,請多多指教~~
表格布局和線性布局比較相似,只是使用起來更簡潔一些。
本地Flutter 2.10.1,Mac版Android Studio Bumblebee | 2021.1.1 Patch 2
我是小栗子,初學Flutter ,文章會根據學習進度不定時更新,請多多指教~~
Flutter跟安卓的Activity、iOS的ViewController一樣擁有自己的生命周期, Flutter中一切都是Widget,渲染方式有點像H5的DOM樹。
Flutter生命周期可以分為3個階段:
1、實例化組件并添加到樹, 即Navigator.push;
2、狀態變化,即打開新的widget或者依賴的上級widget發生變化;
3、從樹中移除, 即Navigator.pop。
在Flutter中Widget都是不可變的, 但實際上需要根據對應的狀態刷新Widget。 從而產生了StatelessWidget和StatefulWdiget, StatefulWidget是由2個對象Widget和State組成的。
為什么將State和Widget分開呢?
答案是性能, State管理狀態(可以理解為Controller),Widget是UI(即View)。 根據狀態變化每次生成Widget(即View)可以節省內存,即不必每次創建狀態對象State。
構造函數:
同其它高級語言, 只執行一次;
initState:
插入到渲染樹時調用,只執行一次。(類似Android Fragment的onCreateView函數)
didChangeDependencies:
1、在初始化initState后執行; 2、顯示/關閉其它widget。 3、可執行多次;
didUpdateWidget:
上級節點rebuild widget時, 即上級組件狀態發生變化時會觸發子widget執行didUpdateWidget;
deative:
有點像Android的onStop函數, 在打開新的Widget或回到這個widget時會執行; 可執行多次;
dispose:
類似于Android的onDestroy, 在執行Navigator.pop后會調用該辦法, 表示組件已銷毀;
reassemble:
點擊閃電會執行,只用于調試時的hot reload。 release版本不會執行該函數。
常見業務場景:
Widget A打開Widget B: Navigator.push(B)
B構造函數---B initState---B didChangeDependencies---B build---A deactive---A didChangeDependencies.
Widget B退出: Navigator.pop
A deactive---A didChangeDependencies---A build---B deactive---B dispose
可以看出, Flutter打開、關閉Widget時跟安卓、iOS的時序一樣, 都是先處理即將顯示的界面。
activity生命周期和Flutter對應關系:
Flutter提供了WidgetsBindingObserver來監聽AppLifecycleState, 而AppLifecycleState有4種狀態:
1、 resumed 界面可見, 同安卓的onResume。
2、inactive界面退到后臺或彈出對話框情況下, 即失去了焦點但仍可以執行drawframe回調;同安卓的onPause;
3、paused應用掛起,比如退到后臺,失去了焦點且不會收到drawframe回調;同安卓的onStop;
4、suspending, iOS中沒用,安卓里就是掛起,不會再執行drawframe回調;
下面是生命周期:
1、初次打開widget時,不執行AppLifecycleState的回調;
2、按home鍵或Power鍵, AppLifecycleState inactive----AppLifecycleState pause
3、從后臺到前臺:AppLifecycleState inactive---ApplifecycleState resumed
4、back鍵退出應用: AppLifecycleState inactive---AppLifecycleState paused
網站題目:flutter高級,flutter高級課程
本文來源:http://vcdvsql.cn/article22/dsdiicc.html
成都網站建設公司_創新互聯,為您提供、網站營銷、靜態網站、品牌網站建設、網站導航、全網營銷推廣
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯