減緩 PageView 動畫加上 Table 造成的卡頓 — 問題篇

更新於 2024/12/18閱讀時間約 4 分鐘


raw-image

最近我們新增了一個顯示球員詳細資訊的頁面,當我們完成第一版程式碼,開始調整細節時,我們發現了畫面滑動似乎不太順暢。

raw-image

每個球員訊息彈跳視窗是靜態,外層使用了 PageView 加上一些的特效,使得畫面在滑動時會頻繁的 setState,造成了整個彈跳視窗卡頓,使用者體驗不佳,就像遊戲效能不好一樣會掉幀,嚴重一點可能會讓人不舒服。今天就來分享如何快速有效的解決這個問題吧。

開啟 Profile 模式

首先,想要有效的解決問題,釐清問題是第一步。為了要了解我們畫面卡頓的問題根源,我們使用 Flutter 提供的 DevTools 並在實體手機上運行 Profile 模式。Profile 模式是讓 App 運行效能接近 Release 模式同時又能搜集運行資訊的一種模式。當我們執行程式並開起 DevTools 之後,可以觀察到 App 運行時,每一個 Frame 效能到底如何。

Dev tools

在 Dev Tools 面板中,可以發現在大多數 Frame 中,UI phase 與 Raster phase 都花了很多時間,這通常表示問題可能有很多個,但是我們今天先研究 UI phase 花過久時間的問題吧。

raw-image

在面板中清楚看到了 Build 和 Layout 畫面的操作各花了多久時間,我們可以初步了解問題可能發生在哪邊,但是只有這些資訊,顯然不夠我們解決問題。

啟用 Track Widget Builds

為了更深入了解問題出在哪邊,我們可以在 Dev Tools 的右上角打開 Enhance Tracing,並且勾選 Track Widget Builds,這個功能可以提供更詳細的時間,提供每一個 Widget 在每一個 Frame 中所花費的時間。

raw-image

觀察 Widget Build 火焰圖

當我們啟用 Track Widget Build 之後,我們再繼續操作一下手機,讓手機繼續執行幾個 Frame,我們就能這些新產生的報告找到 Timeline Events,在 Timeline Events 中, DevTools 顯示在這個 Frame 中 Build Widget 所花費的時間,能更直觀地看到時間到底花在哪個 Widget 上了。

分析問題

從火焰圖中我們可以得知,PlayerInfoGameLogView 花費的時間佔了很大一部份比例,而且每一個 Frame 都是這種狀況。這表示畫面滑動的時候,每一個 Frame 都在重新建立這個 Widget。

雖然我們滑動需要頻繁的 setState,畫面其實是不變的,數值並不會在滑動過程中有變化,應該要可以使用重複使用之前已經 Build 好的 Widget,但是顯然 Flutter 不這麼認為,而是辛苦的每一個 Frame 都Rebuild 新的 Widget。

小結

在分析問題中,我們發現問題的癥結點,當我們滑動 PageView 時,Flutter 會重複且完整的建立每一個 Page,花費許多時間去 Build Widget,在下一篇文章中,我們會利用 dartpad 寫一個有問題的範例,並在這個範例中探討解決方案,有興趣的朋友可以先嘗試看看。

