1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      啟動(dòng)flutter,啟動(dòng)項(xiàng)disabled是什么意思

      Flutter初始化

      新建一個(gè)Flutter工程,android模塊。

      10年積累的成都網(wǎng)站建設(shè)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有五峰免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

      1,只有一個(gè)Activity組件,它是Dart層繪制Widget的容器。

      2,Application配置FlutterApplication。

      應(yīng)用Application配置io.flutter.app.FlutterApplication類,App首次啟動(dòng)時(shí),初始化。

      調(diào)用FlutterMain.startInitialization()方法。

      initConfig方法,從AndroidManfest.xml配置的applicaion節(jié)點(diǎn)獲取meta-data數(shù)據(jù),初始化以下默認(rèn)值。

      這些值都是使用中用到的name,例如,抽取apk中asset資源時(shí),flutter_assets打包目錄,打包產(chǎn)物data名稱。

      initResources方法, 初始化資源。

      在Flutter打包apk的asset目錄下,包括fluttter_asset目錄/資源項(xiàng),將資源從apk中抽取,保存在 Context.getDir("flutter", 0) 目錄下。

      /data/user/0/包名/app_flutter目錄。

      在目錄中創(chuàng)建一個(gè)時(shí)間戳文件,根據(jù)apk版本和包信息記錄的lastUpdateTime更新時(shí)間,第二次啟動(dòng)時(shí),若apk未更新,不需要再次抽取。

      加載so庫(kù),libflutter.so,System.loadLibrary()。

      主頁(yè)面繼承FlutterActivity,配置啟動(dòng)模式singleTop。

      FlutterActivity類在io.flutter.app包, (區(qū)別io.flutter.embedding.android包), 組件生命周期委托給FlutterActivityDelegate類。

      組件啟動(dòng),onCreate方法。

      FlutterMain.ensureInitializationComplete方法,確保資源成功抽取完成,創(chuàng)建FlutterView視圖(io.flutter.view),繼承SurfaceView類,setContentView方法,設(shè)置組件主布局即FlutterView視圖。

      最后,根據(jù)Bundle路徑,runBundle()加載運(yùn)行,

      調(diào)用FlutterView的runFromBundle方法,入口點(diǎn)在dart的main方法,

      通過FlutterNativeView,調(diào)用FlutterJNI的native方法。

      nativeRunBundleAndSnapshotFromLibrary方法。

      任重而道遠(yuǎn)

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

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

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

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

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

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

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

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

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

      經(jīng)歷了“遠(yuǎn)古時(shí)代”之后, FlutterActivity 來(lái)到了 io.flutter.embedding.android.FlutterActivity , 在到 2.5 版本發(fā)布之前,F(xiàn)lutter 又針對(duì)這個(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 來(lái)進(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 的方法來(lái)執(zhí)行動(dòng)畫,最后動(dòng)畫結(jié)束時(shí)通過 onTransitionComplete 移除 splashScreenView 。

      所以整體邏輯就是:

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

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

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

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

      大概配置完就是如下樣子, 前面分析那么多其實(shí)就是為了告訴你,如果出現(xiàn)問題了,你可以從哪個(gè)地方去找到對(duì)應(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 來(lái)實(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)頁(yè)的新調(diào)整。

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

      新建一個(gè)flutter項(xiàng)目,可以在ios上運(yùn)行,四步搞定!

      1. 建立一個(gè)flutter項(xiàng)目的命令

      2. 在ios文件夾下,生成pods文件夾

      3. Xcode環(huán)境簽名設(shè)置;

      把錯(cuò)誤的版本刪除再添加,可解決簽名錯(cuò)誤問題;必須先刪除再添加,直接修改可能不起作用。團(tuán)隊(duì)開發(fā),必須使用團(tuán)隊(duì)的簽名。

      4.運(yùn)行創(chuàng)建的flutter項(xiàng)目;

      選擇真機(jī)、模擬機(jī),點(diǎn)擊運(yùn)行按鈕,或使用命令運(yùn)行:

      下面兩步是贈(zèng)送的:

      5.新加一款插件,所涉及的命令;

      ios 端所涉及的命令

      6. 剛更新的插件和已有的插件有沖突怎么辦?

      可以試一試以下步驟:

      Flutter應(yīng)用啟動(dòng)頁(yè)設(shè)置,解決 白/黑 屏情況

      出現(xiàn)此情況的原因有兩種

      解決:

      找到 \app\src\main\res\drawable\launch_background.xml 文件,這個(gè)里面初始化了布局標(biāo)簽,只需要把圖片替換為我們自己的就可以。

      或者根據(jù)不同手機(jī)的分辨率 在mipmap下放置圖片例如:

      之后前往 styles.xml 文件設(shè)置啟動(dòng)頁(yè)

      重新打包就可以看到 剛剛設(shè)置的啟動(dòng)頁(yè)了

      效果例如:

      [圖片上傳失敗...(image-7e5c2-1586668143446)]

      至此可以流暢的打開啟動(dòng)頁(yè)了


      當(dāng)前文章:?jiǎn)?dòng)flutter,啟動(dòng)項(xiàng)disabled是什么意思
      文章URL:http://www.ef60e0e.cn/article/dsegiih.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        会理县| 什邡市| 龙游县| 股票| 绥棱县| 武强县| 扎囊县| 南开区| 太康县| 阿荣旗| 穆棱市| 会同县| 安泽县| 濮阳县| 永丰县| 隆林| 图们市| 静海县| 闻喜县| 永登县| 华坪县| 方城县| 贡嘎县| 富源县| 双峰县| 永康市| 化德县| 资中县| 长寿区| 洱源县| 乌兰浩特市| 云阳县| 黑龙江省| 涟源市| 天津市| 绵竹市| 渭源县| 靖远县| 鄄城县| 阳泉市| 甘孜县|