欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

flutterkey,flutter可以寫(xiě)網(wǎng)頁(yè)嗎

Flutter 94: 初識(shí) MediaQuery

當(dāng)我們同時(shí)為手機(jī)和平板適配編寫(xiě) app 針對(duì)不同屏幕尺寸進(jìn)行 UI 布局或當(dāng)用戶偏好設(shè)置較大字號(hào)或是想要最大限度等減少動(dòng)畫(huà)等;此時(shí)就需要 MediaQuery 來(lái)幫我們獲取所用設(shè)備的信息以及用戶設(shè)置的偏好信息;

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供水城企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、做網(wǎng)站、HTML5建站、小程序制作等業(yè)務(wù)。10年已為水城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

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) 獲?。?/p>

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)!

flutter 簽名和獲取應(yīng)用簽名

簽名:

keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

【~/key.jks】生成文件的路徑和文件名

keytool -importkeystore -srckeystore C:/test/key.jks -destkeystore C:/test/key.jks -deststoretype pkcs12

遷移到行業(yè)標(biāo)準(zhǔn)格式 PKCS12

在project/android下創(chuàng)建key.properties文件

文件內(nèi)容

在Projects\android\app\build.gradle里的 android{ 上邊添加

def keystorePropertiesFile = rootProject.file("key.properties")

def keystoreProperties =new Properties()

keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android{

buildTypes{

release{

? ? signingConfig signingConfigs.release

}

}

修改成

signingConfigs{

release{

? ? keyAlias keystoreProperties['keyAlias']

? ? keyPassword keystoreProperties['keyPassword']

? ? storeFile file(keystoreProperties['storeFile'])

? ? storePassword keystoreProperties['storePassword']

}

}

buildTypes{

release{

? ? signingConfig signingConfigs.release

}

}

之后在執(zhí)行 flutter build apk打包就簽名了。

在有簽名文件的情況下獲取應(yīng)用簽名:

keytool -list -v -keystore 簽名文件路徑

MD5就是文件簽名:復(fù)制出來(lái)去掉:就可以使用了。

Widget總結(jié)

Flutter中Widget,State和BuildContext的概念是每個(gè)Flutter開(kāi)發(fā)人員需要完全理解的最重要概念之一。這里先講解一下Widget以及Widget。三者之間的關(guān)系會(huì)在最后一篇總結(jié)一下。

Widget類(lèi)在Flutter中是非常重要的,繼承自Widget類(lèi)的有PreferredSizeWidget、ProxyWidget、RenderObjectWidget、StatefulWidget、StatelessWidget。我們?nèi)粘J褂玫慕^大部分widget都是繼承自Widget類(lèi),查看Widget類(lèi)源碼,內(nèi)部實(shí)現(xiàn)非常簡(jiǎn)單,構(gòu)造函數(shù)如下:

在flutter中構(gòu)建APP是由widget樹(shù)構(gòu)建起來(lái)的,所以這個(gè)key的作用是用來(lái)控制在widget樹(shù)中替換widget的時(shí)候使用的。其中Key類(lèi)是Widget、Element以及SemanticsNode的唯一標(biāo)識(shí)符,繼承自Key的還有LocalKey以及GlobalKey。詳細(xì)可以去framework.dart文件查看相關(guān)源碼及說(shuō)明。

在Flutter中,我們平時(shí)自定義的widget,一般都是繼承自StatefulWidget或StatelessWidget(并不是只有這兩種),這兩種widget也是目前最常用的兩種。如果一個(gè)控件自身狀態(tài)不會(huì)去改變,創(chuàng)建了就直接顯示,不會(huì)有色值、大小或者其他屬性的變化,這種widget一般都是繼承自StatelessWidget,常見(jiàn)的有Container、ScrollView等。如果一個(gè)控件需要?jiǎng)討B(tài)的去改變或者相應(yīng)一些狀態(tài),例如點(diǎn)擊態(tài)、色值、內(nèi)容區(qū)域等,那么一般都是繼承自StatefulWidget,常見(jiàn)的有CheckBox、AppBar、TabBar等。兩者的差別在于是否有狀態(tài)。

