Flutter入門
デブサミ2024にて以下の本を購入したので、Flutterに入門してみる。
Installation
Flutter
早速書籍とは異なる方法でインストールしてみる。(業務での方法に合わせるため)
fvm
というFlutterのバージョンマネージャーを利用する。
すでに Homebrew経由でインストールしていたが、バージョンが最新ではなかったのでバージョンアップした。
brew upgrade fvm
fvm --version
3.0.9
次に最新のstableのFlutterをインストールする。
まずは最新バージョンを確認。
fvm releases | tail
Jan 26 24 │ 3.19.0-0.3.pre
Feb 2 24 │ 3.19.0-0.4.pre
Feb 15 24 │ 3.19.0
Feb 15 24 │ 3.20.0-1.1.pre
--------------------------------------
Feb 21 24 │ 3.19.1 stable
--------------------------------------
--------------------------------------
Feb 22 24 │ 3.20.0-1.2.pre beta
--------------------------------------
v3.19.1をインストールする。
fvm install 3.19.1
インストールしたバージョンを利用するコマンドを実行。
fvm use 3.19.1
Not a Flutter project. Run this FVM command at the root of a Flutter project or use --force to bypass this.
まだFlutterプロジェクトが作成されていないので、--force
コマンドが必要。
fvm use 3.19.1 --force
これでに設定ファイルが追加された。
{
"flutterSdkVersion": "3.19.1",
"flavors": {}
}
インストールできたかversionを確認する。
fvm flutter --version
Flutter 3.19.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision abb292a07e (2 days ago) • 2024-02-20 14:35:05 -0800
Engine • revision 04817c99c9
Tools • Dart 3.3.0 • DevTools 2.31.1
VSCode
Flutterの拡張機能を追加。
設定ファイルには以下のようにFlutter SDKのパスを設定する。
{
"dart.flutterSdkPath": ".fvm/flutter_sdk"
}
Android Studio
JetBrains Toolboxを使ってAndroid Studio Jellyfish (2023.3.1 Canary 11) をインストール。
Xcode
App StoreからXcode 15.2 をインストール。
flutter doctor
で確認
メモを忘れて最初の結果とは異なるが、以下のように出力された。
fvm flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.19.1, on macOS 14.2.1 23C71 darwin-arm64, locale ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
✗ cmdline-tools component is missing
Run `path/to/sdkmanager --install "cmdline-tools;latest"`
See https://developer.android.com/studio/command-line for more details.
✗ Android license status unknown.
Run `flutter doctor --android-licenses` to accept the SDK licenses.
See https://flutter.dev/docs/get-started/install/macos#android-setup for more details.
[!] Xcode - develop for iOS and macOS (Xcode 15.2)
✗ CocoaPods not installed.
CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
Without CocoaPods, plugins will not work on iOS or macOS.
For more info, see https://flutter.dev/platform-plugins
To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.2)
[!] Android Studio (version unknown)
✗ Unable to determine Android Studio version.
[✓] VS Code (version 1.86.2)
[✓] Connected device (2 available)
[✓] Network resources
! Doctor found issues in 3 categories.
1つ1つ対処していこう。
Android SDK Command-line Toolsのインストール
[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
✗ cmdline-tools component is missing
Runpath/to/sdkmanager --install "cmdline-tools;latest"
See https://developer.android.com/studio/command-line for more details.
まずはAndroid SDKのツールチェーンでエラーになっている。
- Android Studioを開く
-
Preferences > Languages & Frameworks > Android SDK
を開く -
SDK Tools
のタブを開く -
Android SDK Command-line Tools (latest)
にチェックを入れる
- OKを押す
Android SDKのライセンスエラー
[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses
指示の通りにコマンドを打つが、fvm
経由で実行することに注意。
fvm flutter doctor --android-licenses
後はy
を推して承認していく。
CocoaPodsのインストール
CocoaPodsはXcodeプロジェクトでのライブラリマネージャー。
[!] Xcode - develop for iOS and macOS (Xcode 15.2)
✗ CocoaPods not installed.
CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
Without CocoaPods, plugins will not work on iOS or macOS.
For more info, see https://flutter.dev/platform-plugins
To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
案内されたページに従ってインストールする。
sudo gem install cocoapods
Android Studioのバージョンが不明
[!] Android Studio (version unknown)
✗ Unable to determine Android Studio version.
これは原因が不明。
JetBrains Toolboxによってインストールしたのが原因だろうか。
他のツールを使ってAndroid Studioをインストールした際に同じようなエラーが発生しているようだ。
最終的な結果
Android Studioのバージョンがわからない点以外は解決できた。
fvm flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.19.1, on macOS 14.2.1 23C71 darwin-arm64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 15.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.2)
[!] Android Studio (version unknown)
✗ Unable to determine Android Studio version.
[✓] VS Code (version 1.86.2)
[✓] Connected device (2 available)
[✓] Network resources
! Doctor found issues in 1 category.
カウンタアプリの作成
VSCodeのコマンドパレットから
-
Fulutter: New Project
を選択 -
Application
を選択 - プロジェクトを配置するフォルダを選択
- プロジェクト名を入力
- 自動的に必要なファイルが作られる。
そこから「実行>デバッグの開始>Flutter」を選択してしばらく経過すると、自動的に作成されたカウンタアプリが起動する。
Dart
Dart is a client-optimized language for developing fast apps on any platform. Its goal is to offer the most productive programming language for multi-platform development, paired with a flexible execution runtime platform for app frameworks.
(訳)Dartはどのプラットフォームでも速くアプリを開発するためのクライアントに最適化された言語です。その目標はアプリフレームワーク用の柔軟な実行ランタイムプラットフォームと組み合わせて、マルチプラットフォーム開発のための最も生産的なプログラミング言語を提供することです。
material library
マテリアルデザインのウィジット用のパッケージ。
TextTheme
マテリアルデザインでのテキストテーマが用意されている。
body: Column(
children: <Widget>[
Text("Display Large", style: Theme.of(context).textTheme.displayLarge,),
Text("Display Medium", style: Theme.of(context).textTheme.displayMedium,),
Text("Display Small", style: Theme.of(context).textTheme.displaySmall,),
Text("Headline Large", style: Theme.of(context).textTheme.headlineLarge,),
Text("Headline Medium", style: Theme.of(context).textTheme.headlineMedium,),
Text("Headline Small", style: Theme.of(context).textTheme.headlineSmall,),
Text("Title Large", style: Theme.of(context).textTheme.titleLarge,),
Text("Title Medium", style: Theme.of(context).textTheme.titleMedium,),
Text("Title Small", style: Theme.of(context).textTheme.titleSmall,),
Text("Label Large", style: Theme.of(context).textTheme.labelLarge,),
Text("Label Medium", style: Theme.of(context).textTheme.labelMedium,),
Text("Label Small", style: Theme.of(context).textTheme.labelSmall,),
Text("Body Large", style: Theme.of(context).textTheme.bodyLarge,),
Text("Body Medium", style: Theme.of(context).textTheme.bodyMedium,),
Text("Body Small", style: Theme.of(context).textTheme.bodySmall,),
],
),
変数の宣言・初期化
var
を使って宣言すると、初期化する値の型によって変数の型が変わる。
var name = 'Bob';
値の型が変わるのであれば、Object
型(もしくは dynamic
)で宣言する。
Object name = 'Bob';
特定の型を指定して宣言するには以下。
String name = 'Bob';
Null安全
変数の宣言時にその変数がNull安全かどうか指定することができる。
String? name // String or null
String name // String only
late
修飾子
変数の宣言時にlate
をつけることで遅延して初期化することができる。
late String description;
void main(){
description = 'Feijoada!';
print(description);
}
以下のようなユースケースで用いる
- 必要がないかもしれない変数で、初期化のコストが高い場合
- インスタンス変数の初期化時に
this
を参照したい場合
例:
temperature
変数が呼ばれない場合、(実行コストが高い)readThermometer
関数は呼ばれない。
late String temperature = readThermometer();
initState
メソッド内で初期化される。その際にthis
が参照されている。
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
late AnimationController _animationController;
void initState() {
super.initState();
_animationController =
AnimationController(vsync: this, duration: const Duration(seconds: 3));
}