SlideShare a Scribd company logo
1 of 43
Download to read offline
導入 Flutter 前
你應該知道的事
Weizhong Yang a.k.a zonble

zonble@gmail.com
關於我
• 在 KKBOX ⼯作的⼯程師

• 主要從事蘋果平台開發

• 做過 KKBOX iOS、macOS、tvOS 版本,以及 KKTIX、
Uta Pass 等產品,最近⽤ Flutter 做了 KKBOX Kids

• GDE for Flutter
我們的經驗
• 從 2018 年 Google I/O 之後開始接觸

• 2018 年八⽉開始⽤ Flutter 做⼀些 Side
Project

• iPlayground 研討會 App

• ⼀些不太能夠公開的內部 POC…

• 2018 年底嘗試⽤ Flutter 做 KKBOX 風雲榜
App

• 2019 年五⽉推出 KKBOX Kids
今天的主題
• 什麼是 Flutter?Flutter 如何加速產品開發?

• 你是否應該導入 Flutter?

• 新⼿怎樣學 Flutter?

• 你可能會遇到的疑難雜症

• Flutter 的軟體⼯程
什麼是 Flutter?
什麼是 Flutter
• 把瀏覽器的元件打散後重組,打造⼀個逼近 Native 速度的
應⽤程式開發環境

• 瀏覽器:發送 HTTP 連線、抓取 HTML(CSS、JS)、把
HTML Parse 成 DOM、⽤ JavaScript 操作 DOM,⽤
Render 繪製畫⾯

• Flutter:AOT 編譯,直接組好 Widget Tree,⽤ Dart 語⾔
操作 Widgets,Widget 同時包含元件與樣式,沒有另外拆
分 CSS
什麼是 Flutter
• 在 iOS 上有⼀個 FlutterViewController、在 Android 上有⼀
個 Flutter Activity,當中包含 Dart VM 與 Skia Render
Engine

• 沒有⽤到 UIKit 或是 Android UI Components,⽽是⽤⾃⼰
的引擎繪製元件

• 在不同平台上可以繪製出完全相同的 UI

• 預設提供 Material 與 Cupertino 兩套 Widget
Flutter 如何加速開發?
• 規劃新產品時,⽬前的趨勢是雙平台同時開發

• 不同平台之間往往存在若⼲差異,同⼀套設計,在不同平
台上可能各⾃有開發上困難的地⽅

• 產品討論的時間不會少於實際開發的時間

• Flutter 可以在不同平台使⽤同⼀套 UI 設計與 UI
codebase,省下討論的時間,直接進入產品開發
與 HTML 跨平台框架比較
• PhoneGap/Cordova

• Flutter Engine 效能明顯優於 Web View

• 執⾏編譯過的 Dart 程式,毋需在 runtime 解析

• 與 JS 相比,Dart 很少有出乎意料的⾏為

• Dart/Flutter 的 Pattern 也較眾多 HTML/JS 開發框架單⼀
與 NativeScript/RN比較
• RN 等框架標榜 Learn once, write everywhere。但是
Flutter 可以同⼀套程式在 iOS/Android 等平台執⾏

• 執⾏編譯過的 Dart 程式,毋需在 runtime 解析
你是否應該導入
Flutter?
怎樣的 App 適合 Flutter?
• 原本是網站功能,但是要做成 Mobile App 的最適合

• 電商、售票、交友、報表…

• 如果要做遊戲,還是建議使⽤遊戲引擎

• 如果要做更接近硬體功能的 App,像是拍照、錄影…還是
建議使⽤ Native 開發框架
導入之前
• 先確定你已經有完整的⼈才

• 先掌握新技術之後,再導入到實際的產品中

• 先從比較⼩的專案開始,再導入到比較⼤的專案
最後…你還是在做 iOS/Android
App
• 除了 Flutter 之外…

• Cocoa Pods/Gradle 套件管理

• Android Manifest/ProGuard

• App Code Signing

• CI/CD

• 上架流程
KKBOX Kids 的組成
• UI 使⽤ Flutter 製作

• 呼叫原⽣ Web View 實作 OAuth 登入

• 開發原⽣的⾳樂播放器

