使用ValueKey
、ObjectKey
和UniqueKey
等key,來避免flutter上的Element被unmount,盡量讓Element Tree多做active和update操作,進而避免element再一個frame沒被active,而被卸載。
當UI有明顯卡頓時,我們優先使用key來嘗試解決,如果還是有卡的話,我們可以使用Isolate來優化
大部分的task,只要遇到耗時的task,基本上都使用async做非同步處理即可。而當你的UI開始變卡,耗時的task開始影響到效能時,這時我們則應使用isolate,將它交給獨立的isolate 處理完後,再送回主要的UI thread。
但由於isolate的流程十分複雜,所以Dart 提供了一個比較容易使用的 compute() function,幫開發者包裝自建 isolate 的繁雜流程。我們能使用compute
來交給isolate處理
ex.Link
Future<List<Photo>> fetchPhotos(http.Client client) async {
final response = await client
.get(Uri.parse('https://jsonplaceholder.typicode.com/photos'));
// Use the compute function to run parsePhotos in a separate isolate.
return compute(parsePhotos, response.body);
}
而compute方式雖然已經十分方便,但由於會去建立新isolate並在處理完後刪掉,由於isolate建立時是高成本的,如果頻繁刪建isolate仍會造成效能降低,所以提供了類似pool的方法loadBalancer,有興趣更加瞭解可以看這篇作者Daniel Kao的文章Advanced isolate usage in flutter。
ref:
Flutter Performance
Advanced isolate usage in flutter
Multithreading in Flutter using Dart isolates
Concurrency in Dart
Flutter compute example
LoadBalancer
深入探索Flutter性能优化
探討完了關於一些常見的flutter優化後,接下來我們要繼續完成我們的Todo App,明天見