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

flutter兼容,flutter兼容性

Flutter開發(fā)--Pub包管理

在原生開發(fā)中, Android 使用 Gradle 來管理依賴, iOS 用 Cocoapods 來管理依賴,Node 中通過 npm來管理依賴。 Flutter 使用配置文件 pubspec.yaml (位于項(xiàng)目根目錄)來管理第三方依賴包。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比三元網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式三元網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋三元地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

Pub 是Google官方的Dart Packages倉庫,類似于node中的npm倉庫,android中的jcenter,我們可以在上面查找我們需要的包和插件,也可以向pub發(fā)布我們的包和插件。

Pub工具 包含管理Package、部署Package和部署命令行應(yīng)用的命令。

如果使用的是Flutter SDK,不要直接使用pub命令。而是使用flutter pub命令,如下:

命令pub get/upgrade/outdated 屬于管理Package的依賴關(guān)系

用于檢索當(dāng)前 Package 所依賴的其它 Package。如果 pubspec.lock 文件已經(jīng)存在,則根據(jù)該文件中保存的依賴項(xiàng)版本獲取對應(yīng)的依賴項(xiàng)。如有必要,將會(huì)創(chuàng)建或更新該文件。

更新 package 依賴

當(dāng)你添加一個(gè) package 后首次運(yùn)行 flutter pub get, Flutter 將會(huì)保存在 pubspec.lock lockfile 中找到的具體 package 版本。這將確保當(dāng)你或者團(tuán)隊(duì)中其他開發(fā)者運(yùn)行 flutter pub get 后能得到相同版本的 package。

如果你想升級到 package 的最新版本,比如使用 package 的最新特性,請運(yùn)行 flutter pub upgrade 。這將檢索你在 pubspec.yaml 文件中指定的版本約束所允許的最高可用版本。

案例

在flutter項(xiàng)目中導(dǎo)入hive包,在pubspec.yaml文件中添加配置:

執(zhí)行flutter pub get,可以在 pubspec.lock 中看到 hive 版本是2.1.0,這是因?yàn)槟壳癶ive的最新版本是2.1.0,配置“^”表示向最新版本兼容,具體可查看Package版本管理( ),所以再執(zhí)行flutter pub upgrade 可以看到版本還是2.1.0,這個(gè)時(shí)候會(huì)發(fā)現(xiàn)pub get和 pub upgrade 效果一樣。

但是未來如果 hive 發(fā)布了2.2.0版本,這個(gè)時(shí)候使用flutter pub get在pubspec.lock中看到hive版本依舊是2.1.0,而執(zhí)行flutter pub upgrade 后在pubspec.lock中看到hive版本就是2.2.0。

現(xiàn)在先在flutter 項(xiàng)目的pubspec.yaml文件添加配置,指定hive版本是2.0.5,如下:

這個(gè)時(shí)候執(zhí)行flutter pub get后,可以在pubspec.lock的文件中看到hive版本是2.0.5,如果這個(gè)時(shí)候更改配置為 hive: ^2.0.5,再執(zhí)行flutter pub get就會(huì)發(fā)現(xiàn)在pubspec.lock的文件中看到hive版本還是2.0.5,這個(gè)時(shí)候可以執(zhí)行flutter pub outdated查看依賴的每個(gè) package,如下圖,

可以看到,Upgrable項(xiàng)hive版本號為2.1.0,執(zhí)行flutter pub upgrade 后可以看到在pubspec.lock的文件中看到hive版本是2.1.0

在pubspec.yaml文件添加配置:

lxx_package_demo信息如下圖:

執(zhí)行flutter pub get后在pubspec.lock中看到flutter_log版本是0.0.1

現(xiàn)在修改lxx_package_demo版本號為0.0.2,再執(zhí)行flutter pub get

會(huì)發(fā)現(xiàn)版本會(huì)及時(shí)更新為0.0.2,這個(gè)時(shí)候執(zhí)行flutter pub get/upgrade效果一樣

參考文檔:

Flutter 啟動(dòng)頁的前世今生適配歷程

