国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flutter完整開(kāi)發(fā)實(shí)戰(zhàn)詳解(三、 打包與填坑篇)

這篇具有很好參考價(jià)值的文章主要介紹了Flutter完整開(kāi)發(fā)實(shí)戰(zhàn)詳解(三、 打包與填坑篇)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本篇將為你著重展示:Flutter開(kāi)發(fā)過(guò)程的打包流程、APP包對(duì)比、細(xì)節(jié)技巧與問(wèn)題處理。本篇主要描述的Flutter的打包、在開(kāi)發(fā)過(guò)程中遇到的各類(lèi)問(wèn)題與細(xì)節(jié),算是對(duì)上兩篇的補(bǔ)全。

一、打包

首先我們先看結(jié)果,如下表所示,是 Flutter 與 React Native 、IOS 與 Android 的縱向與橫向?qū)Ρ?/strong> 。

flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

從上表我們可以看到:

  • Fluuter的 apk 會(huì)比 ipa 更小一些,這其中的一部分原因是 Flutter 使用的 Skia 在Android 上是自帶的。
  • 橫向?qū)Ρ?React Native ,雖然項(xiàng)目不完全一樣,但是大部分功能一致的情況下, Flutter 的 Apk 確實(shí)更小一些。這里又有一個(gè)細(xì)節(jié),rn 的 ipa 包體積小很多,這其實(shí)是因?yàn)?javascriptcore 在 ios上 是內(nèi)置的原因。
1、Android打包

flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

I’m Android

在Android的打包上,筆者基本沒(méi)有遇到什么問(wèn)題,在android/app/build.grade文件下,配置applicationId、versionCodeversionName 和簽名信息,最后通過(guò) flutter build app 即可完成編譯。編程成功的包在 build/app/outputs/apk/release 下。

2、IOS打包與真機(jī)運(yùn)行

在IOS的打包上,筆者倒是經(jīng)歷了一波曲折,這里主要講筆者遇到的問(wèn)題。

首先你需要一個(gè) apple 開(kāi)發(fā)者賬號(hào),然后創(chuàng)建證書(shū)、創(chuàng)建AppId,創(chuàng)建配置文件、最后在info.plist文件下輸入相關(guān)信息,更詳細(xì)可看官方的《發(fā)布的IOS版APP》的教程。

但由于筆者項(xiàng)目中使用了第三方的插件包如 shared_preferences 等,在執(zhí)行 Archive 的過(guò)程卻一直出現(xiàn)如下問(wèn)題:

在 `Archive` 時(shí)提示找不到
#import <connectivity/ConnectivityPlugin.h>  ///file not found
#import <device_info/DeviceInfoPlugin.h>
#import <flutter_statusbar/FlutterStatusbarPlugin.h>
#import <flutter_webview_plugin/FlutterWebviewPlugin.h>
#import <fluttertoast/FluttertoastPlugin.h>
#import <get_version/GetVersionPlugin.h>
#import <package_info/PackageInfoPlugin.h>
#import <share/SharePlugin.h>
#import <shared_preferences/SharedPreferencesPlugin.h>
#import <sqflite/SqflitePlugin.h>
#import <url_launcher/UrlLauncherPlugin.h>