• ⾃⼰寫了 Facebook App Events 的 plugin
Flutter 團隊的組成
• ⽬前⼈⼒市場上還比較沒有所謂的 Flutter ⼯程師

• Flutter 簡化了很多⼀般性質的 Mobile App 開發

• 但是 Flutter 不能完全取代所有的 iOS/Android 開發⼯作

• 因此,剩下來的平台相關問題,往往是特別困難的問題

• 在團隊中,還是得要有資深的 iOS/Android ⼯程師

• 建議先學會 iOS/Android 其中⼀種,再來學 Flutter
怎樣學 Flutter
怎樣學 Flutter
• 建置環境,安裝 IDE 與 SDK

• 學習 Dart 程式語⾔與慣例

• 先動⼿寫⼀個 Flutter App 上⼿

• 熟悉 Flutter Widget

• 熟悉 Flutter 的重要 Pattern 與更新機制

• 練習寫 Dart Package

• 練習寫 Flutter Plugin
安裝 IDE 與 SDK
• IDE

• Android Studio

• IntelliJ IDEA

• Visual Studio Code

• Flutter SDK https://flutter.dev/docs/get-started/install

• Dart SDK https://dart.dev/get-dart
學習 Dart 語⾔
• Learn X in Y minutes https://learnxinyminutes.com/docs/
dart/

• Dart Pad https://dartpad.dartlang.org

• Exercism https://exercism.io

• Effective Dart https://dart.dev/guides/language/effective-
dart
動⼿寫第⼀個 Flutter
• Flutter 的 New Project 就已經是⼀個簡單會動的程式了

• 官網教學 https://flutter.dev/docs/get-started/codelab

• 《Flutter 實戰》第⼆章 https://book.flutterchina.club/
chapter2/
Flutter Widgets
• Flutter 的 Widget 的數量非常多,考驗記憶⼒

• https://flutter.dev/docs/reference/widgets

• https://flutter.dev/docs/development/ui/widgets

• https://api.flutter.dev/flutter/widgets/widgets-library.html

• 《實戰 Flutter》三~⼗章
Flutter 的基本 Widget
• Text、Image、Scaffold

• Column、Row、Stack、List、Stack

• Custom ScrollView

• Container、Sized、Expanded、Flexible

• Stream Builder、Future Builder
Flutter 的 Pattern
• 先把你過去學過的 Mobile
開發忘了:MVC、
Singleton、Delegation…

• 即使是 Dart 程式,與
Flutter 程式的典範不太⼀樣

• 在 Flutter 的應⽤程式中,
所有物件都在⼀顆樹裡頭
Pattern?
• Pattern 就是物件之間的關係

• 不該有關係的就不要有關係

• Facade:某個 Class 包含了多個⼦系統,其他⼈都經過這個
介⾯,避免外部與⼦系統發⽣關係

• Singleton:某個 Class 只有⼀個 instance,其他⼈都 access
這個 instance 的多對⼀關係

• Delegate:某個 Class ⾃⼰不做事,交給另外⼀個物件的⼀對
⼀關係
Flutter Pattern
• Flutter 當中 Widget 只有三種關係:

• 另⼀個 Widget 在當前的 Widget 上⽅

• 另⼀個 Widget 在當前的 Widget 下⽅

• 另⼀個 Widget 在當前 Widget 之外的另⼀顆樹裡頭

• 由上層節點決定下層節點的狀態
往上尋找節點
• “of”

• 往上尋找最接近且符合某個型態的節點

• Navigator.of(context).push(route)

• Theme.of(context).primaryColor

• MediaQuery.of(context).padding
往下控制節點
• ⽬前 Widget 的 build method 會產⽣下⽅的 Widget

• 已經建立好了 Widget,想要知道內部的狀態,需要在建立
Widget 時 inject ⼀把 Key 進去

• 已經建立好了 Widget,想要改變下⽅ Widget 的狀態,除
了可以整個重 build,某些 Widget 也提供 controller
另⼀個 Widget
在另⼀顆樹裡頭
• 先往上,再往下

• ⽤ “of” 尋找同時位在這兩個 Widget 共同上⽅的 Widget

• 由這個上⽅的 Widget 往下更新

• 越重要的資料(如登入狀態),放在越上⽅
狀態管理
• UI = f(State)

• Provider