APP 啟動(dòng)頁在國內(nèi)是最常見也是必備的場景,其中啟動(dòng)頁在 iOS 上算是強(qiáng)制性的要求,其實(shí)配置啟動(dòng)頁挺簡單,因?yàn)樵?Flutter 里現(xiàn)在只需要:

一般只要配置無誤并且圖片尺寸匹配,基本上就不會(huì)有什么問題, 那既然這樣,還有什么需要適配的呢?

事實(shí)上大部分時(shí)候 iOS 是不會(huì)有什么問題, 因?yàn)? LaunchScreen.storyboard 的流程本就是 iOS 官方用來做應(yīng)用啟動(dòng)的過渡;而對于 Andorid 而言,直到 12 之前 windowBackground 這種其實(shí)只能算“民間”野路子 ,所以對于 Andorid 來說,這其中就涉及到一個(gè)點(diǎn):

所以下面主要介紹 Flutter 在 Android 上為了這個(gè)啟動(dòng)圖做了哪些騷操作~

在已經(jīng)忘記版本的“遠(yuǎn)古時(shí)期” , FlutterActivity 還在 io.flutter.app.FlutterActivity 路徑下的時(shí)候,那時(shí)啟動(dòng)頁的邏輯相對簡單,主要是通過 App 的 AndroidManifest 文件里是否配置了 SplashScreenUntilFirstFrame 來進(jìn)行判斷。

在 FlutterActivity 內(nèi)部 FlutterView 被創(chuàng)建的時(shí)候,會(huì)通過讀取 meta-data 來判斷是否需要使用 createLaunchView 邏輯 :

是不是很簡單,那就會(huì)有人疑問為什么要這樣做?我直接配置 Activity 的 android:windowBackground 不就完成了嗎?

這就是上面提到的時(shí)間差問題, 因?yàn)閱?dòng)頁到 Flutter 渲染完第一幀畫面中間,會(huì)出現(xiàn)概率出現(xiàn)黑屏的情況,所以才需要這個(gè)行為來實(shí)現(xiàn)過渡 。

經(jīng)歷了“遠(yuǎn)古時(shí)代”之后, FlutterActivity 來到了 io.flutter.embedding.android.FlutterActivity , 在到 2.5 版本發(fā)布之前,F(xiàn)lutter 又針對這個(gè)啟動(dòng)過程做了不少調(diào)整和優(yōu)化,其中主要就是 SplashScreen 。

自從開始進(jìn)入 embedding 階段后, FlutterActivity 主要用于實(shí)現(xiàn)了一個(gè)叫 Host 的 interface ,其中和我們有關(guān)系的就是 provideSplashScreen 。

默認(rèn)情況下它會(huì)從 AndroidManifest 文件里是否配置了 SplashScreenDrawable 來進(jìn)行判斷 。

默認(rèn)情況下當(dāng) AndroidManifest 文件里配置了 SplashScreenDrawable ,那么這個(gè) Drawable 就會(huì)在 FlutterActivity 創(chuàng)建 FlutterView 時(shí)被構(gòu)建成 DrawableSplashScreen 。

DrawableSplashScreen 其實(shí)就是一個(gè)實(shí)現(xiàn)了 io.flutter.embedding.android.SplashScreen 接口的類,它的作用就是:

之后 FlutterActivity 內(nèi)會(huì)創(chuàng)建出 FlutterSplashView ,它是個(gè) FrameLayout。

FlutterSplashView 將 FlutterView 和 ImageView 添加到一起, 然后通過 transitionToFlutter 的方法來執(zhí)行動(dòng)畫,最后動(dòng)畫結(jié)束時(shí)通過 onTransitionComplete 移除 splashScreenView 。

所以整體邏輯就是:

當(dāng)然這里也是分狀態(tài):

當(dāng)然這個(gè)階段的 FlutterActivity 也可以通過 override provideSplashScreen 方法來自定義 SplashScreen 。

看到?jīng)]有,做了這么多其實(shí)也就是為了彌補(bǔ)啟動(dòng)頁和 Flutter 渲染之間, 另外還有一個(gè)優(yōu)化,叫 NormalTheme 。

