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