通過(guò) Android Studio 運(yùn)行到 IOS 模擬器時(shí)沒(méi)有任何問(wèn)題,說(shuō)明這不是第三方包問(wèn)題。通過(guò)查找問(wèn)題發(fā)現(xiàn),在 IOS 執(zhí)行 Archive 之前,需要執(zhí)行 flutter build release,如下圖在命令執(zhí)行之后,Pod 的執(zhí)行目錄會(huì)發(fā)現(xiàn)改變,并且生成打包需要的文件。(ps 普通運(yùn)行時(shí)自動(dòng)又會(huì)修改回來(lái)

flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

文件變化

但是實(shí)際在執(zhí)行 flutter build release 后,問(wèn)題依然存在,最終翻山越嶺(╯‵□′)╯︵┻━┻,終于找到兩個(gè)答案:

  • Issue#19241 下描述了類(lèi)似問(wèn)題,但是他們因?yàn)槁窂絾?wèn)題導(dǎo)致,經(jīng)過(guò)嘗試并不能解決。
  • Issue#18305 真實(shí)的解決了這個(gè)問(wèn)題,居然是因?yàn)?Pod 的工程沒(méi)引入:
open ios/Runner.xcodeproj

I checked Runner/Pods is empty in Xcode sidebar.

drop Pods/Pods.xcodeproj into Runner/Pods.

"Valid architectures" to only "arm64" (I removed armv7 armv7s) 

最后終于成功打包,心累啊(///▽///)。同時(shí)如果希望直接在真機(jī)上調(diào)試 Flutter

這里主要講一些小細(xì)節(jié)

1、AppBar

在 Flutter 中 AppBar 算是常用 Widget ,而 AppBar 可不僅僅作為標(biāo)題欄和使用,AppBar上的 leadingbottom 同樣是有用的功能。

  • AppBar 的 bottom 默認(rèn)支持 TabBar, 也就是常見(jiàn)的頂部 Tab 的效果,這其實(shí)是因?yàn)?code>TabBar 實(shí)現(xiàn)了 PreferredSizeWidgetpreferredSize。 所以只要你的控件實(shí)現(xiàn)了 preferredSize,就可以放到 AppBar 的 bottom 中使用。比如下圖搜索欄,這是TabView下的頁(yè)面又實(shí)用了AppBar。

flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

  • leading :通常是左側(cè)按鍵,不設(shè)置時(shí)一般是 Drawer 的圖標(biāo)或者返回按鈕。
  • flexibleSpace :位于 bottomleading 之間。
2、按鍵

Flutter 中的按鍵,如 FlatButton 默認(rèn)是否有邊距和最小大小的。所以如果你想要無(wú) padding、margin、border 、默認(rèn)大小 等的按鍵效果,其中一種方式如下:

///
new RawMaterialButton(
        materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
        padding: padding ?? const EdgeInsets.all(0.0),
        constraints: const BoxConstraints(minWidth: 0.0, minHeight: 0.0),
        child: child,
        onPressed: onPressed);

如果在再上 Flex ,如下所示,一個(gè)可控的填充按鍵就出來(lái)了。

new RawMaterialButton(
        materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
        padding: padding ?? const EdgeInsets.all(0.0),
        constraints: const BoxConstraints(minWidth: 0.0, minHeight: 0.0),
        ///flex
        child: new Flex(
          mainAxisAlignment: mainAxisAlignment,
          direction: Axis.horizontal,
          children: <Widget>[],
        ),
        onPressed: onPressed);
3、StatefulWidget 賦值

這里我們以給 TextField 主動(dòng)賦值為例,其實(shí) Flutter 中,給有狀態(tài)的 Widget 傳遞狀態(tài)或者數(shù)據(jù),一般都是通過(guò)各種 controller 。如 TextField 的主動(dòng)賦值,如下代碼所示:

 final TextEditingController controller = new TextEditingController();

 @override
 void didChangeDependencies() {
    super.didChangeDependencies();
    ///通過(guò)給 controller 的 value 新創(chuàng)建一個(gè) TextEditingValue
    controller.value = new TextEditingValue(text: "給輸入框填入?yún)?shù)");
 }

 @override
  Widget build(BuildContext context) {
    return new TextField(
     ///controller
      controller: controller,
      onChanged: onChanged,
      obscureText: obscureText,
      decoration: new InputDecoration(
        hintText: hintText,
        icon: iconData == null ? null : new Icon(iconData),
      ),
    );
  }

其實(shí) TextEditingValueValueNotifier,其中 value 的 setter 方法被重載,一旦改變就會(huì)觸發(fā) notifyListeners 方法。而 TextEditingController 中,通過(guò)調(diào)用 addListener 就監(jiān)聽(tīng)了數(shù)據(jù)的改變,從而讓UI更新。

當(dāng)然,賦值有更簡(jiǎn)單粗暴的做法是:傳遞一個(gè)對(duì)象 class A 對(duì)象,在控件內(nèi)部使用對(duì)象 A.b 的變量綁定控件,外部通過(guò) setState({ A.b = b2}) 更新

4、GlobalKey

在Flutter中,要主動(dòng)改變子控件的狀態(tài),還可以使用 GlobalKey。 比如你需要主動(dòng)調(diào)用 RefreshIndicator 顯示刷新?tīng)顟B(tài),如下代碼所示。

 GlobalKey<RefreshIndicatorState> refreshIndicatorKey;
  
 showForRefresh() {
    ///顯示刷新
    refreshIndicatorKey.currentState.show();
  }

  @override
  Widget build(BuildContext context) {
    refreshIndicatorKey =  new GlobalKey<RefreshIndicatorState>();
    return new RefreshIndicator(
      key: refreshIndicatorKey,
      onRefresh: onRefresh,
      child: new ListView.builder(
        ///·····
      ),
    );
  }
