成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

flutterkey,flutter可以寫網(wǎng)頁嗎

Flutter 94: 初識 MediaQuery

當(dāng)我們同時(shí)為手機(jī)和平板適配編寫 app 針對不同屏幕尺寸進(jìn)行 UI 布局或當(dāng)用戶偏好設(shè)置較大字號或是想要最大限度等減少動畫等;此時(shí)就需要 MediaQuery 來幫我們獲取所用設(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 ,但一般通過 MediaQuery.of(context) 來獲取相關(guān)信息;

當(dāng)相關(guān)信息發(fā)生變化,例如屏幕旋轉(zhuǎn)等時(shí),屏幕中 Widget 會重新構(gòu)建,以保持最新狀態(tài);我們可以通過 MediaQuery 構(gòu)造函數(shù)和提供的靜態(tài)方法手動設(shè)置對應(yīng)的相關(guān)信息;

MediaQueryData 包含關(guān)于媒介的相關(guān)信息;一般通過 MediaQuery.of(context) 獲取;

size 為媒介的尺寸大小,以邏輯像素為單位;

devicePixelRatio 為像素密度;與設(shè)備物理像素有關(guān),與橫豎屏等無關(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)字號,其 1.2 倍依舊是以標(biāo)準(zhǔn)字號為基礎(chǔ)擴(kuò)大 1.2 倍;

platformBrightness 為當(dāng)前設(shè)備的亮度模式;注意調(diào)整屏幕亮度并不會改變該模式,與當(dāng)前系統(tǒng)支持的黑暗模式和明亮模式相關(guān);

alwaysUse24HourFormat 為當(dāng)前設(shè)備是否為 24 小時(shí)制;

accessibleNavigation 為是否使用 TalkBack 或 VoiceOver 之類的輔助功能與應(yīng)用程序進(jìn)行交互,用以輔助視力障礙人群;

invertColors 為是否使用顏色反轉(zhuǎn),主要用于 iOS 設(shè)備;

highContrast 為用戶是否要求前景與背景之間的對比度高,主要用于 iOS 設(shè)備;

disableAnimations 為平臺是否要求禁用或減少動畫;

boldText 為平臺是否要求使用粗體;

padding 為屏幕內(nèi)邊距,一般是劉海兒屏或異形屏中被系統(tǒng)遮擋部分邊距;

viewInsets 為鍵盤彈出時(shí)等遮擋屏幕邊距,其中 viewInsets.bottom 為鍵盤高度;

systemGestureInsets 為手勢邊距,如 Android Q 之后添加的向左滑動關(guān)閉頁面等;

viewPadding 小菜理解為視圖內(nèi)邊距,為屏幕被劉海兒屏或異形屏中被系統(tǒng)遮擋部分,從 MediaQuery 邊界的邊緣計(jì)算;此值是保持不變;例如,屏幕底部的軟件鍵盤可能會覆蓋并占用需要底部填充的相同區(qū)域,因此不會影響此值;

physicalDepth 為設(shè)備物理層級,小菜暫時(shí)還未想到對應(yīng)的應(yīng)用場景;

小菜在嘗試獲取其他子 Widget Size 時(shí),有兩點(diǎn)需要注意,首先要設(shè)置一個(gè)全局的 GlobalKey 來獲取當(dāng)前位置, key 需要為唯一的;第二通過 GlobalKey().currentContext 獲取 BuildContext 上下文環(huán)境,從而獲取對應(yīng)尺寸;

MediaQuery 案例嘗試

小菜對于部分 MediaQueryData 的應(yīng)用和理解還不夠深入;如有錯(cuò)誤請多多指導(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ù)制出來去掉:就可以使用了。

Widget總結(jié)

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

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

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

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

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

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

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

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

完整生命周期如下:

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

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

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

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

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

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

比如:

Flutter 中widget key的作用

3.在 StatelessWidget 中,因?yàn)椴豢勺?,element 的值沒有報(bào)存在element中,所以update也不會改變原有界面。

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

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

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

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

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

Flutter : 2.8.1

Dart : 2.15.1

IDE : VSCode

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

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

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

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

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

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

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

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

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

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

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

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

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

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

通過Apple的開發(fā)文檔找到有關(guān)權(quán)限問題的說明。其中有個(gè)授權(quán)私鑰的key為 com.apple.security.files.downloads.read-write ,表示 對用戶的下載文件夾的讀/寫訪問權(quán)限 。那么,使用Xcode打開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)可以向下載目錄中讀寫文件了。

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

原文地址:

flutter-動畫

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

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

FPS:幀率,每秒的動畫幀數(shù)。

flutter動畫分為兩類:

常見動畫模式:

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

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

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

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

curve:描述動畫的曲線過程。

curvedAnimation:指定動畫的曲線。

常用Curve:

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

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

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

映射過程:

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

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

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

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

防止屏幕外動畫消耗資源。

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

過程:

回調(diào):

不使用addListener()和setState()來給widget添加動畫。

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

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

如何渲染過渡,把渲染過程也抽象出來:

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

MaterialPageRoute:平臺風(fēng)格一致的路由切換動畫

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

自定義:PageRouteBuilder

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

2.一個(gè)AnimationController控制所有的動畫對象。

3.給每一個(gè)動畫對象指定時(shí)間間隔(Interval)

可以同時(shí)對其新、舊子元素添加顯示、隱藏動畫.

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

希望大家支持一下,感謝

當(dāng)前文章:flutterkey,flutter可以寫網(wǎng)頁嗎
本文路徑:http://jinyejixie.com/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)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
屯门区| 灵武市| 临湘市| 依安县| 临朐县| 华亭县| 喀喇沁旗| 九龙县| 高密市| 屏山县| 台江县| 和平县| 许昌县| 社旗县| 盐城市| 康保县| 库尔勒市| 治多县| 衡阳市| 柘荣县| 道真| 本溪| 长兴县| 东方市| 平阳县| 信宜市| 平泉县| 黄浦区| 五华县| 广安市| 子长县| 奎屯市| 龙井市| 嘉黎县| 县级市| 南丹县| 扎囊县| 霍城县| 乌兰县| 淮阳县| 天长市|