flutter知識點(diǎn)

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)志。

詳情見Dart內(nèi)存機(jī)制

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://

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容