5、Redux 與主題

使用 Redux 來(lái)做 Flutter 的全局 State 管理最合適不過(guò),由于Redux內(nèi)容較多,如果感興趣的可以看看 篇章二 ,這里主要通過(guò) Redux 來(lái)實(shí)現(xiàn)實(shí)時(shí)切換主題的效果。

如下代碼,通過(guò) StoreProvider 加載了 store ,再通過(guò) StoreBuilder 將 store 中的 themeData 綁定到 MaterialApp 的 theme 下,之后在其他 Widget 中通過(guò) Theme.of(context) 調(diào)你需要的顏色,最終在任意位置調(diào)用 store.dispatch 就可實(shí)時(shí)修改主題,效果如后圖所示。

class FlutterReduxApp extends StatelessWidget {
  final store = new Store<GSYState>(
    appReducer,
    initialState: new GSYState(
      themeData: new ThemeData(
        primarySwatch: GSYColors.primarySwatch,
      ),
    ),
  );

  FlutterReduxApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    /// 通過(guò) StoreProvider 應(yīng)用 store
    return new StoreProvider(
      store: store,
      ///通過(guò) StoreBuilder 獲取 themeData
      child: new StoreBuilder<GSYState>(builder: (context, store) {
        return new MaterialApp(
            theme: store.state.themeData,
            routes: {
              HomePage.sName: (context) {
                return HomePage();
              },
            });
      }),
    );
  }
}

flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

6、Hotload 與 Package

Flutter 在 Debug 和 Release 下分別是 JITAOT 模式,而在 DEBUG 下,是支持 Hotload 的,而且十分絲滑。但是需要注意的是:如果開(kāi)發(fā)過(guò)程中安裝了新的第三方包 ,而新的第三方包如果包含了原生代碼,需要停止后重新運(yùn)行哦。

pubspec.yaml 文件下就是我們的包依賴(lài)目錄,其中 ^ 代表大于等于,一般情況下 upgradeget 都能達(dá)到下載包的作用。但是:upgrade 會(huì)在包有更新的情況下,更新 pubspec.lock 文件下包的版本 。

三、問(wèn)題處理

  • Waiting for another flutter command to release the startup lock :如果遇到這個(gè)問(wèn)題:
  1、打開(kāi)flutter的安裝目錄/bin/cache/ 
  2、刪除lockfile文件 
  3、重啟AndroidStudio
  • dialog下的黃色線 yellow-lines-under-text-widgets-in-flutter:showDialog 中,默認(rèn)是沒(méi)使用 Scaffold ,這回導(dǎo)致文本有黃色溢出線提示,可以使用 Material 包一層處理。
  • TabBar + TabView + KeepAlive 的問(wèn)題 可以通過(guò) TabBar + PageView 解決

