0.打包命令
flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
1.軟鍵盤遮擋輸入框
Scaffold(
????resizeToAvoidBottomInset:false)
2.數(shù)據(jù)存儲方式
1.文件
2.插件shared_preferences
3.數(shù)據(jù)庫
? ? 1.google離線同步 ????firebase_database: ^10.2.2? ? ? ? 國內(nèi)無法使用。
? ? 2.sqflite? ? sq語句太繁瑣了
? ? 3.?Isar? 類似greendao
3.與原生通信方式
1.BasicMessageChannel
2.MethodChannel
3.EventChannel
4.ListView報Vertical viewport was given unbounded height錯誤解決方法
錯誤解析:寬度或高度溢出,導(dǎo)致Widget不顯示
解決方法:給ListView的shrinkWrap屬性設(shè)置為true,即父視圖的大小跟隨子組件的內(nèi)容大小
return Column(
?????children: <Widget>[
?????????ListView.builder(
?????????????itemCount: sourceDataComments.length,
?????????????itemBuilder: _buildCommentsRow,
?????????????shrinkWrap: true, ), ], );?
5.flutter生命周期
6.Flutter不具備反射,如果要使用反射,你應(yīng)該如何使用?
使用Mirror
ClassMirror:Dart 類的反射類型
InstanceMirror:Dart 實(shí)例的反射類型
ClosureMirror: 閉包的反射類型
DeclarationMirror:類屬性的反射類型
IsolateMirror:Isolate 的反射類型
MethodMirror:Dart 方法(包括函數(shù)、構(gòu)造函數(shù)、getter/setter 函數(shù))的反射類型
7.熱更新
8.如何讓Flutter 編譯出來的APP的包大小盡可能的變小?
? ??1. 移除無用代碼和無用資源,壓縮圖片, 安卓里拆 App Bundle,
? ??2. Dart 編譯產(chǎn)物做針對性優(yōu)化
????????動態(tài)下發(fā):剝離 Data 段及一切非必要產(chǎn)物,打包后動態(tài)下發(fā)。
????????內(nèi)置壓縮:以二進(jìn)制形態(tài)內(nèi)置動態(tài)下發(fā)包。
? ??3. Flutter 引擎編譯產(chǎn)物優(yōu)化
????????主要優(yōu)化思路有升級 Bulild Tools 統(tǒng)一雙編譯參數(shù),
????????定制化編譯裁剪引擎內(nèi)部部分特定無用功能。
? ??4. 機(jī)器碼指令優(yōu)化
????????精簡機(jī)器碼指令,Google 也回復(fù)稱未來 Dart 與 OC 基本持平。
? flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
9.flutter跨平臺原理
10.Flutter混合開發(fā)——FlutterBoost
11.Flutter渲染優(yōu)化
?控制 build 方法耗時,將 Widget 拆小,避免直接返回一個巨大的 Widget,這樣 Widget 會享有更細(xì)粒度的重建和復(fù)用;
?盡量不要為 Widget 設(shè)置半透明效果,而是考慮用圖片的形式代替,這樣被遮擋的 Widget 部分區(qū)域就不需要繪制了
?對列表采用懶加載而不是直接一次性創(chuàng)建所有的子 Widget,這樣視圖的初始化時間就減少了
12.Flutter啟動優(yōu)化
? ??1. 讓 Flutter 中重建組件的個數(shù)盡量少
在實(shí)際開發(fā)過程中,如果將整個頁面寫在一個單獨(dú)的 StatefulWidget 中,那么每次狀態(tài)更新時都會導(dǎo)致很多不必要的 UI 重建。因此, 我們要學(xué)會拆解組件,使用良好設(shè)計模式和狀態(tài)管理方案,當(dāng)需要更新狀態(tài)時將影響范圍降到最小。
? ??2. 構(gòu)建組件時使用 const 關(guān)鍵詞,可以抑制 widget 的重建
合理利用 const 關(guān)鍵詞,可以在很大程度上優(yōu)化應(yīng)用的性能
使用 const 也需要注意如下幾點(diǎn):
當(dāng) const 修飾類的構(gòu)造函數(shù)時,它要求該類的所有成員都必須是final的。
const 變量只能在定義的時候初始化。
? ??3. Flutter實(shí)現(xiàn)的一些效果背后可能會使用 saveLayer() 這個代價很大的方法
如下這幾個組件,底層都會觸發(fā) saveLayer() 的調(diào)用,同樣也都會導(dǎo)致性能的損耗:
ShaderMask
ColorFilter
Chip,當(dāng) disabledColorAlpha != 0xff 的時候,會調(diào)用 saveLayer()。
Text,如果有 overflowShader,可能調(diào)用 saveLayer() ,
? ??4. 官方也給了我們一些非常需要注意的優(yōu)化點(diǎn):
由于 Opacity 會使用屏幕外緩沖區(qū)直接使目標(biāo)組件中不透明,因此能不用 Opacity Widget,就盡量不要用。有關(guān)將透明度直接應(yīng)用于圖像的示例,請參見 Transparent image,比使用 Opacity widget 更快,性能更好。
要在圖像中實(shí)現(xiàn)淡入淡出,請考慮使用 FadeInImage 小部件,該小部件使用 GPU 的片段著色器應(yīng)用漸變不透明度。
很多場景下,我們確實(shí)沒必要直接使用 Opacity 改變透明度,如要作用于一個圖片的時候可以直接使用透明的圖片,或者直接使用 Container:Container(color: Color.fromRGBO(255, 0, 0, 0.5))
Clipping 不會調(diào)用 saveLayer()(除非明確使用 Clip.antiAliasWithSaveLayer),因此這些操作沒有 Opacity 那么耗時,但仍然很耗時,所以請謹(jǐn)慎使用。
? ??5. 管理著色器編譯垃圾
有時候,應(yīng)用中的動畫首次運(yùn)行時會看起來非常卡頓,但是運(yùn)行多次之后便可以正常運(yùn)行,這可能就是由于著色器編譯混亂導(dǎo)致的。
在不同平臺上,可以執(zhí)行以下命令,使用 SkSL 預(yù)熱功能構(gòu)建應(yīng)用程序:
安卓
flutter build apk — bundle-sksl-path flutter_01.sksl.json
IOS
flutter build ios --bundle-sksl-path flutter_01.sksl.json
13.談?wù)凢lutter的內(nèi)存回收管理機(jī)制,以及你平時是怎么處理內(nèi)存的?內(nèi)存泄漏和內(nèi)存溢出你是怎么解決的?
Dart的垃圾回收是分代的:年輕代和老年代
GC與Flutter engine建立聯(lián)系,當(dāng)engine檢測到應(yīng)用程序處于空閑狀態(tài)且沒有用戶交互時,它會發(fā)出通知。這樣就使得GC有了收集的窗口從而不影響性能。
年輕代
這個階段旨在清除壽命較短的短暫對象,例如stateless widgets。雖然它是阻塞的,但它比老年代mark-sweep快得多,并且當(dāng)與調(diào)度結(jié)合使用時,幾乎不會影響程序的運(yùn)行。
要確定哪些對象是否可被回收,收集器將以root對象(例如堆棧變量)開始,并檢查它們引用的對象。然后把引用的對象移動到另一半空間。在那里它檢查這些移動的對象指向的內(nèi)容,并移動這些引用的對象。如此反復(fù),直到移動所有活動對象到另一半空間。始終沒有被引用的對象將被回收。
老年代(并行標(biāo)記和并發(fā)掃描)
當(dāng)對象經(jīng)歷過一定次數(shù)的GC仍然存在,或者其生命周期較長(個人猜測類似于element和RenderObject這種需要多次復(fù)用,可變且創(chuàng)建比較耗費(fèi)性能),將其放入老年代區(qū)域中。老年代采用標(biāo)記整理的方法來回收對象。
這種GC技術(shù)有兩個階段:首先遍歷對象圖,并標(biāo)記仍在使用的對象。在第二階段期間,掃描整個存儲器,并且回收未標(biāo)記的任何對象。然后清除所有標(biāo)志。
14.實(shí)體類分類
DO(Data Object):此對象與數(shù)據(jù)庫表結(jié)構(gòu)一一對應(yīng),通過 DAO層向上傳輸數(shù)據(jù)源對象。
DTO(Data Transfer Object):數(shù)據(jù)傳輸對象,Service 或Manager 向外傳輸?shù)膶ο蟆?/p>
BO(Business Object):業(yè)務(wù)對象,可以由Service層輸出的封裝業(yè)務(wù)邏輯的對象。
Query:數(shù)據(jù)查詢對象,各層接收上層的查詢請求。注意超過2 個參數(shù)的查詢封裝,禁止使用 Map 類 來傳輸。
VO(View Object):顯示層對象,通常是 Web 向模板渲染引擎層傳輸?shù)膶ο蟆?/p>
15.啟動頁白屏廣告-插件
flutter_native_splash
16.Flutter事件隊列
思路:
? ? 1.定義一個任務(wù)隊列tasklist【先進(jìn)先出】
? ? 2.提供添加任務(wù)方法
? ? 3.取第一個任務(wù)執(zhí)行
? ? 4.執(zhí)行完后從tasklist移除
? ? 5.遞歸獲取第一個任務(wù)并執(zhí)行任務(wù)
? ? 6.直到tasklist為null停止隊列任務(wù)。
17.跳轉(zhuǎn)到其他應(yīng)用
QQ: mqq://
微信: weixin://
京東: openapp.jdmoble:// 測試了,好像不行
淘寶: taobao://
美團(tuán): imeituan://
點(diǎn)評: dianping://
1號店: wccbyihaodian://
支付寶: alipay://
微博: sinaweibo://
騰訊微博: TencentWeibo://
weico微博: weico://
知乎: zhihu://
豆瓣fm: doubanradio://
網(wǎng)易公開課: ntesopen://
Chrome: googlechrome://
QQ瀏覽器: mqqbrowser://
uc瀏覽器: ucbrowser://
搜狗瀏覽器: SogouMSE://
百度地圖: baidumap:// bdmap://
優(yōu)酷: youku://
人人: renren://
我查查: wcc://
有道詞典: yddictproapp://
微盤: sinavdisk://
名片全能王: camcard://