• Bloc (Business Logic Component)
Dart Package 與
Flutter Plugin 開發
• stagehand

• dart pub 發佈
疑難雜症
Android X
• Android 上使⽤ Gradle 管理 plugin 中的 native 部分

• 有些 plugin ⽤了 Android X,有些還在⽤ Android Support
Library,然後就編不起來…

• 發信請作者更新 plugin,或是⾃⼰ fork
iOS 的 OpenGL
• Flutter 在 iOS 上使⽤ OpenGL 繪製 UI

• iOS 不會在背景更新 OpenGL 畫⾯,但是你的 App 可能會
在背景執⾏

• 如果你的 App 可能會在背景,就要在 native code 中保存狀
態,然後在 app 回到前景時更新 Flutter 畫⾯

• 混⽤ OpenGL 的 View,如 MapView,有時也會有靈異現象

• OpenGL 可能在⼀些很詭異的狀況下 Crash
某些 plugin 跟你預期的⾏為不同
• 有些 plugin 做了跟你預期不同的事情

• Local Notification plugin 與 Firebase Messaging plugin 打
架,某些訊息繪被 Local Notification plugin 攔走

• iOS 的 AppDelegate 事件不⼀定會交給哪個 plugin 處理

• 在 iOS 上,有時候要動⽤ Method Swizzling…
Flutter 的軟體⼯程
Flutter 的測試
• Dart 元件的單元測試

• Flutter Widget 的 Widget 測試

• 都有整合進 IDE 中

• 提供 Mockito 協助 Mock 資料
Widget Test
• 所有的 native plugin 都得 mock 掉

• Flutter Widget test 單獨跑在 Dart VM 上,不提供 plugin
所需要的平台功能

• method channel 除了提供 setMethodCallHandler,也提供
setMockMethodCallHandler
CI/CD
• BitRise 對 Flutter ⽀援非常好

• GitHub Actions/Travis 也適合⽤在 Dart Package 的 CI

• 我們在內部使⽤ GitLab CI/Jenkins

• Android 使⽤ Docker Image 編譯

• iOS 使⽤ Mac Mini 編譯
Flutter 與 Native
• Flutter 也可以透過 Plugin呼叫 iOS/Android 的 Native
Code

• Flutter -> Native:Method Channel

• Native -> Flutter:Event Channel

• 將 Native 畫⾯蓋在 Flutter 上:Platform View
Recap
• 什麼是 Flutter?Flutter 如何加速產品開發?

• 你是否應該導入 Flutter?

• 新⼿怎樣學 Flutter?

• 你可能會遇到的疑難雜症

• Flutter 的軟體⼯程
學習資源
• Flutter 官網 https://flutter.dev/

• Flutter 中⽂網 https://flutterchina.club/

• Flutter 官⽅ YouTube 頻道https://www.youtube.com/
channel/UCwXdFgeE9KYzlDdR7TG9cMw

• ⼀堆 Twitter 帳號
KKBOX OpenAPI SDK for
Dart
https://pub.dev/packages/kkbox_openapi

More Related Content

What's hot

Intro to Node.js (v1)
Intro to Node.js (v1)Intro to Node.js (v1)
Intro to Node.js (v1)Chris Cowan
 
足を地に着け落ち着いて考える
足を地に着け落ち着いて考える足を地に着け落ち着いて考える
足を地に着け落ち着いて考えるRyuji Tamagawa
 
Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners HubSpot
 
Testing with JUnit 5 and Spring
Testing with JUnit 5 and SpringTesting with JUnit 5 and Spring
Testing with JUnit 5 and SpringVMware Tanzu
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフローadd20
 
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)NTT DATA Technology & Innovation
 
今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説Masahiko Sawada
 
Basics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdfBasics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdfKnoldus Inc.
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るOracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るオラクルエンジニア通信
 
Git hub ppt presentation
Git hub ppt presentationGit hub ppt presentation
Git hub ppt presentationAyanaRukasar
 
Workshop on Git and GitHub
Workshop on Git and GitHubWorkshop on Git and GitHub
Workshop on Git and GitHubDSCVSSUT
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to DjangoJames Casey
 
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送Google Cloud Platform - Japan
 
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 升煌 黃
 
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用apkiban
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Masahito Zembutsu
 