對(duì)于StatelessWidget,build方法會(huì)在如下三種情況下調(diào)用:

我們?cè)趧?chuàng)建State的時(shí)候可以看到和StatefulWidget相似的build方法,也就是說(shuō)我們也可以獲得一個(gè)BuildContext,在使用StatefulWidget.createState創(chuàng)建它們之前以及在調(diào)用initState之前,框架將State對(duì)象與BuildContext關(guān)聯(lián)起來(lái),該關(guān)聯(lián)是永久的:State對(duì)象永遠(yuǎn)不會(huì)改變它的BuildContext(但是BuildContext本身可以在控件樹(shù)中移動(dòng))。后面講解一下這個(gè)BuildContext對(duì)象在整個(gè)程序中什么角色

State的作用有兩點(diǎn):

State的生命周期有四種狀態(tài):

完整生命周期如下:

當(dāng)控件的配置被更改時(shí)會(huì)調(diào)用State.didUpdateWidget方法,此時(shí)框架會(huì)重新繪制控件。你也可以使用State.setState方法在狀態(tài)發(fā)生變化時(shí)通知框架,告訴框架該對(duì)象的內(nèi)部狀態(tài)已經(jīng)改變,框架接到通知后也會(huì)重新繪制控件。

State中比較重要的一個(gè)方法是setState,當(dāng)修改狀態(tài)時(shí),widget會(huì)被更新。比方說(shuō)點(diǎn)擊CheckBox,會(huì)出現(xiàn)選中和非選中狀態(tài)之間的切換,就是通過(guò)修改狀態(tài)來(lái)達(dá)到的。查看setState源碼,在一些異常的情況下將會(huì)拋出異常:

markNeedsBuild內(nèi)部,則是通過(guò)標(biāo)記element為diry,在下一幀的時(shí)候重建(rebuild)??梢钥闯鰏etState并不是立即生效,它只是將widget進(jìn)行了標(biāo)記,真正的rebuild操作,則是等到下一幀的時(shí)候才會(huì)去進(jìn)行。

StatefulWidget的兩個(gè)主要類(lèi)別:

在我的小部件的生命周期中,我是否需要考慮一個(gè)將要更改的變量,何時(shí)更改,將強(qiáng)制重建小部件?

如果問(wèn)題的答案是肯定的,那么您需要一個(gè)有狀態(tài)的小部件,否則,您需要一個(gè)無(wú)狀態(tài)小部件。

比如:

Flutter 中widget key的作用

3.在 StatelessWidget 中,因?yàn)椴豢勺?,element 的值沒(méi)有報(bào)存在element中,所以u(píng)pdate也不會(huì)改變?cè)薪缑妗?/p>

在 StatefulWidget 中,值保存在_State,如果沒(méi)有標(biāo)記key。則當(dāng)更新界面時(shí),會(huì)重新調(diào)用 Widget build(BuildContext context) 方法。此時(shí),widget 賦值會(huì)從頭開(kāi)始從element中拿取數(shù)據(jù),放入widget。當(dāng)刪除為【widget[0]】時(shí),就會(huì)出現(xiàn)element中數(shù)據(jù)和widget不一致。 此時(shí)就需要key,來(lái)進(jìn)行特殊標(biāo)識(shí),達(dá)到 element 和 widget 一一對(duì)應(yīng)的作用。

Flutter真香,我用它寫(xiě)了個(gè)桌面版JSON解析工具

Flutter支持穩(wěn)定的桌面設(shè)備開(kāi)發(fā)已經(jīng)一段時(shí)間了,不得不說(shuō),F(xiàn)lutter多平臺(tái)支持的特性真的很香。我本人并沒(méi)有任何桌面開(kāi)發(fā)的經(jīng)驗(yàn),但仍然使用Flutter開(kāi)發(fā)出了一個(gè)桌面版小程序,功能很簡(jiǎn)單,就是對(duì)輸入的json做格式化處理和轉(zhuǎn)模型。