自此,第三篇終于結(jié)束了!(///▽///)

最后

這里也為想要學(xué)習(xí)Flutter的朋友們準(zhǔn)備了兩份學(xué)習(xí)資料《Flutter Dart語(yǔ)言編程入門(mén)到精通》《Flutter實(shí)戰(zhàn)》,從編程語(yǔ)言到項(xiàng)目實(shí)戰(zhàn),一條龍服務(wù)!!
flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

《Flutter Dart 語(yǔ)言編程入門(mén)到精通》

  • 第一章 Dart語(yǔ)言基礎(chǔ)

  • 第二章 Dart 異步編程
    flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

  • 第三章 異步之 Stream 詳解

  • 第四章 Dart標(biāo)準(zhǔn)輸入輸出流
    flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

  • 第五章 Dart 網(wǎng)絡(luò)編程

  • 第六章 Flutter 爬蟲(chóng)與服務(wù)端
    flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

  • 第七章 Dart 的服務(wù)端開(kāi)發(fā)

  • 第八章 Dart 調(diào)用C語(yǔ)言混合編程

  • 第九章 LuaDardo中Dart與Lua的相互調(diào)用
    flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

《Flutter實(shí)戰(zhàn):第二版》

  • 第一章:起步
  • 第二章:第一個(gè)Flutter應(yīng)用
  • 第三章:基礎(chǔ)組件
  • 第四章:布局類(lèi)組件
  • 第五章:容器類(lèi)組件

flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

  • 第六章:可滾動(dòng)組件

  • 第七章:功能型組件

  • 第八章:事件處理與通知

  • 第九章:動(dòng)畫(huà)

  • 第十章:自定義組件
    flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

  • 第十一章:文件操作與網(wǎng)絡(luò)請(qǐng)求

  • 第十二章:Flutter擴(kuò)展

  • 第十三章:國(guó)際化

  • 第十四章:Flutter核心原理

  • 第十五章:一個(gè)完整的Flutter應(yīng)用
    flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

有需要學(xué)習(xí)資料的朋友掃描下方二維碼即可免費(fèi)領(lǐng)?。。。?span toymoban-style="hidden">文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860864.html

flutter打包,flutter,android,面試,職場(chǎng)和發(fā)展,1024程序員節(jié),程序人生

到了這里,關(guān)于Flutter完整開(kāi)發(fā)實(shí)戰(zhàn)詳解(三、 打包與填坑篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vite打包性能優(yōu)化以及填坑

    vite打包性能優(yōu)化以及填坑

    目錄 前言 項(xiàng)目?jī)?yōu)化前 分析 優(yōu)化 拆分包 去除debugger CDN 加速 按需導(dǎo)入 文件壓縮 圖片壓縮 viteImagemin報(bào)錯(cuò) 填坑 坑1 坑2 總結(jié) 配置 ????????最近在使用? Vite4.0 ?構(gòu)建一個(gè)中型前端項(xiàng)目的過(guò)程中,遇到了一些坑,也做了一些項(xiàng)目在構(gòu)建生產(chǎn)環(huán)境時(shí)的優(yōu)化,在這里做一個(gè)記錄,

    2024年02月16日
    瀏覽(17)
  • Vite打包性能優(yōu)化及填坑

    Vite打包性能優(yōu)化及填坑

    最近在使用? Vite4.0 ?構(gòu)建一個(gè)中型前端項(xiàng)目的過(guò)程中,遇到了一些坑,也做了一些項(xiàng)目在構(gòu)建生產(chǎn)環(huán)境時(shí)的優(yōu)化,在這里做一個(gè)記錄,以便后期查閱。(完整配置在后面) 上面是dist文件夾的截圖,里面的內(nèi)容已經(jīng)有30mb了,是時(shí)候該做點(diǎn)什么了。 想要實(shí)現(xiàn)優(yōu)化,首先我得先知道

    2024年02月10日
    瀏覽(17)
  • 從零基礎(chǔ)到精通:Flutter開(kāi)發(fā)的完整指南

    從零基礎(chǔ)到精通:Flutter開(kāi)發(fā)的完整指南

    ?? 個(gè)人網(wǎng)站:【工具大全】【游戲大全】【神級(jí)源碼資源網(wǎng)】 ?? 前端學(xué)習(xí)課程:??【28個(gè)案例趣學(xué)前端】【400個(gè)JS面試題】 ?? 尋找學(xué)習(xí)交流、摸魚(yú)劃水的小伙伴,請(qǐng)點(diǎn)擊【摸魚(yú)學(xué)習(xí)交流群】 Flutter是一種跨平臺(tái)的移動(dòng)應(yīng)用開(kāi)發(fā)框架,它允許開(kāi)發(fā)者使用單一代碼庫(kù)構(gòu)建高性能

    2024年02月05日
    瀏覽(52)
  • jenkins+gitlab實(shí)現(xiàn)Android自動(dòng)打包填坑之旅

    jenkins+gitlab實(shí)現(xiàn)Android自動(dòng)打包填坑之旅

    1.首先你需要知道你想要實(shí)現(xiàn)的Android自動(dòng)打包的Android項(xiàng)目的一些環(huán)境配置及需要使用的一些開(kāi)發(fā)版本。 聲明:本文 Android項(xiàng)目基于:1.jdk11 2.SDK無(wú)要求 3.gradle無(wú)要求(同Manven一樣為項(xiàng)目自動(dòng)化構(gòu)建開(kāi)源工具) 注:本文適用于 任何版本 jdk SDK Gradle。 了解Android項(xiàng)目使用到的東西

    2024年01月25日
    瀏覽(19)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-多語(yǔ)言flutter intl

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-多語(yǔ)言flutter intl

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-多語(yǔ)言flutter intl 之前做的應(yīng)用中有用到多語(yǔ)言,一直沒(méi)有整理,這里整理一下多語(yǔ)言設(shè)置流程。 使用的是Android studio 使用Android studio安裝flutter_intl 插件,更新或者安裝flutter_intl 插件后會(huì)提示重新啟動(dòng)IDE。 如圖所示: 在Android Studio中菜單Tools找到flutter intl創(chuàng)建

    2024年02月13日
    瀏覽(25)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用 在使用inappwebview時(shí)候,需要flutter端與JS進(jìn)行交互,調(diào)用相應(yīng)的方法,在inappwebview中的JavaScript Handlers。 要添加JavaScript Handlers,可以使用InAppWebViewController.addJavaScriptHandler方法,在該方法中定義handlerName和JavaScript端調(diào)用它時(shí)要

    2024年02月03日
    瀏覽(30)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與iOS雙向通信

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與iOS雙向通信 最近開(kāi)發(fā)中需要iOS與flutter實(shí)現(xiàn)通信,這里使用的MethodChannel 如果需要flutter與Android實(shí)現(xiàn)雙向通信,請(qǐng)看 https://blog.csdn.net/gloryFlow/article/details/132218837 這部分與https://blog.csdn.net/gloryFlow/article/details/132218837中的一致,這里實(shí)現(xiàn)一下

    2024年02月13日
    瀏覽(25)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-webview插件flutter_inappwebview使用

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-webview插件flutter_inappwebview使用

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-webview插件flutter_inappwebview使用 在開(kāi)發(fā)過(guò)程中,經(jīng)常遇到需要使用WebView,Webview需要調(diào)用原生的插件來(lái)實(shí)現(xiàn)。常見(jiàn)的flutter的webview插件是webview_flutter,flutter_inappwebview。之前整理了一下webview_flutter,查看https://blog.csdn.net/gloryFlow/article/details/131683122 這里我們使用fl

    2024年02月07日
    瀏覽(25)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-Theme主題切換

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-Theme主題切換

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-Theme主題切換 之前做的應(yīng)用中有用到Theme主題切換,一直沒(méi)有整理,這里整理一下。 使用的是Android studio // 提供五套可選主題色 在Main.dart入口的MaterialApp 當(dāng)主題切換后,Provider會(huì)通知到對(duì)應(yīng)的頁(yè)面Build,就會(huì)顯示對(duì)應(yīng)的主題。 主題切換頁(yè)面 flutter開(kāi)發(fā)實(shí)戰(zhàn)-Them

    2024年02月16日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包