What's hot (20)

Intro to Node.js (v1)
Intro to Node.js (v1)Intro to Node.js (v1)
Intro to Node.js (v1)
 
足を地に着け落ち着いて考える
足を地に着け落ち着いて考える足を地に着け落ち着いて考える
足を地に着け落ち着いて考える
 
Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners
 
Testing with JUnit 5 and Spring
Testing with JUnit 5 and SpringTesting with JUnit 5 and Spring
Testing with JUnit 5 and Spring
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフロー
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
Apache Bigtopによるオープンなビッグデータ処理基盤の構築(オープンデベロッパーズカンファレンス 2021 Online 発表資料)
 
今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説
 
Basics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdfBasics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdf
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るOracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
 
Git hub ppt presentation
Git hub ppt presentationGit hub ppt presentation
Git hub ppt presentation
 
Workshop on Git and GitHub
Workshop on Git and GitHubWorkshop on Git and GitHub
Workshop on Git and GitHub
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
 
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
 
GitHub Basics - Derek Bable
GitHub Basics - Derek BableGitHub Basics - Derek Bable
GitHub Basics - Derek Bable
 
Git and Github Session
Git and Github SessionGit and Github Session
Git and Github Session
 
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
 

Similar to 導入 Flutter 前你應該知道的事

Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
Phonegap入門
Phonegap入門Phonegap入門
Phonegap入門Roy Chen
 
App introduction
App introductionApp introduction
App introductionJerromy Lee
 
Phalcon2014 Startup
Phalcon2014 StartupPhalcon2014 Startup
Phalcon2014 StartupSteve Luo
 
2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例
2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例
2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例Justin Lee
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型Tom Fan
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfDuran Hsieh
 
Android快速发布&持续集成
Android快速发布&持续集成Android快速发布&持续集成
Android快速发布&持续集成whykill
 
炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建Johnny Sung
 
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)My own sweet home!
 
Codeigniter 3.0 之 30 分鐘就上手
Codeigniter 3.0 之 30 分鐘就上手Codeigniter 3.0 之 30 分鐘就上手
Codeigniter 3.0 之 30 分鐘就上手Piece Chao
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Jun Liu
 
CocoaPods 使用教學
CocoaPods 使用教學CocoaPods 使用教學
CocoaPods 使用教學ShengWen Chiou
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repoWeizhong Yang
 
Appcan移动应用开发平台介绍120409
Appcan移动应用开发平台介绍120409Appcan移动应用开发平台介绍120409
Appcan移动应用开发平台介绍120409zhengyiwuxian
 
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)My own sweet home!
 

Similar to 導入 Flutter 前你應該知道的事 (20)

Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
Phonegap入門
Phonegap入門Phonegap入門
Phonegap入門
 
App introduction
App introductionApp introduction
App introduction
 
Phalcon2014 Startup
Phalcon2014 StartupPhalcon2014 Startup
Phalcon2014 Startup
 
Flutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCUFlutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCU
 
2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例
2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例
2011/08/20跨平台行動應用程式使用者介面開發—以titanium mobile為例
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdf
 
Android快速发布&持续集成
Android快速发布&持续集成Android快速发布&持续集成
Android快速发布&持续集成
 
炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建
 
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)
 
Firebase 基礎上手 |2小時由入門到精通 | GDSC NYCU
 Firebase 基礎上手 |2小時由入門到精通 | GDSC NYCU Firebase 基礎上手 |2小時由入門到精通 | GDSC NYCU
Firebase 基礎上手 |2小時由入門到精通 | GDSC NYCU
 
Flutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCUFlutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCU
 
Codeigniter 3.0 之 30 分鐘就上手
Codeigniter 3.0 之 30 分鐘就上手Codeigniter 3.0 之 30 分鐘就上手
Codeigniter 3.0 之 30 分鐘就上手
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
 
[VideOhya] Titanium開發經驗分享_1020
[VideOhya] Titanium開發經驗分享_1020[VideOhya] Titanium開發經驗分享_1020
[VideOhya] Titanium開發經驗分享_1020
 
CocoaPods 使用教學
CocoaPods 使用教學CocoaPods 使用教學
CocoaPods 使用教學
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repo
 