話不多說(shuō),先來(lái)看看實(shí)際效果。 項(xiàng)目源碼地址

開(kāi)發(fā)環(huán)境如下:

Flutter : 2.8.1

Dart : 2.15.1

IDE : VSCode

JSON作為我們?nèi)粘i_(kāi)發(fā)工作中經(jīng)常要打交道的一種數(shù)據(jù)格式,它共有6種數(shù)據(jù)類(lèi)型: null , num , string , object , array , bool 。我們勢(shì)必對(duì)它又愛(ài)又恨。愛(ài)他因?yàn)樗鳛閿?shù)據(jù)處理的一種格式確實(shí)非常方便簡(jiǎn)潔。但是在我們做Flutter開(kāi)發(fā)中,又需要接觸到j(luò)son解析時(shí),就會(huì)感覺(jué)非常棘手,因?yàn)閒lutter沒(méi)有反射,導(dǎo)致json轉(zhuǎn)模型這塊需要手寫(xiě)那繁雜的映射關(guān)系。就像下面這樣子。

數(shù)據(jù)量少還能接受,一旦量大,那么光手寫(xiě)這個(gè)解析方法都能讓你懷疑人生。更何況手寫(xiě)還有出錯(cuò)的可能。好在官方有個(gè)工具**json_serializable**可以自動(dòng)生成這塊轉(zhuǎn)換代碼,也解決了flutter界json轉(zhuǎn)模型的空缺。當(dāng)然,業(yè)界也有專門(mén)解析json的網(wǎng)站,可以自動(dòng)生成dart代碼,使用者在生成后復(fù)制進(jìn)項(xiàng)目中即可,也是非常方便的。

本項(xiàng)目以json解析為切入點(diǎn),和大家一起來(lái)看下flutter是如何開(kāi)發(fā)桌面應(yīng)用的。

要讓我們的flutter項(xiàng)目支持桌面設(shè)備。我們首先需要修改下flutter的設(shè)置。如下,讓我們的項(xiàng)目支持 windows 和 macos 系統(tǒng)。

接下來(lái)使用 flutter create 命令創(chuàng)建我們的模版工程。

創(chuàng)建完項(xiàng)目后,我們就可以 run 起來(lái)了。

先來(lái)看下整體界面,界面四塊,分別為功能模塊、文件選擇模塊、輸入模塊、輸出模塊。

我們?cè)谛陆ㄒ粋€(gè)桌面應(yīng)用時(shí),默認(rèn)的模版又一個(gè)Appbar,此時(shí)應(yīng)用可以用鼠標(biāo)拖拽移動(dòng),放大縮小,還可以縮到很小。但是,我們一旦去掉這個(gè)導(dǎo)航欄,那么窗口就不能用鼠標(biāo)拖動(dòng)了,并且我們往往不希望用戶將我們的窗口縮放的很小,這會(huì)導(dǎo)致頁(yè)面異常,一些重要信息都展示不全。因此這里需要借助第三方組件 bitsdojo_window 。通過(guò) bitsdojo_window ,我們可以實(shí)現(xiàn)窗口的定制化,拖動(dòng),最小尺寸,最大尺寸,窗口邊框,窗口頂部放大、縮小、關(guān)閉的按鈕等。

通過(guò) InkWell 組件,可以捕捉到手勢(shì)、鼠標(biāo)、觸控筆的移動(dòng)和停留位置

這個(gè)功能是鼠標(biāo)移動(dòng)后的UI交互界面。要在窗口上顯示一個(gè)提示框,可以使用 Overlay 。需要注意的是,由于在 Overlay 上的 text 的根結(jié)點(diǎn)不是 Material 風(fēng)格的組件,因此會(huì)出現(xiàn)黃色的下劃線。因此一定要用 Material 包一下 text 。并且你必須給創(chuàng)建的 OverlayEntry 一個(gè)位置,否則它將全屏顯示。

