- 村田靖拓
- 約 3,700 文字
- 700 View
目次
はじめに
こんにちは、TIGの村田です。春の入門祭り 第3弾として、兼ねてより気になっていたFlutterに入門してみた話をお届けします。
普段はクラウドインフラ寄りな技術を触っているのですが、実は生まれと育ちはフロントエンド畑で、過去にはUrushiという当社製のOSS開発に携わっていました。
Urushiについては以下のブログで詳細に語られています。2017年の記事ですね。懐かしい限りです。
ES2015 Web componentsと国産Web componentsフレームワークUrushi
昨今の自粛生活の中で私のチーム内でもオンラインもくもく会(社内では通称「引きこもりもくもく」)が流行っているのですが、久しぶりにフロントエンドに触れようと思い立ったのが事の経緯です。
Flutterとは
Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.
FlutterはGoogle製のフレームワークです。クロスプラットフォーム対応はAndroidとiOSだけでなくWebまで行き届いていますが、これはReactNativeなど他のクロスプラットフォーム開発フレームワークでも同様ですね。
Flutterの特徴は、開発言語にDartという言語を採用している点です。DartはGoogle製のプログラミング言語なのですが、書き心地はJavaScriptに非常に近く、久しぶりにJSを嗜んだ私でもとっつきやすい言語でした。
やりたいこと
絶賛無人島生活🏝️を満喫していた私は、Flutterでもくもくするにあたって、「カブ価の推移を可視化する」というゴールを定めました。本記事ではカブ価についての詳細は割愛しますが、株価のように時系列に合わせて上下する値の推移を銘柄(島)ごとにグラフ📈化したい、というのが私のやりたかったことです。
Flutterは今回Web版を利用しています。バックエンドのDBについては、Firebaseでうまくライトにやれないかなー程度に考えていました(最終的にCloud Firestoreを採択してますが、それについては後述します)
実際にやってみる
まずは環境構築
兎にも角にもまずは環境構築をしていきます。私の端末はMac OSなので、MacOS用の手順に従って環境構築を進めていきます。ちなみに今回利用するのはWeb版なので、Web版向けの手順も合わせて実施する必要があります。
Flutterのバージョンを確認しておきましょう。Flutter Webを使うのでChannel betaを利用しています。
flutter --version |
さて、手順にはmockアプリをインストールしそれを動作するところまで含まれていますので、やってみましょう!
flutter create myapp |
これで必要なファイル群が myapp 配下に作成されます。 lib/main.dart が実際にimplementする対象のファイルになるのですが、一旦触らずにアプリの起動を確認します。
cd myapp |
以下のような画面が表示されれば成功です! 画面はとてもシンプルで、右下の「+ボタン」をクリックすると画面内のカウンタがインクリメントされていきます。
これでアプリの開発環境は整いました。では早速アプリの開発に移っていきましょう。
ChartJSプラグインを使ってグラフ表示を行う
Flutter(Dart)で利用できるプラグインはpub.devというページにまとまっているのですが、今回はその中からflutter_web_chartjsというWeb版Flutterで使えるChartJSライブラリを使うことにしました。
使いたいパッケージは pubspec.yaml というファイルに以下のような形で記載します。
dependencies: |
これで準備完了です。
Exampleに従ってアプリを実装すれば以下のような画面を表示できますが、詳細はここでは割愛します。
縦軸と横軸に該当するデータセット群を用意すればグラフを表示できることが確認できました。
FirebaseのDBと繋ぎたい
DBはなるべく簡単に扱えるものにしたく、Cloud Firestoreを使うことにしました。
ちなみに、Cloud Firestoreを使うかRealtime Databaseを使うか少しだけ悩んだのですが、そのへんはこちらの資料にまとめてあります。
諸々の背景は省きますが、「おとなしくCloud FirestoreをNative Modeで使おう」というのが私の結論です。
利用プラグインの追加
さて、実装に移っていきます。先程同様、まずは使いたいプラグインを pubspec.yaml に記載するところからです。cloud_firestoreを使うため、以下のように追記しました。
dependencies: |
Firebase Appの作成
次にFirebase Appの作成です。Firebase Consoleにて「アプリを追加」から作成し、 アプリID を取得します。
その際、以下のような形でHTMLファイルの修正も求められます。
今回は web/index.html が修正対象になります。この辺の経緯はGitHubページのREADMEにも記載があります。
Due to this bug in dartdevc, you will need to manually add the Firebase JavaScript files to your index.html file.
Web版のFlutterは鋭意アップデート中ということもあり、今後改善されていくポイントなんだろうなと思っています。
index.html のアップデート
必要な変更を加えた index.html の <body> タグは以下のようになりました。
<body> |
main.dart にて本実装
ここまでの下準備が整えば、本実装するのみです。
Example等を参考にしつつ実装を進めたのが以下です。
まずはimport文とmain文。FirebaseAppを設定してアプリを起動します。
import 'package:flutter/material.dart'; |
先程 runApp() に引数として渡された MyApp クラスの実体です。 _getChartData() が今回のキモとなる部分であり、FirestoreへのアクセスとChartJSで描画するデータセットの整形を担っています。
class MyApp extends StatefulWidget { |
ちなみにデータレコードは以下のような情報を持っています。
最後にStateクラスです。 MyApp クラスは StatefulWidget なのでこのStateクラスにてbuild処理を実装します。実装時に気にしたポイントは後述します。
class _MyAppState extends State<MyApp> { |
main.dart 実装時に気にしたこと
StatefulWidget vs StatelessWidget
ウィジェットには Stateful と Stateless の2種類があり、Flutter Doc JPでは以下のように説明されています。
今回利用しているChartJSプラグインにおいて ChartJS クラスは StatefulWidget として定義されていたため、 MyApp クラスは StatefulWidget で実装しています。用途的には、初回通信でのみ値を取得および描画できればよかったので、 StatelessWidget でも良いのかなと思いましたが、プラグインの実装に従う形で StatefulWidget を利用しています。
FutureBuilder vs StreamBuilder
素のBuilderを使うと、Cloud Firestoreのデータ取得が完了する前に画面の描画処理が走ってしまいます。そのため、非同期通信を待つBuilderを使う必要がありました。
非同期Builderには FutureBuilder と StreamBuilder の2種類があります。
- StreamBuilder
- 非同期処理の更新する変数が変化する度にウィジェットをbuildし直すBuilder
- FutureBuilder
- 指定した非同期処理の完了を待つBuilder
上記の説明はこちらのページから拝借しました。
今回のアプリでは初回のデータ取得のみを待てばよいので、Builderは FutureBuilder を利用しました。
おわりに
今回はFlutter入門記事ということで、簡単ではありますがFirebaseを利用したアプリ開発をご紹介させて頂きました。
それにしてもDartという開発言語、Future社員の私にとってFuture型の存在がなにか特別な感情をもたらしてくれました。
Flutterでアプリ書いてるけど何回も"Future"って登場してて、知らぬ間に愛社精神が磨かれてる気がする。Dart...お前まさか...
— Yasuhiro Murata (@famipapamart) April 26, 2020
…という冗談はさておき、書いている間に楽しい気分にさせてくれる言語というのもモチベーションの一部だと思うので、この感情はこれからも大事にしていきたいと思います。
春の入門祭り🌸 はまだまだ続きます! Future技術ブログ始まって以来の超大型連載、ぜひぜひ最後までお付き合いください!!