當(dāng)我們同時(shí)為手機(jī)和平板適配編寫(xiě) app 針對(duì)不同屏幕尺寸進(jìn)行 UI 布局或當(dāng)用戶偏好設(shè)置較大字號(hào)或是想要最大限度等減少動(dòng)畫(huà)等;此時(shí)就需要 MediaQuery 來(lái)幫我們獲取所用設(shè)備的信息以及用戶設(shè)置的偏好信息;
項(xiàng)城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,項(xiàng)城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為項(xiàng)城上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的項(xiàng)城做網(wǎng)站的公司定做!
MediaQuery 一直存在于 WidgetsApp 和 MaterialApp 中, MediaQuery 繼承自 InheritedWidget 是一個(gè)單獨(dú)的 Widget ,但一般通過(guò) MediaQuery.of(context) 來(lái)獲取相關(guān)信息;
當(dāng)相關(guān)信息發(fā)生變化,例如屏幕旋轉(zhuǎn)等時(shí),屏幕中 Widget 會(huì)重新構(gòu)建,以保持最新?tīng)顟B(tài);我們可以通過(guò) MediaQuery 構(gòu)造函數(shù)和提供的靜態(tài)方法手動(dòng)設(shè)置對(duì)應(yīng)的相關(guān)信息;
MediaQueryData 包含關(guān)于媒介的相關(guān)信息;一般通過(guò) MediaQuery.of(context) 獲取;
size 為媒介的尺寸大小,以邏輯像素為單位;
devicePixelRatio 為像素密度;與設(shè)備物理像素有關(guān),與橫豎屏等無(wú)關(guān);
orientation 為橫豎屏, Orientation.landscape 為橫屏, Orientation.portrait 為豎屏;
textScaleFactor 為
每個(gè)邏輯像素的字體像素?cái)?shù),小菜理解為字體的像素比;注意,小菜設(shè)置了默認(rèn)字體像素密度為標(biāo)準(zhǔn)的 1.2 倍之后調(diào)整設(shè)備系統(tǒng)字號(hào),其 1.2 倍依舊是以標(biāo)準(zhǔn)字號(hào)為基礎(chǔ)擴(kuò)大 1.2 倍;
platformBrightness 為當(dāng)前設(shè)備的亮度模式;注意調(diào)整屏幕亮度并不會(huì)改變?cè)撃J?,與當(dāng)前系統(tǒng)支持的黑暗模式和明亮模式相關(guān);
alwaysUse24HourFormat 為當(dāng)前設(shè)備是否為 24 小時(shí)制;
accessibleNavigation 為是否使用 TalkBack 或 VoiceOver 之類(lèi)的輔助功能與應(yīng)用程序進(jìn)行交互,用以輔助視力障礙人群;
invertColors 為是否使用顏色反轉(zhuǎn),主要用于 iOS 設(shè)備;
highContrast 為用戶是否要求前景與背景之間的對(duì)比度高,主要用于 iOS 設(shè)備;
disableAnimations 為平臺(tái)是否要求禁用或減少動(dòng)畫(huà);
boldText 為平臺(tái)是否要求使用粗體;
padding 為屏幕內(nèi)邊距,一般是劉海兒屏或異形屏中被系統(tǒng)遮擋部分邊距;
viewInsets 為鍵盤(pán)彈出時(shí)等遮擋屏幕邊距,其中 viewInsets.bottom 為鍵盤(pán)高度;
systemGestureInsets 為手勢(shì)邊距,如 Android Q 之后添加的向左滑動(dòng)關(guān)閉頁(yè)面等;
viewPadding 小菜理解為視圖內(nèi)邊距,為屏幕被劉海兒屏或異形屏中被系統(tǒng)遮擋部分,從 MediaQuery 邊界的邊緣計(jì)算;此值是保持不變;例如,屏幕底部的軟件鍵盤(pán)可能會(huì)覆蓋并占用需要底部填充的相同區(qū)域,因此不會(huì)影響此值;
physicalDepth 為設(shè)備物理層級(jí),小菜暫時(shí)還未想到對(duì)應(yīng)的應(yīng)用場(chǎng)景;
小菜在嘗試獲取其他子 Widget Size 時(shí),有兩點(diǎn)需要注意,首先要設(shè)置一個(gè)全局的 GlobalKey 來(lái)獲取當(dāng)前位置, key 需要為唯一的;第二通過(guò) GlobalKey().currentContext 獲取 BuildContext 上下文環(huán)境,從而獲取對(duì)應(yīng)尺寸;
MediaQuery 案例嘗試
小菜對(duì)于部分 MediaQueryData 的應(yīng)用和理解還不夠深入;如有錯(cuò)誤請(qǐng)多多指導(dǎo)!
provider 是flutter 中的狀態(tài)管理 開(kāi)源庫(kù);
存儲(chǔ)的數(shù)據(jù)對(duì)象 必須extends ChangeNotifier;下層widget 通過(guò) Provider.of(context) 函數(shù) 獲取model對(duì)象 ,并且可以建立依賴(lài)關(guān)系;當(dāng)數(shù)據(jù)對(duì)象發(fā)生變化時(shí),依賴(lài)的widget 會(huì)重新build,像不像InheritedWidget Provider 沒(méi)錯(cuò) 下層widget就是 封裝了InheritedWidget
主要 通過(guò) Provider.ofT(context) 函數(shù),來(lái)獲??;
推薦使用 Provider.of而不是 Consumer,因?yàn)?listen默認(rèn)為true,也就是說(shuō) 默認(rèn) 依賴(lài)于 持有數(shù)據(jù)model的widget 對(duì)應(yīng)的element;
數(shù)據(jù)類(lèi) 可繼承的 ChangeNotifier,本身和privider框架 沒(méi)有關(guān)系;
ChangeNotifier 是 flutter框架 提供的工具類(lèi), 用來(lái)實(shí)現(xiàn)一對(duì)多的訂閱通知功能。
源碼分析:
分析源碼可得,TextField 是有狀態(tài) StatefulWidget,有豐富的屬性,自定義化較高,實(shí)踐中需要合理利用各種回調(diào);
1、光標(biāo)的相關(guān)屬性;cursorColor 為光標(biāo)顏色,cursorWidth 為光標(biāo)寬度,cursorRadius 為光標(biāo)圓角;其中 Radius 提供了 circle 圓角和 elliptical 非圓角兩種;
2、textAlign 為文字起始位置,可根據(jù)業(yè)務(wù)光標(biāo)居左/居右/居中等;注意只是文字開(kāi)始方向;textDirection 問(wèn)文字內(nèi)容方向,從左向右或從右向左;
3、maxLength 為字符長(zhǎng)度,設(shè)置時(shí)默認(rèn)是展示一行,且右下角有編輯長(zhǎng)度與整體長(zhǎng)度對(duì)比;與 maxLengthEnforced 配合,maxLengthEnforced 為 true 時(shí)達(dá)到最大字符長(zhǎng)度后不可編輯;為 false 時(shí)可繼續(xù)編輯展示有差別;
4、設(shè)置 maxLength 之后右下角默認(rèn)有字符計(jì)數(shù)器,設(shè)置 TextField.noMaxLength 即可只展示輸入字符數(shù);
5、maxLines 為允許展現(xiàn)的最大行數(shù),在使用 maxLength 時(shí)內(nèi)容超過(guò)一行不會(huì)自動(dòng)換行,因?yàn)槟J(rèn) maxLines=1,此時(shí)設(shè)置為 null 或固定展示行數(shù)即可自動(dòng)換行;區(qū)別在于 null 會(huì)展示多行,而 maxLines 最多只展示到設(shè)置行數(shù);
6、obscureText 是否隱藏編輯內(nèi)容,常見(jiàn)的密碼格式;
7、enableInteractiveSelection 長(zhǎng)按是否出現(xiàn)【剪切/復(fù)制/粘貼】菜單;不可為空;
8、keyboardAppearance 為鍵盤(pán)亮度,包括 Brightness.dark/light 兩種,但僅限于 iOS 設(shè)備;
9、textCapitalization 文字大小寫(xiě);理論上 sentences 為每句話第一個(gè)字母大寫(xiě);characters為每個(gè)字母大寫(xiě);words 為每個(gè)單詞首字母大寫(xiě);但該屬性?xún)H限于 text keybord,和尚在本地更換多種方式并未實(shí)現(xiàn),有待研究;
10、keyboardType 為鍵盤(pán)類(lèi)型,和尚理解整體分為數(shù)字鍵盤(pán)和字母鍵盤(pán)等;根據(jù)設(shè)置的鍵盤(pán)類(lèi)型,鍵盤(pán)會(huì)有差別;
a. 數(shù)字鍵盤(pán)
--1-- datetime 鍵盤(pán)上可隨時(shí)訪問(wèn) : 和 /;
--2-- phone 鍵盤(pán)上可隨時(shí)訪問(wèn) # 和 *;
--3-- number 鍵盤(pán)上可隨時(shí)訪問(wèn) + - * /
b. 字母鍵盤(pán)
--1-- emailAddress 鍵盤(pán)上可隨時(shí)訪問(wèn) @ 和 .;
--2-- url 鍵盤(pán)上可隨時(shí)訪問(wèn) / 和 .;
--3-- multiline 適用于多行文本換行;
--4-- text 默認(rèn)字母鍵盤(pán);
11、textInputAction 通常為鍵盤(pán)右下角操作類(lèi)型,類(lèi)型眾多,建議多多嘗試;
12、autofocus 是否自動(dòng)獲取焦點(diǎn),進(jìn)入頁(yè)面優(yōu)先獲取焦點(diǎn),并彈出鍵盤(pán),若頁(yè)面中有多個(gè) TextField 設(shè)置 autofocus 為 true 則優(yōu)先獲取第一個(gè)焦點(diǎn);
13、focusNode 手動(dòng)獲取焦點(diǎn),可配合鍵盤(pán)輸入等減少用戶操作次數(shù),直接獲取下一個(gè) TextField 焦點(diǎn);
14、enabled 設(shè)為 false 之后 TextField 為不可編輯狀態(tài);
15、decoration 為邊框修飾,可以借此來(lái)調(diào)整 TextField 展示效果;可以設(shè)置前置圖標(biāo),后置圖片,邊框?qū)傩?,?nèi)容屬性等,會(huì)在后續(xù)集中嘗試;若要完全刪除裝飾,將 decoration 設(shè)置為空即可;
16、inputFormatters 為格式驗(yàn)證,例如原生 Android 中通常會(huì)限制輸入手機(jī)號(hào)或其他特殊字符,在 Flutter 中也可以借此來(lái)進(jìn)行格式限制,包括正則表達(dá)式;使用時(shí)需要引入 package:flutter/services.dart;
a. LengthLimitingTextInputFormatter 限制最長(zhǎng)字符;
b. WhitelistingTextInputFormatter 僅允許輸入白名單中字符;如 digitsOnly 僅支持?jǐn)?shù)字 [0-9];
c. BlacklistingTextInputFormatter 防止輸入黑名單中字符;如 singleLineFormatter 強(qiáng)制輸入單行;
分析源碼 RegExp("[/]") 可以設(shè)置正則表達(dá)式;
17、onChanged 文本內(nèi)容變更時(shí)回調(diào),可實(shí)時(shí)監(jiān)聽(tīng) TextField 輸入內(nèi)容;
18、controller 文本控制器,監(jiān)聽(tīng)輸入內(nèi)容回調(diào);
19、onTap 點(diǎn)擊 TextField時(shí)回調(diào);
20、onEditingComplete 在提交內(nèi)容時(shí)回調(diào),通常是點(diǎn)擊回車(chē)按鍵時(shí)回調(diào);
21、onSubmit 在提交時(shí)回調(diào),不可與 onEditingComplete 同時(shí)使用,區(qū)別在于 onSubmit 是帶返回值的回調(diào);
問(wèn)題小結(jié):
當(dāng) TextField 設(shè)置 enableInteractiveSelection 屬性后長(zhǎng)按會(huì)出現(xiàn)菜單,默認(rèn)為英文,可通過(guò)設(shè)置 Flutter 國(guó)際化來(lái)處理;
(1)在 pubspec.yaml 中集成 flutter_localizations;
2)在 MaterialApp 中設(shè)置本地化代理和支持的語(yǔ)言類(lèi)型;
(1)將 maxLength 設(shè)置為 null 僅使用 LengthLimitingTextInputFormatter 限制最長(zhǎng)字符;
(2)設(shè)置 InputDecoration 中 decoration 屬性為空;但是底部有空余,只是隱藏而并非消失;
在用Flutter 開(kāi)發(fā)windows和linux跨平臺(tái)應(yīng)用的時(shí)候,如何設(shè)置默認(rèn)窗口大小呢?
flutter沒(méi)有提供統(tǒng)一的api,所以默認(rèn)的窗口大小是1280x720.
如果我們想要改成自己想要的默認(rèn)窗口大小呢?比如我想要設(shè)置為:512像素寬, 926像素高
我該怎么做呢?
請(qǐng)看我的教程。
首先你確保你已經(jīng)為項(xiàng)目創(chuàng)建了windows和Linux的支持。
目前Flutter 為windows和linux提供的是托管式運(yùn)行的主程序,可以理解為一個(gè)殼子,這個(gè)殼子就是用cpp寫(xiě)的,平臺(tái)原生的window 窗口。
所以我們可以打開(kāi)相應(yīng)的cpp源代碼,設(shè)置默認(rèn)窗口大小。
這里先講windows和linux,因?yàn)閙ac 平臺(tái)跟windows和linux不一樣,后面單獨(dú)給大家講解。
我們看圖。
源代碼路徑位于:
windows/runner/main.cpp
找到
第一個(gè)參數(shù)是寬度,單位是px,第二個(gè)是高度,單位是px
修改后重新運(yùn)行生效。
源代碼路徑位于:
linux/my_application.cc
找到
方法的第一個(gè)數(shù)字是寬度,第二個(gè)是高度,單位也是px像素。
修改后,重新運(yùn)行生效。
現(xiàn)在,你已經(jīng)學(xué)會(huì)了如何設(shè)置初始窗口大小了。
未初始化的變量值都是null
var可以接受任意類(lèi)型的變量,但一旦被賦值,類(lèi)型就會(huì)被確定。
dynamic可以接受任意類(lèi)型的變量,被賦值后,類(lèi)型還可以再被賦值再改變。
final與const都可以修飾一個(gè)不可變的變量,但final變量是一個(gè)運(yùn)行時(shí)常量,在第一次使用的時(shí)候被初始化。
const變量是一個(gè)編譯時(shí)常量,在編譯的時(shí)候就被初始化了。所以,const的性能比f(wàn)inal高。
a?.cancel():a不為空才會(huì)執(zhí)行a的cancel()方法
var i = a??"a是空":a是空時(shí),將a賦值為字符串"a是空"
k??="1":如果k之前沒(méi)有賦值,則會(huì)被賦值為“1”,如果之前有值,這句話就無(wú)效。
例如有一個(gè)函數(shù):String say(String from, String msg, [String device])
那么device可以傳也可以不傳值,下面兩種調(diào)用方式都是對(duì)的。
例如有一個(gè)函數(shù):void fun1({int i,int j}),
使用時(shí):fun1(i = 1)、fun1(j = 10)、fun1(i = 10,j = 20)都可以。
可選位置參數(shù)和可選命名參數(shù)都可以設(shè)置默認(rèn)參數(shù)值
例如:
void fun1({int i = 1,int j = 2})
String say(String from = "a", String msg = "b", [String device = "c"])
文章名稱(chēng):flutter理解,flutter介紹
文章出自:http://chinadenli.net/article8/dsshjip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站策劃、App開(kāi)發(fā)、網(wǎng)站內(nèi)鏈、、域名注冊(cè)
聲明:本網(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)