讀取說(shuō)表拖拽的文件一開(kāi)始想嘗試使用 InkWell 組件,但是這個(gè)組件無(wú)法識(shí)別拖拽中的鼠標(biāo),并且也無(wú)法從中拿到文件信息。因此放棄。后來(lái)從文章《Flutter-2天寫(xiě)個(gè)桌面端APP》中發(fā)現(xiàn)一個(gè)可讀取拖拽文件的組件 desktop_drop ,能滿足要求。

使用開(kāi)源組件 file_picker ,選完圖片后的操作和拖拽選擇圖片后的操作一致。

Textfield 如果要顯示富文本,那么需要自定義 TextEditingController 。并重寫(xiě) buildTextSpan 方法。

在做導(dǎo)出功能時(shí)遇到下列報(bào)錯(cuò),保存提示為沒(méi)有權(quán)限訪問(wèn)對(duì)應(yīng)目錄下的文件。

通過(guò)Apple的開(kāi)發(fā)文檔找到有關(guān)權(quán)限問(wèn)題的說(shuō)明。其中有個(gè)授權(quán)私鑰的key為 com.apple.security.files.downloads.read-write ,表示 對(duì)用戶的下載文件夾的讀/寫(xiě)訪問(wèn)權(quán)限 。那么,使用Xcode打開(kāi)Flutter項(xiàng)目中的mac應(yīng)用,修改工程目錄下的 DebugProfile.entitlements 文件,向 entitlements 文件中添加 com.apple.security.files.downloads.read-write ,并將值設(shè)置為YES,保存后重啟Flutter項(xiàng)目。發(fā)現(xiàn)已經(jīng)可以向下載目錄中讀寫(xiě)文件了。

當(dāng)然,這是正常操作。還有個(gè)騷操作就是關(guān)閉系統(tǒng)的沙盒機(jī)制。將 entitlements 文件的 App Sandbox 設(shè)置為NO。這樣我們就可以訪問(wèn)任意路徑了。當(dāng)然關(guān)閉應(yīng)用的沙盒也就相當(dāng)于關(guān)閉了應(yīng)用的防護(hù)機(jī)制,因此這個(gè)選項(xiàng)慎用。

原文地址:

flutter-動(dòng)畫(huà)

1.動(dòng)畫(huà)原理:在一段時(shí)間內(nèi)快速的多次改變UI外觀,由于人眼會(huì)產(chǎn)生視覺(jué)暫留所以最終看到的就是一個(gè)連續(xù)的動(dòng)畫(huà)。

UI的一次改變稱為一個(gè)動(dòng)畫(huà)幀,對(duì)應(yīng)一次屏幕刷新。

FPS:幀率,每秒的動(dòng)畫(huà)幀數(shù)。

flutter動(dòng)畫(huà)分為兩類(lèi):

常見(jiàn)動(dòng)畫(huà)模式:

是一個(gè)抽象類(lèi),主要的功能是保存動(dòng)畫(huà)的值和狀態(tài)。常用的一個(gè)Animation類(lèi)是Animation double ,是一個(gè)在一段時(shí)間內(nèi)依次生成一個(gè)區(qū)間之間的值的類(lèi),可以是線性或者曲線或者其他。

可以生成除double之外的其他類(lèi)型值,如:Animation Color 或 Animation Size 。

是一個(gè)動(dòng)畫(huà)控制器,控制動(dòng)畫(huà)的播放狀態(tài),在屏幕刷新的每一幀,就會(huì)生成一個(gè)新的值。

包含動(dòng)畫(huà)的啟動(dòng)forward()、停止stop() 、反向播放 reverse()等方法,在給定的時(shí)間段內(nèi)線性的生成從0.0到1.0(默認(rèn)區(qū)間)的數(shù)字。

