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

更新於 2024/12/18閱讀時間約 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 而寫了很多不必要的程式碼,除了浪費時間之外,也降低程式碼的可讀性,獲得的增益可能微乎其微。

分享各種軟體開發技巧與心得
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
本文介紹如何解決 Flutter 應用程式中 PageView 的卡頓問題。透過使用 DevTools 的 Profile 模式及啟用 Track Widget Builds 功能,分析了 UI phase 的效能瓶頸,識別出 PlayerInfoGameLogView 重新建構的高成本。
本文介紹如何在 Flutter 應用中實現 Light 模式與 Dark 模式的切換,並通過使用內建的 Theme 和狀態管理套件來增強使用者體驗。我們探討瞭如何自定義 ThemeExtension 和使用 lerp 方法實現平滑的顏色轉換,並展示了獨特的切換動畫效果,讓應用更具吸引力。
本文探討如何使用 Flutter 的 Widget 測試來驗證應用程式的 Routing 功能,確保重構後仍然正常運作。我們將通過具體的範例,從設定 MockNavigatorObserver 到驗證 Routing 參數,提供清晰步驟與建議,以提高測試的可讀性和效能,是開發人員必備的測試技巧。
這篇文章介紹如何在多臺 MacBook 上同步開發工具與設定,以提高開發效率。文章重點在於如何同步 IntelliJ、IdeaVim 和 Alfred 配置,並解決因設定不同而影響開發效率的問題。透過簡單的步驟,開發者可以在不同設備上無縫運作,持續專注於開發工作,而不必因為熱鍵或工具失效而浪費時間。
本文探討在客戶端程式開發中,如何有效處理根據後端不同資料型態變化的畫面顯示。透過列舉 Shortgun Surgery 問題及其對代碼維護的影響,分析各種設計模式,包括轉接器模式和策略模式,來改善資料的處理方式。最終提出根據具體情況選擇合適解法的重要性,以確保開發效率與代碼可維護性。
本文介紹如何利用 Flutter 框架和 Flame 遊戲引擎製作一個簡單的點擊小遊戲。從導入 Flame 套件,到使用 GameWidget,接著為遊戲中的騎士角色添加動作,最後實現點擊計數功能,這篇文章一步步帶你體驗遊戲開發的樂趣,讓你掌握基本的遊戲設計和邏輯編程技巧。
本文介紹如何解決 Flutter 應用程式中 PageView 的卡頓問題。透過使用 DevTools 的 Profile 模式及啟用 Track Widget Builds 功能,分析了 UI phase 的效能瓶頸,識別出 PlayerInfoGameLogView 重新建構的高成本。
本文介紹如何在 Flutter 應用中實現 Light 模式與 Dark 模式的切換,並通過使用內建的 Theme 和狀態管理套件來增強使用者體驗。我們探討瞭如何自定義 ThemeExtension 和使用 lerp 方法實現平滑的顏色轉換,並展示了獨特的切換動畫效果,讓應用更具吸引力。
本文探討如何使用 Flutter 的 Widget 測試來驗證應用程式的 Routing 功能,確保重構後仍然正常運作。我們將通過具體的範例,從設定 MockNavigatorObserver 到驗證 Routing 參數,提供清晰步驟與建議,以提高測試的可讀性和效能,是開發人員必備的測試技巧。
這篇文章介紹如何在多臺 MacBook 上同步開發工具與設定,以提高開發效率。文章重點在於如何同步 IntelliJ、IdeaVim 和 Alfred 配置,並解決因設定不同而影響開發效率的問題。透過簡單的步驟,開發者可以在不同設備上無縫運作,持續專注於開發工作,而不必因為熱鍵或工具失效而浪費時間。
本文探討在客戶端程式開發中,如何有效處理根據後端不同資料型態變化的畫面顯示。透過列舉 Shortgun Surgery 問題及其對代碼維護的影響,分析各種設計模式,包括轉接器模式和策略模式,來改善資料的處理方式。最終提出根據具體情況選擇合適解法的重要性,以確保開發效率與代碼可維護性。
本文介紹如何利用 Flutter 框架和 Flame 遊戲引擎製作一個簡單的點擊小遊戲。從導入 Flame 套件,到使用 GameWidget,接著為遊戲中的騎士角色添加動作,最後實現點擊計數功能,這篇文章一步步帶你體驗遊戲開發的樂趣,讓你掌握基本的遊戲設計和邏輯編程技巧。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
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
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
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開發中常見的錯誤,並提供相應的解決策略。