減緩 PageView 動畫加上 Table 造成的卡頓 — 解決篇

閱讀時間約 7 分鐘


raw-image

在上一篇文章的最後,我們發現問題點了,這篇文章中就來聊聊如何簡單又有效的解決 PageView 動畫加上複雜畫面造成的卡頓問題。

解決問題

為了更準確解決 PlayerInfoGameLogView 被頻繁建立的問題,也為了讓讀者們可以一起同樂,我們先在 Dartpad 準備有問題的範例程式 [連結]。在範例程式中,當我們滑動 PageView 時,PageView 頻繁的呼叫 itemBuilder 來更新畫面,讓 PageView 中的每一個 Item 可以隨著滑動改變大小,但是這麼做也使得 GameLogView 頻繁的被 Rebuild,即便每次傳進去的 gameLogs 是一模一樣的。

class MyApp extends StatelessWidget {
const MyApp({super.key, required this.players});

final List<Player> players;

@override
Widget build(BuildContext context) {
return Center(
child: PlayerPageView(
itemCount: players.length,
itemBuilder: (BuildContext context, int index) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
alignment: Alignment.center,
child: GameLogView(gameLogs: players[index].gameLogs),
);
},
),
);
}
}

讓我們看一下這段範例程式碼的效能分析,與正式程式碼的效能差不多,在 UI phase 階段所花的時間都偏高。

raw-image

只在資料變化時 Rebuild

最終,我希望 Flutter 不要總是 Rebuild GameLogView,而達到這個目標,我們可以把 gameLogs 放在 Provider 中,然後需要使用 gameLogs 的地方呼叫 context.watch 去存取並監聽 gameLogs,這樣一來就能讓 Widget 不需要一層一層傳遞 gameLogs,最外層的 GameLogView 也就可以加上 const 修飾詞,讓 Flutter 知道這是一個固定的 Widget,避免 Flutter 總是 Rebuild 它。

class MyApp extends StatelessWidget {
const MyApp({super.key, required this.players});

final List<Player> players;

@override
Widget build(BuildContext context) {
return Center(
child: PlayerPageView(
itemCount: players.length,
itemBuilder: (BuildContext context, int index) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
alignment: Alignment.center,
child: Provider<List<GameLog>>.value(
value: players[index].gameLogs,
child: const GameLogView(),
),
);
},
),
);
}
}

class _GameLogTable extends StatelessWidget {
const _GameLogTable();

@override
Widget build(BuildContext context) {
var gameLogs = context.watch<List<GameLog>>();
return Table(
...
);
}
}

當我們調整好程式碼之後,PageView 執行 setState 之後,GameLog 就不會 Rebuild,而是會重複使用已經建好的 Widget,有興趣的觀眾也可以在 GameLogView 的 build 方法印 log 觀察看看。最後讓我們看一下問題解決之後的範例程式碼的效能分析,在少數幾個 Frame 中,UI phase 花的時間是超時的,剩下大部分時間都是在標準以內。

raw-image

如果實際上運行解決後的範例程式之後 [連結],可以發現滑動的過程中比較順了,但還是有一些時刻會感受到卡頓。

尚未解決的卡頓

當我們使用 Provider 提升效能之後,我們發現第一次 Build GameLogView 的時候還是會超時,使得下一個 GameLog 顯示時,畫面會出現明顯卡頓。此時我們暫時沒有比較好的辦法可以解決問題,因為 Table 目前沒有提供 builder 的方法,當渲染比較大的 Table 時,所有欄位都會在第一時間被建立,無論他有沒有出現在畫面上,使得 UI phase 的時間還是會比較長,也就是我們上面效能分析所顯示的狀況。

應用在產品程式碼中

當我們把這個做法放回產品程式碼中,並再次檢測 App 效能,可以發現超時的 UI phase 大幅減少,更多的是超時的 Raster phase,這也表示我們方法有效這個畫面的效能。

raw-image

結論

過早優化是萬惡之源,當我們發現效能問題時,透過釐清與分析問題,找到並解決瓶頸,在能花最小的力氣獲得最大的增益。如果我們再開發的時候為了使用 const 而寫了很多不必要的程式碼,除了浪費時間之外,也降低程式碼的可讀性,獲得的增益可能微乎其微。