curve:描述動(dòng)畫(huà)的曲線過(guò)程。

curvedAnimation:指定動(dòng)畫(huà)的曲線。

常用Curve:

繼承自Animatable T ,表示的就是一個(gè) Animation 對(duì)象的取值范圍,只需要設(shè)置開(kāi)始和結(jié)束的邊界值(值也支持泛型)。 它唯一的工作就是定義輸入范圍到輸出范圍的映射。

例如,Tween可能會(huì)生成從紅到藍(lán)之間的色值,或者從0到255。

Tween.animate:返回一個(gè)Animation。

映射過(guò)程:

1). Tween.animation通過(guò)傳入 aniamtionController 獲得一個(gè)_AnimatedEvaluation 類(lèi)型的 animation 對(duì)象(基類(lèi)為 Animation), 并且將 aniamtionController 和 Tween 對(duì)象傳入了 _AnimatedEvaluation 對(duì)象。

2). animation.value方法即是調(diào)用 _evaluatable.evaluate(parent)方法, 而 _evaluatable 和 parent 分別為 Tween 對(duì)象和 AnimationController 對(duì)象。

3). 這里的 animation 其實(shí)就是前面的 AnimationController 對(duì)象, transform 方法里面的 animation.value則就是 AnimationController 線性生成的 0.0~1.0 直接的值。 在 lerp 方法里面我們可以看到這個(gè) 0.0~1.0 的值被映射到了 begin 和 end 范圍內(nèi)了。

接收一個(gè)TickerProvider類(lèi)型的對(duì)象,它的主要職責(zé)是創(chuàng)建Ticker。

防止屏幕外動(dòng)畫(huà)消耗資源。

[圖片上傳失敗...(image-115b94-1636441483468)]

過(guò)程:

回調(diào):

不使用addListener()和setState()來(lái)給widget添加動(dòng)畫(huà)。

使用AnimatedWidget,將widget分離出來(lái),創(chuàng)建一個(gè)可重用動(dòng)畫(huà)的widget,AnimatedWidget中會(huì)自動(dòng)調(diào)用addListener()和setState()

AnimatedModalBarrier、DecoratedBoxTransition、FadeTransition、PositionedTransition、RelativePositionedTransition、RotationTransition、ScaleTransition、SizeTransition、SlideTransition

如何渲染過(guò)渡,把渲染過(guò)程也抽象出來(lái):

AnimatedBuilder的示例包括: BottomSheet、 PopupMenu、ProgressIndicator、RefreshIndicator、Scaffold、SnackBar、TabBar。

MaterialPageRoute:平臺(tái)風(fēng)格一致的路由切換動(dòng)畫(huà)

CupertinoPageRoute:左右切換風(fēng)格

自定義:PageRouteBuilder

1.要?jiǎng)?chuàng)建交織動(dòng)畫(huà),需要使用多個(gè)動(dòng)畫(huà)對(duì)象(Animation)。

2.一個(gè)AnimationController控制所有的動(dòng)畫(huà)對(duì)象。

3.給每一個(gè)動(dòng)畫(huà)對(duì)象指定時(shí)間間隔(Interval)

可以同時(shí)對(duì)其新、舊子元素添加顯示、隱藏動(dòng)畫(huà).

當(dāng)AnimatedSwitcher的child發(fā)生變化時(shí)(類(lèi)型或Key不同),舊child會(huì)執(zhí)行隱藏動(dòng)畫(huà),新child會(huì)執(zhí)行執(zhí)行顯示動(dòng)畫(huà)。

希望大家支持一下,感謝

當(dāng)前文章:flutterkey,flutter可以寫(xiě)網(wǎng)頁(yè)嗎
本文路徑:http://chinadenli.net/article36/dsdgipg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、云服務(wù)器、電子商務(wù)、網(wǎng)站建設(shè)、網(wǎng)站收錄、響應(yīng)式網(wǎ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)

h5響應(yīng)式網(wǎng)站建設(shè)