概要
Flutterをさわりはじめて一ヶ月程度、2,3個の単純なアプリを作ってみたので雑感を書いておこうと思います。
執筆時点での手元の環境は以下。
$ flutter --version
Flutter 0.9.4 • channel beta • https://github.com/flutter/flutter.git
Framework • revision f37c235c32 (3 weeks ago) • 2018-09-25 17:45:40 -0400
Engine • revision 74625aed32
Tools • Dart 2.1.0-dev.5.0.flutter-a2eb050044
Dartは基本的に素晴らしい。が、少々オッサンくさい
先に述べておきますが圧倒的Dartファンです。
7,8年前にGoogleがJavaScriptを再発明すると言ってDashを公開したときから熱視線を注いでいました。当時、Android開発をJavaで書きつつ、これからはDashに移行していくんだろうと強い期待を寄せました。
ところが一向に「その時」は訪れず、そうこうしている間にSwiftやらKotlinなどモダンな言語が現れ*1、自分のなかでもDartは完全に忘れ去られた存在となっていました。
こうして再びDartを書けるとは思ってもみませんでした。
その間、Dartは2.0となりStreamやFutureなど新しい機能が取り込まれています。構文もnew不要でインスタンス生成ができるなど他のモダン言語を必死でキャッチアップしようとする姿勢に好感が持てます。
一方でセミコロンが必須だったり、null safetyが存在しなかったりレガシー感というかオッサン臭さがあるのも事実です。こうしたマイナスポイントはDart2.5や3.0などで解消してくれると嬉しいですね。
世界はWidgetでできている
基本的にあらゆるものがWidgetを継承します。ボタンやテキスト、レイアウトやマージン、グリッド、画面そのものもWidgetで構成されます。
Unityに置きかえるとGameObjectに相当するでしょうか。
Flashに置きかえるとDisplayObjectに相当...いや、やめよう。
そこにはLayout.xmlなどない
Flutterではテキストやボタンなど上記Widgetの配置はすべてDartコード内で行います。他の開発環境のようにレイアウト定義のファイルは存在しません。また、React NativeのJSXのようなレイアウト専用記述フォーマットもありません。
ひたすらWidgetをnewしてコードを書いていきます。(new 演算子は省略可)
インタラクティブコンテンツやゲームの開発環境では割とよくある手法ですが、それ以外の領域(いわゆる一般的なアプリ開発)では何かしらのレイアウト定義ファイルがあって当たり前だと思っていました。個人的に一番驚いた点でした。
Flutterコミュニティでも議論されているようですが、当面はいまの手法が採用されていくんじゃないかと思います。
蛇足ですが、Column,RowといったWidgetの縦横が、自分の脳内とは真逆で混乱したのはナイショです。
HotReload
前述した "ひたすらWidgetをnewしてコードを..." を繰り返しながらHotReloadでプレビューします。はっきりいって神機能です。
ですが、シンタックスエラーや例外が発生するとHotReloadに失敗し、エラーを修正しても反映されない場合があります。コードを修正しても見た目が変わらないな...と思ったら一度デバッグを止めて再度ビルドしたほうが確実そうです。
Buildがいまいち不安定
必要なライブラリをimportしていなくてもビルドが成功し、ランタイムでFlutterErrorを吐くことがあります。VSCodeのPROBLEMSにWarningとして表示されますが、コンパイル時にエラーを出してほしいです。
ただし、このへんはAndroidStudioやrelease buildでは挙動が異なるかもしれません。
VSCodeは快適
今更ですがVSCodeは快適この上ないです。軽量IDEなのでビルドタスクなど自前で構築が煩雑なのではと懐疑的でしたが全ては杞憂でした。
サクサク書いて、ビルドして、実機確認して、ホットリロードで更新する。今までどうやって開発してたのか思い出せなくなるくらい快適です。
flutterstudioはまだまだ不完全
レイアウト構築ツールとしては https://flutterstudio.app/ でWYSIWYGな作業ができる...わけではありません。WYSIWYGな地平を目指してはいると思いますが、現状では実用には耐えうるものではありません。
いずれAndroidStudioにレイアウトツールが統合されるのではないかと期待しています。
それでは今回はこのへんで。
追記
*1 Kotlinは2011に発表されているので初出はDartと大差ないとツッコミを頂きました。