分享各種軟體開發技巧與心得
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
本文介紹如何在 Flutter 應用中實現 Light 模式與 Dark 模式的切換,並通過使用內建的 Theme 和狀態管理套件來增強使用者體驗。我們探討瞭如何自定義 ThemeExtension 和使用 lerp 方法實現平滑的顏色轉換,並展示了獨特的切換動畫效果,讓應用更具吸引力。
本文探討如何使用 Flutter 的 Widget 測試來驗證應用程式的 Routing 功能,確保重構後仍然正常運作。我們將通過具體的範例,從設定 MockNavigatorObserver 到驗證 Routing 參數,提供清晰步驟與建議,以提高測試的可讀性和效能,是開發人員必備的測試技巧。
這篇文章介紹如何在多臺 MacBook 上同步開發工具與設定,以提高開發效率。文章重點在於如何同步 IntelliJ、IdeaVim 和 Alfred 配置,並解決因設定不同而影響開發效率的問題。透過簡單的步驟,開發者可以在不同設備上無縫運作,持續專注於開發工作,而不必因為熱鍵或工具失效而浪費時間。
本文探討在客戶端程式開發中,如何有效處理根據後端不同資料型態變化的畫面顯示。透過列舉 Shortgun Surgery 問題及其對代碼維護的影響,分析各種設計模式,包括轉接器模式和策略模式,來改善資料的處理方式。最終提出根據具體情況選擇合適解法的重要性,以確保開發效率與代碼可維護性。
本文介紹如何利用 Flutter 框架和 Flame 遊戲引擎製作一個簡單的點擊小遊戲。從導入 Flame 套件,到使用 GameWidget,接著為遊戲中的騎士角色添加動作,最後實現點擊計數功能,這篇文章一步步帶你體驗遊戲開發的樂趣,讓你掌握基本的遊戲設計和邏輯編程技巧。
本文分享瞭如何使用 Notion Web Clipper 來儲存文章,並結合 Habit Stacking 技術克服維持新習慣的困難。同時探討如何使用 Flutter Web 和 Notion API 開發自用的 Chrome 擴展功能,提升個人資訊管理和閱讀效率。
本文介紹如何在 Flutter 應用中實現 Light 模式與 Dark 模式的切換,並通過使用內建的 Theme 和狀態管理套件來增強使用者體驗。我們探討瞭如何自定義 ThemeExtension 和使用 lerp 方法實現平滑的顏色轉換,並展示了獨特的切換動畫效果,讓應用更具吸引力。
本文探討如何使用 Flutter 的 Widget 測試來驗證應用程式的 Routing 功能,確保重構後仍然正常運作。我們將通過具體的範例,從設定 MockNavigatorObserver 到驗證 Routing 參數,提供清晰步驟與建議,以提高測試的可讀性和效能,是開發人員必備的測試技巧。
這篇文章介紹如何在多臺 MacBook 上同步開發工具與設定,以提高開發效率。文章重點在於如何同步 IntelliJ、IdeaVim 和 Alfred 配置,並解決因設定不同而影響開發效率的問題。透過簡單的步驟,開發者可以在不同設備上無縫運作,持續專注於開發工作,而不必因為熱鍵或工具失效而浪費時間。
本文探討在客戶端程式開發中,如何有效處理根據後端不同資料型態變化的畫面顯示。透過列舉 Shortgun Surgery 問題及其對代碼維護的影響,分析各種設計模式,包括轉接器模式和策略模式,來改善資料的處理方式。最終提出根據具體情況選擇合適解法的重要性,以確保開發效率與代碼可維護性。
本文介紹如何利用 Flutter 框架和 Flame 遊戲引擎製作一個簡單的點擊小遊戲。從導入 Flame 套件,到使用 GameWidget,接著為遊戲中的騎士角色添加動作,最後實現點擊計數功能,這篇文章一步步帶你體驗遊戲開發的樂趣,讓你掌握基本的遊戲設計和邏輯編程技巧。
本文分享瞭如何使用 Notion Web Clipper 來儲存文章,並結合 Habit Stacking 技術克服維持新習慣的困難。同時探討如何使用 Flutter Web 和 Notion API 開發自用的 Chrome 擴展功能,提升個人資訊管理和閱讀效率。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
這次的side bar不一樣了,上一次我好像做的太簡單了,所以完讀率只有14%,我好難過啊(;´д`)ゞ,所以我這準備的內容有多一點。 這次的目標 按鈕的排版 按鈕滑過去會有顏色變化 Side bar能夠展開 箭頭能夠移動至被選擇的物件上 宣告 這次我創了兩個檔案 SideBa
Thumbnail
這篇文章教你如何製作側邊欄,包括準備工作、HTML和CSS的部分,還有一些互動效果。文章涵蓋了連結、圖片、超連結、大小、顏色、排版、flex和滑鼠互動等內容。
Thumbnail
極簡網頁設計依然是主流,以其乾淨、有序的視覺效果和強調內容的功能性,幫助用戶集中注意力於重要信息。
Thumbnail
Windows Clarity 是一種網站分析產品,讓網站設計師、開發人員可藉由它,更容易觀察用戶在網站的操作行為,協助更快速的優化網站,加強網頁的轉換效果與商業目標的達成。本文將介紹 Windows Clarity 應該如何使用,強化分析能力與優化網站效益。
Thumbnail
在當今的IG時代,多媒體內容已成為網頁設計不可或缺的一部分,它不僅豐富了用戶的互動體驗,還能顯著提升網站的吸引力和溝通效率。本文將探討多媒體內容對用戶體驗(UX)的影響、SEO最佳實踐與多媒體的整合方法,並提供成功整合多媒體的網站案例。
Thumbnail
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
圖片大小 漂亮的圖片讓人賞心悅目,對網站美化也是一大加分項,但若是為了呈現自家商品或吸引人的圖片搭配文字,而塞進過量的圖片,導致網站本身太重跑得太慢,容易使客人失去耐性。|SEO工具 隨著時代的進步網路速度也與時俱進,但若網站本身太重,就算網路狀況再良好也無法馬上將網站載好,根據統計,大多數人的
Thumbnail
在當代數據驅動的設計領域裡,了解用戶如何與你的網站互動是至關重要的。Microsoft Clarity是一款功能強大的用戶分析工具,它提供的直觀見解可以幫助開發者和設計師深入掌握用戶行為,從而優化用戶體驗和提升網站性能。
Thumbnail
UI(使用者介面)設計對於用戶體驗至關重要。一個好的UI設計可以讓用戶輕鬆地與應用互動,而糟糕的設計則可能導致用戶感到困惑甚至沮喪。本文將探討五個UI 設計在App開發中常見的錯誤,並提供相應的解決策略。
Thumbnail
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
這次的side bar不一樣了,上一次我好像做的太簡單了,所以完讀率只有14%,我好難過啊(;´д`)ゞ,所以我這準備的內容有多一點。 這次的目標 按鈕的排版 按鈕滑過去會有顏色變化 Side bar能夠展開 箭頭能夠移動至被選擇的物件上 宣告 這次我創了兩個檔案 SideBa
Thumbnail
這篇文章教你如何製作側邊欄,包括準備工作、HTML和CSS的部分,還有一些互動效果。文章涵蓋了連結、圖片、超連結、大小、顏色、排版、flex和滑鼠互動等內容。
Thumbnail
極簡網頁設計依然是主流,以其乾淨、有序的視覺效果和強調內容的功能性,幫助用戶集中注意力於重要信息。
Thumbnail
Windows Clarity 是一種網站分析產品,讓網站設計師、開發人員可藉由它,更容易觀察用戶在網站的操作行為,協助更快速的優化網站,加強網頁的轉換效果與商業目標的達成。本文將介紹 Windows Clarity 應該如何使用,強化分析能力與優化網站效益。
Thumbnail
在當今的IG時代,多媒體內容已成為網頁設計不可或缺的一部分,它不僅豐富了用戶的互動體驗,還能顯著提升網站的吸引力和溝通效率。本文將探討多媒體內容對用戶體驗(UX)的影響、SEO最佳實踐與多媒體的整合方法,並提供成功整合多媒體的網站案例。
Thumbnail
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
圖片大小 漂亮的圖片讓人賞心悅目,對網站美化也是一大加分項,但若是為了呈現自家商品或吸引人的圖片搭配文字,而塞進過量的圖片,導致網站本身太重跑得太慢,容易使客人失去耐性。|SEO工具 隨著時代的進步網路速度也與時俱進,但若網站本身太重,就算網路狀況再良好也無法馬上將網站載好,根據統計,大多數人的
Thumbnail
在當代數據驅動的設計領域裡,了解用戶如何與你的網站互動是至關重要的。Microsoft Clarity是一款功能強大的用戶分析工具,它提供的直觀見解可以幫助開發者和設計師深入掌握用戶行為,從而優化用戶體驗和提升網站性能。
Thumbnail
UI(使用者介面)設計對於用戶體驗至關重要。一個好的UI設計可以讓用戶輕鬆地與應用互動,而糟糕的設計則可能導致用戶感到困惑甚至沮喪。本文將探討五個UI 設計在App開發中常見的錯誤,並提供相應的解決策略。
Thumbnail
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個