前回までに、環境構築とエミュレータを使っての動作確認ができるようになりました。ということで、"Get started"に従って、「はじめてのアプリ」を作ってみます。
名前をランダムに生成してくれるアプリを作ります。
初期設定
"startup_namer"という名前のFlutterプロジェクトを作ります。
プロジェクトが立ち上がったら、”File” → "Project Structure"でSDKを設定しておきます。これ自動にならないのかな・・・
今回はiOS/Androidアプリだけじゃなくて、Webアプリも作るみたいです。Android Studioのターミナルを開いて、以下の通り入力します。
$ flutter channel beta $ flutter upgrade $ flutter config --enable-web
これでデバイスにWeb ServerとChromeが追加されました。なお、一度実行すれば今後のプロジェクトでも使えるみたいです。
Webアプリも含めた実行
main.dartを以下のコードでまるっと上書きします。
// Copyright 2018 The Flutter team. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: Text('Welcome to Flutter'), ), body: Center( child: Text('Hello World'), ), ), ); } }
iOSシミュレータ/Androidエミュレータを起動しておきます。
Android Studioのターミナルからflutter devices
でデバイスが確認できます。iOSシミュレータ/AndroidエミュレータとChrome/Web Serverが認識されてますね。
$ flutter devices 4 connected devices: sdk gphone x86 arm (mobile) • emulator-5554 • android-x86 • Android 11 (API 30) (emulator) iPhone 12 Pro Max (mobile) • 91599C13-9A00-4237-AA7E-63DA46BC8A97 • ios • com.apple.CoreSimulator.SimRuntime.iOS-14-2 (simulator) Web Server (web) • web-server • web-javascript • Flutter Tools Chrome (web) • chrome • web-javascript • Google Chrome 87.0.4280.88
flutter run -d all
で全デバイスで実行します。
$ flutter run -d all
前回同様、iOSシミュレータ/AndroidエミュレータでFlutterアプリが起動しました。Webの方はどうもall
指定でも開かないようなので、別途flutter run
しないといけないのかな。
今開いているターミナルはhot reloadのために閉じたくないので、もう一つターミナルを立ち上げましょう。ターミナルの"+"をクリックします。
ターミナルのタブが増えました。Webの場合はflutter run -d chrome
を実行します。
ブラウザが起動して、同じようにFlutterアプリが表示されていますね。
ターミナルを見るとこちらもhot reloadが有効なようです。
タブを切り替えないのがちょっと面倒ですが、これでiOS/Android/Webと3つの環境を同時にテストできますね!
Flutterのコード
ちょっとコードを見てみます。
- 5行目: Materialデザインを使うためのパッケージを読み込んでいます。
- 7行目: main()です。ここでMyAppが起動します。
- 9行目: MyAppクラスをStatelessWidgetから継承して作成してます。FlutterではWidgetがUIパーツの基本要素となり、いろんな種類のWidgetを組み合わせて1つのアプリのUIを作る、みたいな感じらしいです。
- 11行目以降でMaterialデザインのUIを設定していきます。
- 14行目: Scaffold Widgetを使って、上にタイトルを含んだバーがあって下に本文、みたいなよく見かける画面構成を作ります。なんとなくわかりますね。
外部パッケージ
外部のライブラリをパッケージとして取り込んでみます。
Android Studioのファイルブラウザからpubsec.yaml
を開きます。
dependencies
のところに、今回はランダムに英単語を生成するenglish_words
というパッケージを追加します。nodejsのpackage.jsonみたいなものですね。
pubsec.yamlを保存したら、ターミナルをもう一つ開いて、flutter pub get
を実行してパッケージを取得します。
ファイルブラウザで見ると、External Libraries > Dart Packagesに先程のパッケージが追加されていますね。
main.dartでこのパッケージをimportします。import 'package:english_words/english_words.dart';
を 最初のimportの下に追加します。
このパッケージを使って英単語を生成します。final wordPair = WordPair.random();
をMyAppに追加します。
これでwordPairにランダムな英単語が代入されるので、これを画面の中で使います。画面中央に表示される"Hello World"のところを置き換えます。
では実行してみましょう。iOSシミュレータ/Androidエミュレータを起動していたターミナルを開いて"r"を入力します。
書き換わりましたね!
Chromeを立ち上げたターミナルのほうでも"r"を入力。
ブラウザも書き換わりました!
まとめ
Android/iOSだけでなくWebアプリもできて便利ですね。まだHello Worldに毛が生えたぐらいのところですが、次回は動的なWidgetを使ってユーザのアクションなどによって変化するのを試したいと思います。
まだまだ先は長い・・・