Flutterを導入して感じたこと
業務でFlutterを導入しました。その時に感じたことを、書いていきます。今後、導入を検討されている方の参考になれば幸いです。
また、私はFlutterが好きで推進派ですが、極力第三者の立場で書きたいと思っています。
環境構築
公式にも詳しく載っていますし、最近はQiita等にも多くの記事がありますので、特に苦労はしないと思います。
私もQiitaに環境構築についての記事を書いています。
Flutterバージョン
Flutterのバージョンは比較的早く上がっていくので、どのバージョンを使うのか、悩ましいところがあります。
(Flutterのバージョン一覧)
安定板であるstable channelで開発を行う、と決めていても、後から合流したチームメンバーが新たに環境構築したらstable channelのFlutterバージョンが上がっていてビルドが通らない、などということも十分にあり得ます。あるいは、CIを回している場合、開発環境とCI環境のバージョン差分があった場合なども、気づきにくいです。
そのためにも、言及している記事は少ないですが、pubspec.yamlには下記のようにどのバージョンを使用するのか明記するべきだと思います。
environment:
flutter: 1.2.1
また、Flutterを特定のバージョンに切り替えるコマンドはこちらです。ただし、バージョンの切り替えには数分ほど時間がかかります。
$ flutter version バージョン名
channelの変更はこちらです。
$ flutter channel チャンネル名
プラグイン
確かに充実しています。が、crashlyticsもつい最近1.0がリリースされたばかりだったり、まだ発展途上であることも否めません。足りないこともあれば、似たようなプラグインが乱立していてデファクトスタンダードが存在しません。
私の後輩は、WebViewをダイアログ内に出すためだけに、色々なプラグインを試して苦労していました。
また、現在はAndroidXへの過渡期であり、Android側の実装やプラグインの開発状況によっては苦労するかもしれません。
Flutterの不具合
私はARKitを使っていたのですが、openGL系の不具合に遭遇しました。他にも、特定の条件下でFlutter engine(描画エンジン)の不具合により、画面が描画できなくなる不具合などに遭遇しました。
何が問題なのかとてもわかりづらく、調査工数がかなり割かれますし、場合によってはアプリ側では回避できず、Flutter側の改修を待つ必要や、Flutterのバージョンを特定のものにする必要があるかもしれません。stable channelだから、とまだ手放しで安心できませんし、master channelに切り替える必要性に迫られたとき、他で不具合が起きないという確証もないため、不安な気持ちにはなります。
ちなみに、公式にBad Buildsという既知の不具合がいつくか載っていますので、stable以外に切り替える場合はこちらに目を通した上で採用を検討してください。もちろん、ここに書いてあるのが全てではないので、これ以外にも致命的な不具合がある可能性も考慮しておいてください。
Dartという開発言語
言語としてはSwift/Kotlinが圧倒的に書きやすいと思います。(個人的主観)
ですが、Dart2で格段に便利になりましたし、Dart自身の学習コストは比較的低いように感じます。非同期処理もasync/awaitで完結に記述できます。
また、下記の記事によるとDartの採用理由のひとつとして、他言語からの移行が容易という点も挙げられています。
Why Flutter uses dart?(翻訳記事もあります)
ただし、効率的な良いコードを書こうとすると、Widgetの仕組みなどを理解しておく必要があり、マスターするには時間がかかる印象です。私自身も、まだ理解できていないところが多いです。
Dartでレイアウトを組む
上記でDartへの移行は容易である、と述べましたが、実際にレイアウトをDartで組むのに慣れるまでは確かに大変です。簡単なことをしようと思っても、どんなWidgetを使えばいいのか予測しづらいため、検索も難しいです。(勘が効かない)
さらに、Androidのxmlのようなレイアウトプレビューがまだ提供されていないこともそれに影響していると思います。Hot reloadが強力なので、実際に実装を進めている間は気にならないことも多いですが、画面を開いた時にどんなレイアウトなのか分かりづらいことはあるので、プレビューは早く欲しいのが本音です。issueは上がっていますので、気になる方はこちらをチェックしてみてください。
why Flutter can't show preview just like Android Studio?
一方、xmlやstoryboardのように、中でなにやってるのか分からない、ということも少ないので、レイアウトの不具合が起きても調査はしやすいかもしれません。あと、storyboardのように人が読めないものではないのでconflictしても頑張れば解決できます。
ネイティブとのハイブリッド
Flutterからネイティブの機能を呼び出したり、特定の画面はネイティブで実装したりということは簡単にできます。
Method Channelについて記事を書いてますので、こちらもご参考にどうぞ。
一方、既存のAndroid/iOSからFlutterを呼び出す機能はAdd-to-App projectとして現在開発中のようです。master channelで利用することはできるので、それについての記事も書いています。(あまり利用シーンはないかもしれませんが…)
既存のAndroid/iOSアプリからFlutterを呼び出す(Add-to-App project)
さいごに
いくつかポイントを上げましたが、それぞれの感じ方は人それぞれだと思います。安易に考えすぎるのも危険ですが、怖がりすぎるのも、それはまた違うと思います。
Flutterの開発スピードは早く、ここに書いたことも1年後にはすべて解決しているかもしれません。Flutterを採用することはある程度のリスクも背負う覚悟も必要だと思いますが、それ以上に楽しいです。Flutterの進歩を、もっと間近で感じてみませんか?