通過該配置 NormalTheme ,在 Activity 啟動(dòng)時(shí),就會(huì)首先執(zhí)行 switchLaunchThemeForNormalTheme(); 方法將主題從 LaunchTheme 切換到 NormalTheme 。

大概配置完就是如下樣子, 前面分析那么多其實(shí)就是為了告訴你,如果出現(xiàn)問題了,你可以從哪個(gè)地方去找到對應(yīng)的點(diǎn) 。

講了那么多, Flutter 2.5 之后 provideSplashScreen 和 io.flutter.embedding.android.SplashScreenDrawable 就被棄用了,驚不喜驚喜,意不意外,開不開心 ?

通過源碼你會(huì)發(fā)現(xiàn),當(dāng)你設(shè)置了 splashScreen 的時(shí)候,會(huì)看到一個(gè) log 警告:

為什么會(huì)棄用?

其實(shí)這個(gè)提議是在 這個(gè) issue 上,然后通過 這個(gè) pr 完成調(diào)整。

大概意思就是: 原本的設(shè)計(jì)搞復(fù)雜了,用 OnPreDrawListener 更精準(zhǔn),而且不需要為了后面 Andorid12 的啟動(dòng)支持做其他兼容,只需要給 FlutterActivity 等類增加接口開關(guān)即可 。

也就是2.5之后 Flutter 使用 ViewTreeObserver.OnPreDrawListener 來實(shí)現(xiàn)延遲直到加載出 Flutter 的第一幀。

為什么說默認(rèn)情況? 因?yàn)檫@個(gè)行為在 FlutterActivity 里,是在 getRenderMode() == RenderMode.surface 才會(huì)被調(diào)用,而 RenderMode 又和 BackgroundMode 有關(guān)心 。

所以在 2.5 版本后, FlutterActivity 內(nèi)部創(chuàng)建完 FlutterView 后就會(huì)執(zhí)行一個(gè) delayFirstAndroidViewDraw 的操作。

這里主要注意一個(gè)參數(shù): isFlutterUiDisplayed 。

當(dāng) Flutter 被完成展示的時(shí)候, isFlutterUiDisplayed 就會(huì)被設(shè)置為 true。

所以當(dāng) Flutter 沒有執(zhí)行完成之前, FlutterView 的 onPreDraw 就會(huì)一直返回 false ,這也是 Flutter 2.5 開始之后適配啟動(dòng)頁的新調(diào)整。

看了這么多,大概可以看到其實(shí)開源項(xiàng)目的推進(jìn)并不是一帆風(fēng)順的,沒有什么是一開始就是最優(yōu)解,而是經(jīng)過多方嘗試和交流,才有了現(xiàn)在的版本,事實(shí)上開源項(xiàng)目里,類似這樣的經(jīng)歷數(shù)不勝數(shù):

Flutter開發(fā) 解決iOS編譯不兼容Swift

在進(jìn)行Flutter開發(fā)過程中,很容易出現(xiàn)iOS原生端編譯不成功的問題,比如出現(xiàn)Undefined symbol:__swift_FORCE_LOAD_$_swfitCoreLocation

出現(xiàn)這種情況的時(shí)候,為沒有導(dǎo)入swift頭文件導(dǎo)致編譯不成功,解決辦法為:

1、新建選中Runner右鍵New File ?選擇Swift File

2、點(diǎn)擊create的時(shí)候會(huì)出現(xiàn)選擇Xcode ?- Create Bridging Header?

3、隨后會(huì)創(chuàng)建一個(gè)Runner-Bridging-Heading.h的文件

4、正常運(yùn)行項(xiàng)目即可

一般此情況多出現(xiàn)在第一次運(yùn)行iOS的情況,為導(dǎo)入過支持Swift后XCode沒有進(jìn)行兼容導(dǎo)致的問題。

網(wǎng)站欄目:flutter兼容,flutter兼容性
本文來源:http://chinadenli.net/article29/dsegich.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管品牌網(wǎng)站設(shè)計(jì)微信小程序網(wǎng)站制作網(wǎng)站排名做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(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è)