鄙人iOS開發(fā)攻城獅一枚欲诺,因公司發(fā)展需求抄谐,2019年7月開始自學(xué)Flutter,于2019年11月學(xué)成并開發(fā)一款類似百度云盤APP并上架AppStore和GooglePay扰法,開發(fā)期間的辛酸和痛苦只有自己知道蛹含,總體來說,痛并快樂著塞颁,以下是使用Flutter開發(fā)的一些基礎(chǔ)心得浦箱,分享給即將步入Flutter坑的攻城獅們。
基礎(chǔ)概念介紹:
Flutter 是 Google推出并開源的移動應(yīng)用開發(fā)框架祠锣,主打跨平臺酷窥、高保真、高性能伴网。開發(fā)者可以通過 Dart語言開發(fā) App蓬推,一套代碼同時運行在 iOS 和 Android平臺。 Flutter提供了豐富的組件澡腾、接口沸伏,開發(fā)者可以很快地為 Flutter添加 native擴展。同時 Flutter還使用 Native引擎渲染視圖动分,這無疑能為用戶提供良好的體驗
Flutter是谷歌的移動UI框架毅糟,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面。 Flutter可以與現(xiàn)有的代碼一起工作澜公。在全世界留特,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用,并且Flutter是完全免費玛瘸、開源的。2018年12月5日發(fā)布正式版本1.0苟蹈。
Flutter使用Dart語言開發(fā)糊渊,dart語言是由谷歌公司開發(fā)的網(wǎng)絡(luò)編程語言,于2011年10月10日發(fā)布一種面向?qū)ο蟮恼Z言慧脱,包含面向?qū)ο笳Z言的基本特征(繼承渺绒、封裝、多態(tài))菱鸥。
Flutter的核心宗旨宗兼,萬物皆Widget,相比較原生iOS/Android氮采,F(xiàn)lutter把所有對象全部看成Widget殷绍,比如基礎(chǔ)UI控件、手勢鹊漠、文本主到、圖片茶行、按鈕、動畫登钥、渲染等等
Flutter IDE:Android Studio / VSCode
項目常見問題:
針對問題:
1)flutter開發(fā)中常見功能的解決畔师,比如權(quán)限,導(dǎo)航牧牢,推送等等一般app開發(fā)中常用到的功能看锉。
1.權(quán)限問題,第三方插件
2.導(dǎo)航路由使用:1.簡單的路由類 2.命名路由 3.自定義路由
3.推送:iOS使用原生APNS通知塔鳍、Android使用FireBase推送
4.flutter的listview是不支持拖動排序的伯铣,需要支持列表拖動排序需要用ReorderableListView
2)碰到的問題以及如何解決的,比如推送過來點擊無法跳到通知詳細
1.在收到通知點擊跳轉(zhuǎn)詳情頁時献幔,沒有Context上下文對象懂傀,無法使用push跳轉(zhuǎn)至詳情頁
使用EventBus解決問題,新建Base類蜡感,Base監(jiān)聽接收通知蹬蚁,需要跳轉(zhuǎn)的頁面繼承Base
2.相冊圖片和視頻開始沒有在一個頁面內(nèi),是因為Flutter的插件太多郑兴,沒有選擇正確的插件使用
3.在列表有縮略圖的時候犀斋,使用State刷新整個頁面的時候,會有圖片閃爍的問題出現(xiàn)
使用GlobalKey情连,封裝想要刷新的控件叽粹,然后實現(xiàn)局部刷新
4.Flutter不支持操作本地文件的復(fù)制和粘貼功能
原生代碼實現(xiàn)功能,flutter通過channel調(diào)用原生方法實現(xiàn)
5.相冊插件的國際化語言問題
調(diào)用相冊的插件把頁面語言構(gòu)造寫死了却舀,如果想要實現(xiàn)插件中的國際化語言支持虫几,就得修改插件中的方法,可能存在每次更新插件挽拔,可能會導(dǎo)致修改部分失效
6.做兩個項目統(tǒng)合的時候辆脸,Android遇到分享欄里面存在兩個app問題?
7.切換本地語言后螃诅,調(diào)用api傳參時啡氢,語言對應(yīng)的參數(shù)變更問題?
8.本地圖片發(fā)生變化后术裸,刷新頁面無效果
需要重寫 本地圖片清除緩存并加載新圖倘是,判斷新圖片文件和舊圖片文件size是否一致
9.選擇插件一定要慎重,部分插件細節(jié)問題較難處理和修改
上傳相冊中斷網(wǎng)袭艺,調(diào)用隱藏loading搀崭,loading無法取消問題
進入下個頁面loading正在加載時,調(diào)用隱藏loading無效果
上傳多張圖片時猾编,插件內(nèi)部寫定單位為個门坷,想調(diào)整為進度條無法實現(xiàn)
調(diào)用隱藏按鈕角標時可能存在不隱藏狀況宣鄙,需重寫隱藏角標方法
10.本地文件,在Android的文件管理器中可以自行修改默蚌,會導(dǎo)致app內(nèi)本地文件丟失
3)相對于原生開發(fā)的優(yōu)缺點冻晤。
Flutter優(yōu)點:
1.支持熱重載功能伍伤,編譯更快
2.跨平臺响疚,高性能(基于DOM樹渲染原生組件)鳞青,一套Source抢肛,多平臺使用袋励,縮短開發(fā)周期崖瞭,性能相比原生相差不大,比weex和RN要好淋叶,尤 其是在動畫和列表滑動的時候
3.編碼相對簡單咐刨,上手難度較低码俩,
4.開發(fā)出的app相對其他跨平臺開發(fā)(WEEX度帮、react native、webApp)更流暢稿存、性能更好
5.敏捷開發(fā)笨篷,相比較原生,有很多插件支持瓣履,一行調(diào)用代碼即可實現(xiàn)功能
6.類型安全率翅,Dart是類型安全的語言,支持靜態(tài)類型檢測袖迎,編譯前發(fā)現(xiàn)一些類型的錯誤
Flutter缺點:
1.底層開發(fā)支持相對不夠完善(本地文件IO操作冕臭、狀態(tài)欄的監(jiān)聽修改、相機相冊等)
2.Native相比Flutter性能更優(yōu)燕锥、CPU占用較多
3.Flutter包比原生包內(nèi)存更大
4.支持的第三方工具辜贵,第三方框架相對較少
5.不能獨立運行,更多內(nèi)部實現(xiàn)依賴原生归形,上手需要了解基本原生
6.widget類型較多念颈,目前已知200+,全部了解需要耗費大量時間
7.提倡控件的組合而不是繼承连霉,無法重寫View實現(xiàn)自己需要的自定義效果,只能通過多個View組合實現(xiàn)
8.部分解決方案依賴梯子嗡靡,國內(nèi)開發(fā)資源相對比國外少
9.Dart語言是嵌套式語言跺撼,多層嵌套會代碼結(jié)構(gòu)比較凌亂
10.有一些優(yōu)化缺陷,類似于在input輸入框中選中文字時讨彼,Android剪切粘貼菜單可能會像素溢出的問題歉井,iOS可能存在點擊其他input 會把之前input的內(nèi)容自動帶下來
4)目前flutter的最新情況。
目前最新flutter版本1.12.13哈误。Dart語言版本2.7.0
Samba集成版本1.7.8
SaWaKaMi集成版本1.9.1
Flutter從1.9版本開始穩(wěn)定支持flutter on web哩至、支持 macOS Catalina 和 iOS 13躏嚎、引入全新的 Material 風(fēng)格小部件、新增國際化支持24中國際語言菩貌、默認開發(fā)語言Swift卢佣、Kotlin,flutter on web暫時不穩(wěn)定箭阶,不建議直接使用
5)flutter項目常用第三方(推薦使用:官方插件虚茶,相對穩(wěn)定插件)
# WebView: flutter_webview_plugin
# 提示框: fluttertoast
# 本地存儲: shared_preferences#
# 獲取沙盒路徑:path_provider
# 生成二維碼: qr_flutter
# 網(wǎng)絡(luò)請求: dio http
# 相機相冊: image_picker
# 相冊多選: multi_image_picker
# 獲取設(shè)備信息: device_info
# 本地數(shù)據(jù)庫: objectdb
# 獲取App信息: package_info
# 判斷網(wǎng)絡(luò)狀態(tài): connectivity
# 保存圖片到本地: image_gallery_saver
# 權(quán)限請求: permission_handler
# Google身份驗證:firebase_auth: ^0.11.1+8
# 推送: firebase_messaging
# 分享: esys_flutter_share
# 視頻播放器: video_player
參考文獻:
flutter中國官方:https://flutterchina.club/
flutter中文網(wǎng):https://book.flutterchina.club/
flutter官方文檔:https://flutterchina.club/get-started/install/
flutter插件:https://pub.dev/
github地址:https://github.com/flutter/flutter
flutter更換語言:https://juejin.im/post/5de720676fb9a0160823573a
flutter打包iOS:http://www.reibang.com/p/f88c57403ba4
Flutter打包Android:https://flutterchina.club/android-release/