跳转至

架構

使用 Flutter 去撰寫所有應用程式相關邏輯, 他提供很多素材去做學習,包括各種應用程式的完成品, 如 Gallery 和其他小範例

Flutter 透過 Skia 來做繪圖工具, 在所有平台(macOS、Linux、Windows、Website、iOS APP、Android APP)中都利用該套件直接和底層 OS 接觸, 減少和各平台的接口接觸,進而達到能在眾平台中統一介面。

當然,在一些特殊情境上,仍需要單獨處理平台的設定。 例如,iOS 的通知,便需要在 XCode 和 AppStoreConnect 中設定。 但整體的商務邏輯和應用程式設計都可以直接使用 Flutter 撰寫。

Flutter 是一個框架,撰寫其框架的語言是 Dart, 其風格類似於很多物件導向的語言。個人是覺得和其他語言沒什麼差別,主要是覺得他和 IDE 融合得很好,撰寫起來很方便,相關文件也很充足。 這有幾個詳細說明的文章,無聊可以讀讀, 10-good-reasons-why-you-should-learn-dartwhy-flutter-uses-dart

如果想馬上來試試,可以玩玩看他們的線上 compiler

POS 系統在 Flutter 之上的架構

這裡嘗試讓初入的人了解應用程式架構。

主要架構

.
├── assets/             - 各種圖片,未來可能會放字體
├── lib/                - 主要邏輯
│   ├── components/     - 各種 UI 輔助元件
│   ├── constants/      - 各種定死的標準,例如外觀顏色,常用圖標
│   ├── helpers/        - 各地方常用函示,例如 Log
│   ├── l10n/           - 應用程式內的文字,和各語言的翻譯(實質僅有 zh-TW)
│   ├── models/         - 物件,例如產品、成份等等。會在這裡和 Services 接觸而非 UI 裡面
│   ├── services/       - 和應用程式外部溝通的工具,例如 DB
│   ├── settings/       - 使用者可以調整的設定,例如主題、語言和外觀
│   ├── ui/             - 應用程式主要外觀設計
│   ├── main.dart       - 處理 Services、Models 和 Firebase 的初始化
│   ├── my_app.dart     - 建置主體 APP 位置
│   ├── routes.dart     - 放置應用程式路徑位置
│   └── translator.dart - 讓應用程式不需要每次都呼叫很長的翻譯物件
└── test/               - 單元和元件測試,架構和 lib/ 一樣

Components

components/                     - 各種 UI 輔助元件
├── dialog/                     - 對話框
│    ├── confirm_dialog         - 確認通知
│    ├── delete_dialog          - 刪除通知
│    ├── single_text_dialog     - 可輸入文字的對話框
│    └── slider_text_dialog     - 滑動有數字屬性的對話框
├── mixin/                      - 輔助型元件
│    └── item_modal             - 編輯物件(如產品、成分)用的模組
├── models/                     - 和物件有關的 UI 元件
├── scaffold/                   - 框架類元件
│    ├── item_list_scaffold     - 目前僅有設定時會用到,未來可能會直接搬到 setting_screen
│    └── reorderable_scaffold   - 可以重新排列物件的框架
└── style/                      - 不會過 test 的元件
     └── ...                    - 小東西,不列舉

Constants

constants/     - 各種定死的標準,例如外觀顏色,常用圖標
├── app_themes - 外觀顏色
├── constant   - 數字類的標準,如 padding、margin 的大小
└── icons      - 常用圖標

Helpers

helpers/          - 各地方常用函示,例如 Log
├── exporter/     - 包裝匯出資料的 API
├── formater/     - 格式化資料
├── launcher      - 包裝「點擊連結會跳出瀏覽器」
├── logger        - 輸出,包括輸出到 Firebase Analytics
├── util          - 雜項
└── validator     - 驗證輸入的工具,例如文字必須為數字且必須大於一

Models

models/                          - 物件,例如產品、成份等等。會在這裡和 Services 接觸而非 UI 裡面
├── constumer/                   - 菜單
│    ├── customer_setting_option - 顧客設定的選項
│    └── customer_setting        - 顧客設定
├── menu/                        - 菜單
│    ├── catalog                 - 產品種類
│    ├── product_ingredient      - 產品的成分
│    ├── product_quantity        - 產品的份量
│    └── product                 - 產品
├── objects/                     - 用來做 I/O 的物件
│    ├── cashier_object          - 收銀機的物件
│    ├── customer_object         - 顧客設定的物件
│    ├── menu_object             - 菜單的物件
│    ├── order_attributeobject   - 訂單屬性(上面的顧客設定)
│    ├── order_object            - 訂單的物件
│    └── stock_object            - 庫存的物件
├── order/                       - 訂單
│    └── order_product           - 訂單的產品設定
├── repository/                  - 物件庫
│    ├── cart_ingredients        - 訂單時,產品的成份管理
│    ├── cart                    - 訂單的物件庫,購物車
│    ├── cashier                 - 收銀機的物件庫
│    ├── customer_settings       - 顧客設定的物件庫
│    ├── menu                    - 菜單的物件庫
│    ├── quantities              - 份量的物件庫
│    ├── replenisher             - 補貨的物件庫
│    ├── seller                  - 點單的物件庫,賣家,用來處理把訂單丟進 DB
│    └── stock                   - 庫存的物件庫,雖然 inventory 這名稱比較適合,但為時已晚
├── stock/                       - 庫存
│    ├── ingredient              - 庫存的成份
│    ├── quantity                - 庫存的成分數量
│    └── replenishment           - 庫存的補貨
├── model_object                 - object 的基本物件
├── model                        - model 的基本物件
├── repository                   - repository 的基本物件
└── xfile                        - 包裝檔案系統的 API

Services

services/               - 和應用程式外部溝通的工具,例如 DB
├── auth                - 驗證邏輯,使用者的登入等等
├── cache               - 記錄使用者的設定和行為,例如是否看過 tutorial
├── database            - 紀錄點單等多筆的資料,Sqlite
├── database_migrations - database 不同版本時整合的紀錄
├── image_dumper        - 管理 image 的存取
└── storage             - 紀錄菜單和庫存等高變種的資料,NoSQL

Settings

settings/                    - 使用者可以調整的設定,例如主題、語言
├── cashier_warning          - 收銀機的告警設定
├── collect_event            - 收集使用者錯誤訊息設定
├── currency                 - 幣種,目前尚無使用,僅是預先做好,未來有需要可以開
├── language                 - 語言
├── order_awakening          - 點餐時是否關閉螢幕的設定
├── order_outlook            - 點餐時的外觀設定
├── order_product_axis_count - 點餐時的外觀設定
├── theme                    - 主題,目前僅有日光和暗色
├── setting                  - 設定的介面
└── settings_provier         - 管理所有設定的介面

UI

基本的框架為:

feature/             - 特定功能
├── ...              - 功能下的子功能,若有會列出來
├── widgets/         - 功能的輔助物件,不會在下表中列出來
└── feature_screen   - 功能的架構,不會在下表中列出來

各介面:

ui/                    - 應用程式主要外觀設計
├── analysis/          - 分析點單
├── cashier/           - 收銀機
│    └── changer       - 換錢
├── customer/          - 顧客設定
├── home/              - 主頁
├── menu/              - 菜單
│    ├── catalog/      - 產品種類
│    └── product/      - 產品
├── order/             - 點單
│    ├── cart          - 購物車
│    └── cashier       - 結帳
├── setting/           - 設定
└── stock/             - 庫存
     ├── quantity      - 成分數量
     └── replenishment - 補貨