分享各種 Flutter 開發技巧
留言0
查看全部
發表第一個留言支持創作者!
本文探討如何在 Flutter 中自訂 Tab Bar 特效,提升使用者介面互動性。從基本的 Row 佈局開始,我們逐步實現選中 Tab 動態變化的需求。最後,使用 CustomMultiChildLayout 與 AnimatedSize 實現一個符合設計需求的 Tab Bar,提升整體使用體驗。
本文探討如何在 Flutter 中自訂 Tab Bar 特效,提升使用者介面互動性。從基本的 Row 佈局開始,我們逐步實現選中 Tab 動態變化的需求。最後,使用 CustomMultiChildLayout 與 AnimatedSize 實現一個符合設計需求的 Tab Bar,提升整體使用體驗。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
易用性的第一定律就是「別讓我思考」。瞭解人類的思考系統,強化第一系統的網站設計方法,包括善用使用者過去的網頁觀看經驗,強化互動元件的預設用途提示,建立內容的視覺層次,整合選項,預設同意以及製作圖像的範例教學。提高網站的易用性,強化使用者對網站的體驗。
Thumbnail
這篇文章教你如何製作側邊欄,包括準備工作、HTML和CSS的部分,還有一些互動效果。文章涵蓋了連結、圖片、超連結、大小、顏色、排版、flex和滑鼠互動等內容。
Thumbnail
極簡網頁設計依然是主流,以其乾淨、有序的視覺效果和強調內容的功能性,幫助用戶集中注意力於重要信息。
Thumbnail
Windows Clarity 是一種網站分析產品,讓網站設計師、開發人員可藉由它,更容易觀察用戶在網站的操作行為,協助更快速的優化網站,加強網頁的轉換效果與商業目標的達成。本文將介紹 Windows Clarity 應該如何使用,強化分析能力與優化網站效益。
Thumbnail
在當今的IG時代,多媒體內容已成為網頁設計不可或缺的一部分,它不僅豐富了用戶的互動體驗,還能顯著提升網站的吸引力和溝通效率。本文將探討多媒體內容對用戶體驗(UX)的影響、SEO最佳實踐與多媒體的整合方法,並提供成功整合多媒體的網站案例。
Thumbnail
響應式網頁設計(Responsive Web Design, RWD)已成為現代網站開發不可或缺的一部分。響應式設計不僅能夠確保網站在各種設備上都能提供良好的用戶體驗,而且對於搜索引擎優化(SEO)也有著重要的影響。本文將探討響應式設計的最新技術、其對SEO的優勢以及一些成功的實際案例。
Thumbnail
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
圖片大小 漂亮的圖片讓人賞心悅目,對網站美化也是一大加分項,但若是為了呈現自家商品或吸引人的圖片搭配文字,而塞進過量的圖片,導致網站本身太重跑得太慢,容易使客人失去耐性。|SEO工具 隨著時代的進步網路速度也與時俱進,但若網站本身太重,就算網路狀況再良好也無法馬上將網站載好,根據統計,大多數人的
透過Responsive網頁設計技術,能夠讓您的網站在不同裝置上顯示良好。此外,我們的服務還包括多種語言介面支援、內容管理系統、無限頁數網站、無限網上影片、無限網上表格以及專業的Banner設計。
Thumbnail
UI(使用者介面)設計對於用戶體驗至關重要。一個好的UI設計可以讓用戶輕鬆地與應用互動,而糟糕的設計則可能導致用戶感到困惑甚至沮喪。本文將探討五個UI 設計在App開發中常見的錯誤,並提供相應的解決策略。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
易用性的第一定律就是「別讓我思考」。瞭解人類的思考系統,強化第一系統的網站設計方法,包括善用使用者過去的網頁觀看經驗,強化互動元件的預設用途提示,建立內容的視覺層次,整合選項,預設同意以及製作圖像的範例教學。提高網站的易用性,強化使用者對網站的體驗。
Thumbnail
這篇文章教你如何製作側邊欄,包括準備工作、HTML和CSS的部分,還有一些互動效果。文章涵蓋了連結、圖片、超連結、大小、顏色、排版、flex和滑鼠互動等內容。
Thumbnail
極簡網頁設計依然是主流,以其乾淨、有序的視覺效果和強調內容的功能性,幫助用戶集中注意力於重要信息。
Thumbnail
Windows Clarity 是一種網站分析產品,讓網站設計師、開發人員可藉由它,更容易觀察用戶在網站的操作行為,協助更快速的優化網站,加強網頁的轉換效果與商業目標的達成。本文將介紹 Windows Clarity 應該如何使用,強化分析能力與優化網站效益。
Thumbnail
在當今的IG時代,多媒體內容已成為網頁設計不可或缺的一部分,它不僅豐富了用戶的互動體驗,還能顯著提升網站的吸引力和溝通效率。本文將探討多媒體內容對用戶體驗(UX)的影響、SEO最佳實踐與多媒體的整合方法,並提供成功整合多媒體的網站案例。
Thumbnail
響應式網頁設計(Responsive Web Design, RWD)已成為現代網站開發不可或缺的一部分。響應式設計不僅能夠確保網站在各種設備上都能提供良好的用戶體驗,而且對於搜索引擎優化(SEO)也有著重要的影響。本文將探討響應式設計的最新技術、其對SEO的優勢以及一些成功的實際案例。
Thumbnail
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
圖片大小 漂亮的圖片讓人賞心悅目,對網站美化也是一大加分項,但若是為了呈現自家商品或吸引人的圖片搭配文字,而塞進過量的圖片,導致網站本身太重跑得太慢,容易使客人失去耐性。|SEO工具 隨著時代的進步網路速度也與時俱進,但若網站本身太重,就算網路狀況再良好也無法馬上將網站載好,根據統計,大多數人的
透過Responsive網頁設計技術,能夠讓您的網站在不同裝置上顯示良好。此外,我們的服務還包括多種語言介面支援、內容管理系統、無限頁數網站、無限網上影片、無限網上表格以及專業的Banner設計。
Thumbnail
UI(使用者介面)設計對於用戶體驗至關重要。一個好的UI設計可以讓用戶輕鬆地與應用互動,而糟糕的設計則可能導致用戶感到困惑甚至沮喪。本文將探討五個UI 設計在App開發中常見的錯誤,並提供相應的解決策略。