Appcan移动应用开发平台介绍120409
Appcan移动应用开发平台介绍120409Appcan移动应用开发平台介绍120409
Appcan移动应用开发平台介绍120409
 
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
 

More from Weizhong Yang

關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情Weizhong Yang
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsWeizhong Yang
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 APIWeizhong Yang
 
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程Weizhong Yang
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼Weizhong Yang
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 CodeWeizhong Yang
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingWeizhong Yang
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIWeizhong Yang
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統Weizhong Yang
 

More from Weizhong Yang (18)

Flutter BLE
Flutter BLEFlutter BLE
Flutter BLE
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情
 
Dart null safety
Dart null safetyDart null safety
Dart null safety
 
Github Actions
Github ActionsGithub Actions
Github Actions
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing Aids
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API
 
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code
 
貪食蛇
貪食蛇貪食蛇
貪食蛇
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio API
 
Html 5 native drag
Html 5 native dragHtml 5 native drag
Html 5 native drag
 
Retina mac
Retina macRetina mac
Retina mac
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統
 
Input Method Kit
Input Method KitInput Method Kit
Input Method Kit
 
Refactoring
RefactoringRefactoring
Refactoring
 
Core animation
Core animationCore animation
Core animation
 

導入 Flutter 前你應該知道的事

  • 1. 導入 Flutter 前 你應該知道的事 Weizhong Yang a.k.a zonble zonble@gmail.com
  • 2. 關於我 • 在 KKBOX ⼯作的⼯程師 • 主要從事蘋果平台開發 • 做過 KKBOX iOS、macOS、tvOS 版本,以及 KKTIX、 Uta Pass 等產品,最近⽤ Flutter 做了 KKBOX Kids • GDE for Flutter
  • 3. 我們的經驗 • 從 2018 年 Google I/O 之後開始接觸 • 2018 年八⽉開始⽤ Flutter 做⼀些 Side Project • iPlayground 研討會 App • ⼀些不太能夠公開的內部 POC… • 2018 年底嘗試⽤ Flutter 做 KKBOX 風雲榜 App • 2019 年五⽉推出 KKBOX Kids
  • 4. 今天的主題 • 什麼是 Flutter?Flutter 如何加速產品開發? • 你是否應該導入 Flutter? • 新⼿怎樣學 Flutter? • 你可能會遇到的疑難雜症 • Flutter 的軟體⼯程
  • 6. 什麼是 Flutter • 把瀏覽器的元件打散後重組,打造⼀個逼近 Native 速度的 應⽤程式開發環境 • 瀏覽器:發送 HTTP 連線、抓取 HTML(CSS、JS)、把 HTML Parse 成 DOM、⽤ JavaScript 操作 DOM,⽤ Render 繪製畫⾯ • Flutter:AOT 編譯,直接組好 Widget Tree,⽤ Dart 語⾔ 操作 Widgets,Widget 同時包含元件與樣式,沒有另外拆 分 CSS
  • 7. 什麼是 Flutter • 在 iOS 上有⼀個 FlutterViewController、在 Android 上有⼀ 個 Flutter Activity,當中包含 Dart VM 與 Skia Render Engine • 沒有⽤到 UIKit 或是 Android UI Components,⽽是⽤⾃⼰ 的引擎繪製元件 • 在不同平台上可以繪製出完全相同的 UI • 預設提供 Material 與 Cupertino 兩套 Widget
  • 8. Flutter 如何加速開發? • 規劃新產品時,⽬前的趨勢是雙平台同時開發 • 不同平台之間往往存在若⼲差異,同⼀套設計,在不同平 台上可能各⾃有開發上困難的地⽅ • 產品討論的時間不會少於實際開發的時間 • Flutter 可以在不同平台使⽤同⼀套 UI 設計與 UI codebase,省下討論的時間,直接進入產品開發
  • 9. 與 HTML 跨平台框架比較 • PhoneGap/Cordova • Flutter Engine 效能明顯優於 Web View • 執⾏編譯過的 Dart 程式,毋需在 runtime 解析 • 與 JS 相比,Dart 很少有出乎意料的⾏為 • Dart/Flutter 的 Pattern 也較眾多 HTML/JS 開發框架單⼀
  • 10. 與 NativeScript/RN比較 • RN 等框架標榜 Learn once, write everywhere。但是 Flutter 可以同⼀套程式在 iOS/Android 等平台執⾏ • 執⾏編譯過的 Dart 程式,毋需在 runtime 解析
  • 12. 怎樣的 App 適合 Flutter? • 原本是網站功能,但是要做成 Mobile App 的最適合 • 電商、售票、交友、報表… • 如果要做遊戲,還是建議使⽤遊戲引擎 • 如果要做更接近硬體功能的 App,像是拍照、錄影…還是 建議使⽤ Native 開發框架
  • 14. 最後…你還是在做 iOS/Android App • 除了 Flutter 之外… • Cocoa Pods/Gradle 套件管理 • Android Manifest/ProGuard • App Code Signing • CI/CD • 上架流程
  • 15. KKBOX Kids 的組成 • UI 使⽤ Flutter 製作 • 呼叫原⽣ Web View 實作 OAuth 登入 • 開發原⽣的⾳樂播放器 • ⾃⼰寫了 Facebook App Events 的 plugin
  • 16. Flutter 團隊的組成 • ⽬前⼈⼒市場上還比較沒有所謂的 Flutter ⼯程師 • Flutter 簡化了很多⼀般性質的 Mobile App 開發 • 但是 Flutter 不能完全取代所有的 iOS/Android 開發⼯作 • 因此,剩下來的平台相關問題,往往是特別困難的問題 • 在團隊中,還是得要有資深的 iOS/Android ⼯程師 • 建議先學會 iOS/Android 其中⼀種,再來學 Flutter
  • 18. 怎樣學 Flutter • 建置環境,安裝 IDE 與 SDK • 學習 Dart 程式語⾔與慣例 • 先動⼿寫⼀個 Flutter App 上⼿ • 熟悉 Flutter Widget • 熟悉 Flutter 的重要 Pattern 與更新機制 • 練習寫 Dart Package • 練習寫 Flutter Plugin
  • 19. 安裝 IDE 與 SDK • IDE • Android Studio • IntelliJ IDEA • Visual Studio Code • Flutter SDK https://flutter.dev/docs/get-started/install • Dart SDK https://dart.dev/get-dart
  • 20. 學習 Dart 語⾔ • Learn X in Y minutes https://learnxinyminutes.com/docs/ dart/ • Dart Pad https://dartpad.dartlang.org • Exercism https://exercism.io • Effective Dart https://dart.dev/guides/language/effective- dart
  • 21. 動⼿寫第⼀個 Flutter • Flutter 的 New Project 就已經是⼀個簡單會動的程式了 • 官網教學 https://flutter.dev/docs/get-started/codelab • 《Flutter 實戰》第⼆章 https://book.flutterchina.club/ chapter2/
  • 22. Flutter Widgets • Flutter 的 Widget 的數量非常多,考驗記憶⼒ • https://flutter.dev/docs/reference/widgets • https://flutter.dev/docs/development/ui/widgets • https://api.flutter.dev/flutter/widgets/widgets-library.html • 《實戰 Flutter》三~⼗章
  • 23. Flutter 的基本 Widget • Text、Image、Scaffold • Column、Row、Stack、List、Stack • Custom ScrollView • Container、Sized、Expanded、Flexible • Stream Builder、Future Builder
  • 24. Flutter 的 Pattern • 先把你過去學過的 Mobile 開發忘了:MVC、 Singleton、Delegation… • 即使是 Dart 程式,與 Flutter 程式的典範不太⼀樣 • 在 Flutter 的應⽤程式中, 所有物件都在⼀顆樹裡頭
  • 25. Pattern? • Pattern 就是物件之間的關係 • 不該有關係的就不要有關係 • Facade:某個 Class 包含了多個⼦系統,其他⼈都經過這個 介⾯,避免外部與⼦系統發⽣關係 • Singleton:某個 Class 只有⼀個 instance,其他⼈都 access 這個 instance 的多對⼀關係 • Delegate:某個 Class ⾃⼰不做事,交給另外⼀個物件的⼀對 ⼀關係
  • 26. Flutter Pattern • Flutter 當中 Widget 只有三種關係: • 另⼀個 Widget 在當前的 Widget 上⽅ • 另⼀個 Widget 在當前的 Widget 下⽅ • 另⼀個 Widget 在當前 Widget 之外的另⼀顆樹裡頭 • 由上層節點決定下層節點的狀態
  • 27. 往上尋找節點 • “of” • 往上尋找最接近且符合某個型態的節點 • Navigator.of(context).push(route) • Theme.of(context).primaryColor • MediaQuery.of(context).padding
  • 28. 往下控制節點 • ⽬前 Widget 的 build method 會產⽣下⽅的 Widget • 已經建立好了 Widget,想要知道內部的狀態,需要在建立 Widget 時 inject ⼀把 Key 進去 • 已經建立好了 Widget,想要改變下⽅ Widget 的狀態,除 了可以整個重 build,某些 Widget 也提供 controller
  • 29. 另⼀個 Widget 在另⼀顆樹裡頭 • 先往上,再往下 • ⽤ “of” 尋找同時位在這兩個 Widget 共同上⽅的 Widget • 由這個上⽅的 Widget 往下更新 • 越重要的資料(如登入狀態),放在越上⽅
  • 30. 狀態管理 • UI = f(State) • Provider • Bloc (Business Logic Component)
  • 31. Dart Package 與 Flutter Plugin 開發 • stagehand • dart pub 發佈
  • 33. Android X • Android 上使⽤ Gradle 管理 plugin 中的 native 部分 • 有些 plugin ⽤了 Android X,有些還在⽤ Android Support Library,然後就編不起來… • 發信請作者更新 plugin,或是⾃⼰ fork
  • 34. iOS 的 OpenGL • Flutter 在 iOS 上使⽤ OpenGL 繪製 UI • iOS 不會在背景更新 OpenGL 畫⾯,但是你的 App 可能會 在背景執⾏ • 如果你的 App 可能會在背景,就要在 native code 中保存狀 態,然後在 app 回到前景時更新 Flutter 畫⾯ • 混⽤ OpenGL 的 View,如 MapView,有時也會有靈異現象 • OpenGL 可能在⼀些很詭異的狀況下 Crash
  • 35. 某些 plugin 跟你預期的⾏為不同 • 有些 plugin 做了跟你預期不同的事情 • Local Notification plugin 與 Firebase Messaging plugin 打 架,某些訊息繪被 Local Notification plugin 攔走 • iOS 的 AppDelegate 事件不⼀定會交給哪個 plugin 處理 • 在 iOS 上,有時候要動⽤ Method Swizzling…
  • 37. Flutter 的測試 • Dart 元件的單元測試 • Flutter Widget 的 Widget 測試 • 都有整合進 IDE 中 • 提供 Mockito 協助 Mock 資料
  • 38. Widget Test • 所有的 native plugin 都得 mock 掉 • Flutter Widget test 單獨跑在 Dart VM 上,不提供 plugin 所需要的平台功能 • method channel 除了提供 setMethodCallHandler,也提供 setMockMethodCallHandler
  • 39. CI/CD • BitRise 對 Flutter ⽀援非常好 • GitHub Actions/Travis 也適合⽤在 Dart Package 的 CI • 我們在內部使⽤ GitLab CI/Jenkins • Android 使⽤ Docker Image 編譯 • iOS 使⽤ Mac Mini 編譯
  • 40. Flutter 與 Native • Flutter 也可以透過 Plugin呼叫 iOS/Android 的 Native Code • Flutter -> Native:Method Channel • Native -> Flutter:Event Channel • 將 Native 畫⾯蓋在 Flutter 上:Platform View
  • 41. Recap • 什麼是 Flutter?Flutter 如何加速產品開發? • 你是否應該導入 Flutter? • 新⼿怎樣學 Flutter? • 你可能會遇到的疑難雜症 • Flutter 的軟體⼯程
  • 42. 學習資源 • Flutter 官網 https://flutter.dev/ • Flutter 中⽂網 https://flutterchina.club/ • Flutter 官⽅ YouTube 頻道https://www.youtube.com/ channel/UCwXdFgeE9KYzlDdR7TG9cMw • ⼀堆 Twitter 帳號
  • 43. KKBOX OpenAPI SDK for Dart https://pub.dev/packages/kkbox_openapi