Part1: 今日目標
1.前言
2.內容
3.提問
Part2: 今日內容
1.前言
今天將延續昨天內容,將User interface剩下的兩個Section簡介完畢,並著手開始Beyond UI章節的說明。
2.內容
包含以下內容:
- 主題管理(Theme Management): 此部分提供了工具和方法,讓開發者能夠管理應用程式的主題,例如顏色和字型選擇。
- 響應式設計(Responsive Design): 提供了使應用程式能夠響應不同螢幕尺寸的工具和方法。
- 內間距(Padding): 允許開發者為小部件添加內間距,以創建更加人性化的用戶界面。
- 媒體查詢(Media Queries): 此部分允許開發者根據給定的數據解析子樹中的媒體查詢,以創建更加適應性的應用程式。
這個分類是一個YouTube播放清單,名為「Flutter Widget of the Week」。這個清單包含了多個短片,每個短片都會介紹一個Flutter的小部件。這些影片提供了關於各種Flutter小部件的實用資訊和使用方法,幫助開發者更加深入地理解如何使用這些小部件來構建應用程式。
Part_4: Beyond UI
Paragraph_1: 狀態管理(State Management)
這部分為開發者介紹在Flutter應用中處理狀態的基礎知識,強調狀態管理的重要性和如何在不同屏幕間共享應用狀態。開發者會學習基礎的狀態管理問題和不同的狀態管理方法。Flutter使用聲明式UI,意味著UI會根據當前狀態來構建,並在狀態變化時重繪。聲明式UI有其學習曲線,但它允許開發者對任何UI狀態有一致且單一的代碼描述。
這部分講解了Flutter應用中應用狀態和瞬態的區別及其管理。應用狀態是需要在多個部分共享和在用戶會話間保持的,如用戶偏好和登錄信息;而瞬態主要存在於單個小部件中,如PageView的當前頁面。選擇合適的狀態管理方法取決於應用的特性和開發者的經驗,並且應該根據需求靈活選擇和調整。
- 簡單應用狀態管理(Simple App State Management)
這個部分使用 provider 套件來介紹簡單的應用狀態管理。這個套件易於理解並且不需要太多的代碼。
- 概念
- ChangeNotifier: 這是一個簡單的類,包含在Flutter SDK中,它向其監聽器提供變更通知。如果某物是 ChangeNotifier,可以訂閱其變更。
- ChangeNotifierProvider: 這是一種封裝應用狀態的方式。對於非常簡單的應用,可以使用單個 ChangeNotifier。在複雜的應用中,將有多個模型,因此會有多個 ChangeNotifiers。
- 範例:
這部分以購物應用為例,說明了Flutter中狀態的管理和小部件的不變性。在這個應用中,有目錄和購物車兩個螢幕,每個 MyListItem 都能夠將自己添加到購物車中。在Flutter的宣告式框架中,狀態應該被放在使用它的小部件之上,因為改變UI需要重建小部件。而小部件本身是不變的,它們不會改變,而是會被替換。當用戶將項目添加到購物車時,由於購物車位於 MyListItem 之上,需要特定的方法來實現狀態的訪問。
- 回調和提供者(Callbacks and Providers)
Flutter有機制讓小部件能夠向其後代提供數據和服務。 舉例: provider 套件就是一個這樣的機制,它與基礎小部件一起工作但使用起來很簡單。
Question: 何謂基礎小部件? Ans:基礎小部件(Low-level widgets)在Flutter中是指提供構建複雜小部件基礎的基本或原始小部件。這些小部件簡單、基礎,能夠組合成更高級的小部件。例如,provider套件中的Provider,它簡單但能與其他小部件一起實現複雜功能,主要用於數據和服務的提供。
這個部分提供了多種狀態管理的選項和方法,並包含了相關的學習資源和文檔。以下是一些主要的狀態管理選項和相關資源:
- Provider
Provider 是一種非常流行的狀態管理方法,它使用 ChangeNotifier 來管理應用狀態。
- Riverpod
介紹: Riverpod 與 Provider 類似,但提供了更多的編譯時安全性,並且不依賴於 Flutter SDK。
Question: 為何有些需依賴於 Flutter SDK,依賴或不依賴的差別為何?
Ans: 是否依賴於 Flutter SDK 取決於套件或小部件的用途和需求。特定於 Flutter 的功能會依賴於 Flutter SDK,而更通用、更靈活的功能可能不會依賴於 Flutter SDK。
- 依賴於 Flutter SDK:
- 特定於 Flutter: 這些套件或小部件是專為 Flutter 應用開發而設計的,並且會使用 Flutter 提供的各種功能和接口。
- 功能集成: 由於它們直接依賴於 Flutter SDK,因此可以更好地集成 Flutter 提供的各種功能和服務。
- 緊密結合: 這些套件或小部件可能會緊密地與 Flutter 的內部機制和生態系統結合。
- 不依賴於 Flutter SDK:
- 通用性: 這些套件可能是通用的 Dart 套件,可以在任何 Dart 環境中使用,不僅僅局限於 Flutter 應用。
- 靈活性: 不依賴於 Flutter SDK 可能會提供更大的靈活性,因為它們不會受到 Flutter 特定實現的限制。
- 跨平台: 這些通用套件可能更容易適應不同的平台和環境,包括 Flutter、AngularDart 等。
- setState
這是 Flutter 中最基礎的狀態管理方法,適合於小型應用或簡單的 UI 交互。
- 其他:
這個部分還包含了其他一些狀態管理解決方案,如: Redux、BLoC / Rx、MobX、GetX、Fish-Redux、GetIt、Binder、states_rebuilder、Triple Pattern 等。提供了各種狀態管理方法的相關教程、文章和影片,可以幫助開發者更好地理解和選擇合適的狀態管理方案。
Paragraph_2: Networking & http
-
Overview
介紹了Flutter中的http套件,該套件提供了發出http請求的最簡單方式,並支持Android、iOS、macOS、Windows、Linux和web。特定平台可能需要額外的設定步驟,例如Android應用必須在AndroidManifest.xml中聲明其使用網路,macOS應用必須在相關的.entitlements文件中允許網絡訪問。
-
Fetch data from the internet
提供如何從網路獲取數據的具體實例和步驟。
-
Make authenticated requests
介紹如何發送帶有身份驗證的請求,這對於訪問需要用戶登錄的API端點非常重要。
-
Send data to the internet
這個部分會講解如何向網路發送數據,這對於創建新的資源或更新現有資源非常有用。
-
Update data over the internet
介紹如何通過網路更新數據,通常涉及到發送PUT請求到特定的API端點。
-
Delete data on the internet
這個部分會教如何從網路刪除數據,這通常涉及到向特定的API端點發送DELETE請求。
-
Communicate with WebSockets
這裡會介紹如何使用WebSockets與服務器進行通信,這對於需要實時數據交換的應用非常有用。
Question: 實時數據交換定義為何,請舉例說明
Ans: 實時數據交換是指在網絡應用中,客戶端與服務器之間能夠即時、雙向地傳輸和接收數據的過程。這種交換方式允許服務器在數據發生變化時,能夠立即將這些變化推送到客戶端,而不需要客戶端發起請求。這對於需要即時反應和更新的應用來說,是非常重要和有用的。
舉例說明: 在這些例子中,WebSockets是一種常用的實現實時數據交換的技術,它允許建立一個持久的、全雙工(Full-Duplex)的通信通道,使得客戶端和服務器能夠互相發送消息。其中,全雙工(Full-Duplex)指的是通信系統中,數據可以在兩個方向上同時、不間斷地傳輸,即發送和接收可以同時進行,而不會互相干擾。
-
聊天應用
在即時聊天應用中,如WhatsApp或WeChat,用戶發送的消息需要立即被其他用戶接收,這就需要實時數據交換。當一位用戶發送消息時,服務器會立即將這條消息推送到其他相關用戶的客戶端。
-
股票交易應用
在股票交易應用中,股票價格的即時變化需要實時地展示給用戶,以便用戶可以做出快速決策。當股票價格發生變化時,服務器會將最新的價格數據即時推送到客戶端。
-
遊戲應用
在多人在線遊戲中,玩家之間的動作和遊戲狀態需要實時同步,以確保所有玩家都能看到一致的遊戲進程和結果。
Paragraph_3: Serialization序列化
- 本指南探討了在Flutter中使用JSON的各種方法,涵蓋了在不同情境下應使用哪種JSON解決方案,以及為什麼。
- 文章涵蓋了兩種一般策略來處理JSON:
-
手動序列化(Manual serialization)
手動序列化使用dart:convert的JSON解碼器,適合小型項目,但隨著項目增大,管理變得困難。
-
使用代碼生成進行自動序列化(Automated serialization using code generation)
自動序列化則通過代碼生成庫,如json_serializable和built_value,適合大型項目,能在編譯時捕獲錯誤,並避免手寫模板。Flutter還提供基本JSON序列化,通過簡單模型類實現類型安全性和編譯時異常。
這個網頁提供了豐富的信息,幫助開發者理解如何在Flutter中有效地使用JSON和序列化,並根據項目的大小和複雜性選擇最合適的序列化策略。
這個網頁教授開發者如何在Flutter中後台解析大型JSON文檔以優化用戶體驗。由於Dart默認在單一線程運行,故需利用Isolate將耗時計算移到後台,避免主線程卡頓。實作中,需加入http套件進行網絡請求,並利用compute()函數將解析和轉換的工作移至後台Isolate。開發者需創建對應的數據類和解析函數,並注意Isolate的通信需透過傳遞消息,較複雜的對象可能會遇到錯誤,可考慮使用worker_manager和workmanager套件作為替代方案。
Paragraph_4: Persistence
Paragraph_5: Firebase
- Firebase是一個Backend-as-a-Service (BaaS,後端即服務) 應用開發平台,提供如實時數據庫、雲存儲、認證、崩潰報告、機器學習、遠程配置和靜態文件的託管等後端服務。
- Firebase支持Flutter,並有相關的插件(Firebase plugins)。
- 提供了與Firebase和Flutter一起入門的資源,包括影片工作坊和codelab。
- 社群創建了一些有用的文檔和影片,例如建立聊天應用、使用Firestore作為Flutter應用的後端等。
- 也可以使用Firebase來託管Flutter應用於網頁上。
Paragraph_6: Google APIs
這個網頁提供了如何使用Google APIs的資訊,且還提供一個實作這些概念的範例。以下是該網頁的簡單摘要:
- Google APIs套件(Google APIs package)
這個套件公開了數十個可以在Dart項目中使用的Google服務。
- 使用者數據API(User-data APIs)
例如Calendar、Gmail和YouTube,這些API允許與終端用戶數據互動。
- API使用步驟: 選擇所需的API → 啟用API → 用所需的範圍對用戶進行身份驗證 → 獲取經過身份驗證的HTTP客戶端 → 創建並使用所需的API類別。
- 身份驗證(Authentication)
使用google_sign_in套件來對用戶進行Google身份驗證。
- HTTP客戶端(HTTP Client)
經過身份驗證的HTTP客戶端會在調用Google API類別時包含必要的憑證。
- API類別的創建與使用
創建所需的API類型並調用方法。
Part3: 提問
請搜尋此網頁: Question,即可查詢筆者在閱讀Flutter官方文件遇到的疑問和對應參考說明。
真正的失敗者不是那些沒有贏的人,而是那些害怕失敗而不敢嘗試的人
Real loser isn’t someone who doesn’t win. A rea; loser is someone so afraid of not wining, they don’t even try.
中秋連假來到尾聲,鐵人賽也即將完賽哩!