新規アプリをFlutterで開発し始めて4ヶ月
Flutterでプロダクトコードを書きはじめて4ヶ月目に入りました。
僕は元々iOSエンジニアで、5年くらいiOS/Swift/Objective-Cを使った開発をしていました。今は社内異動を機にFlutterを使って新規アプリを開発しています。
先日Flutterはモック的に作れるのが長所の一つなのに、4ヶ月も経ってまだリリースしてないの?ととある先輩に煽られました。色々あるんです。
Flutterを趣味で使っている方をTwitterで見かけたり、Flutterの日本語文献を見ることが増えてきたりと、Flutterへの注目度が少しずつ上がってきているなと個人的に感じてきている中で、「せっかくFlutterを仕事で使っているんだからアウトプットしなよ」と僕が兄と慕う先輩に背中を押されたので、Flutterでプロダクトコードを書きはじめて4ヶ月目のこのタイミングで、よく同僚から聞かれる質問に対する僕の考えをまとめようと思います。
実際Flutterどうなのよ?
なんだそのザックリとした質問は。
といつも思いつつも、一番多い質問な気がします。1, 2ヶ月目のときによく聞かれましたが、未だにこの質問はよく聞きます。
僕の返答も1, 2ヶ月目のときと変わってなくて、「今のところ良い」です。
趣味で使うのであればともかく、仕事でプロダクトに使うにはまだrelease previewですし、変更も多くバグもまだまだ多いのでめちゃくちゃオススメするということはできないです。
ただ、それでも今のところ大きな問題もなく仕様通りのアプリを作れています。
Flutterが提供しているWidget (UIパーツ)の中に自分たちが欲しいものがない場合や多少のバグがある場合は、自作するなりラップするなりで対応できています。
僕はiOS出身ですが、UI構築に関しては基本的にはiOSよりも簡単に素早く実装できると感じています。
ただ、Android/iOS特有の機能にアクセスする場合はとても面倒です。
例えば、カメラを起動する、カメラロールから画像を取ってくるなどがそれです。
FlutterにはPlatform Channelsという機能があり、それを使うことでそれぞれのOSのコードと通信することが可能です。
Android/iOSそれぞれのコードを書く必要が出てくる上、型も限られていたりとなかなか面倒です。
ただ、ここらへんはライブラリがそれなりに揃っているので、凝った処理をする必要がないのであればライブラリに頼れば問題はないです。
ちゃんとAndroid/iOSのUIになるの?
これもよく聞かれます。僕はiOS出身でAndroidっぽいUIというものが曖昧なので、iOSっぽいUIになるかという質問に対しての答えになりますが、頑張れば頑張るほどYESに近づくという感覚です。
Flutterが提供しているサンプルのように、シンプルに作れば基本的にはMaterialになります。Googleが提供しているので当たり前と言ったら当たり前です。
ただ逆らうことはある程度できるようになっています。
OSの判定自体は簡単にできるので、あとはWidgetの出し分けになりますが、そこをサボらなければある程度それぞれのOSのデザインを共存させることができます。
Flutterが提供しているiOS用のWidgetもありますし、提供していないものがあれば自作も可能です。
Dartはどうよ?
今のところ好きではないです。笑
先日iOSエンジニアの先輩後輩に「iOSを捨てた人だ」といじられましたが、これでもSwiftが恋しいんですよ。笑
具体的にどこが好きじゃないかというと、まずはinterfaceの概念がないところです。
Dartにはabstract classはあるもののinterfaceがなく、クラスをextendsするかimplementsするかでそのクラスの振る舞いが変わります。
class A extends SomeClass {} // SomeClassを継承する子クラスA
class B implements SomeClass {} // SomeClassを実装するクラスB
protocol orientedなSwift出身者からすると最初はなかなか不便に感じます。
また、enumが弱いところも不便に感じます。
これはDartがダメというよりはSwiftの強力なenumに自分が慣れてしまっていたということだと思います。
Swiftではenumの各要素に型やassociated valueを与えることができます。あれがいかに便利なものだったのかをDartを始めて痛感しました。
Dartは本当にただの列挙型です。列挙するだけ。Javaと一緒かな?列挙型という字を見るとSwiftの方が異常なのかもしれません。
例を出すと、今のプロジェクトのアーキテクチャにはReduxを採用しているんですが、ReduxやFluxのActionはSwiftだとclass/structじゃなくenumを使っても定義できると思います。
enum ListAction: Action {
case getMessages(limit: Int)
case getNext
...
}
// ...
store.dispatch(.getMessages(limit: 20))
こんな感じで。(Swift久しぶりに書いたので合ってるかわからない)
Dartだとこれを全てclassで書かねばなりません。。
class GetMessages {
GetMessages(this.limit);
final int limit;
}
class GetNext {}
// ...
store.dispatch(GetMessages(20));
どのActionなのかの条件分岐のためだけに空のクラスを作るのはなかなか気持ち悪いです。
と、色々書きましたが、単純に僕がまだまだDartを使いこなせていないだけということも十分あるので、これからもDartと仲良くなるために精進していきます。
Android/iOSエンジニアどちらか片方だけでも開発できる?
難しいと思います。
僕は今Android出身のエンジニアの方と一緒に開発していますが、その方がいなかったらかなり厳しい進捗になっていたと思います。
やはりどうしてもAndroid/iOSのコアな部分を触らなければならないことはあります。
FlutterやライブラリのバージョンがあがってどちらかのOS特有のバグが起きたり、CIがコケてエラーメッセージを読んでも意味がわからなかったり、Push通知もそれぞれ仕様が違ったりと、1チームに両OSのバックグラウンドがある人がいないと時間がかかってしまう案件が多々あります。
今からFlutterで開発しつつ両OSについて学んでいくということは時間をかければ可能だと思いますが、仕事でプロダクトを作るようにスピード感を持って開発を進めることは厳しいのではないかと思っています。
楽しい?
めちゃくちゃ楽しいです。
まだまだ文献が少ない中で、ああでもないこうでもないとチームメンバーと話したり、自分で考えたりするのはとても刺激的です。
Androidエンジニアと一緒に同じプロダクトを開発すると、それぞれの書き方の違いとか文化の違い(?)とかが目に見えてとても面白いです。
懸念は?
よく言われてますが、やはり動画です。
時代が時代なので、動画の案件は増えてくると思われますが、Flutterはまだ動画のWidgetを提供できていません。
ライブラリはあるものの、正直実用的な出来かと言われたら厳しいと僕は思っています。
いずれFlutterが対応してくれるのではと思っていますが、動画を扱うアプリにFlutterを採用するのはまだやめた方がいいと個人的には思います。
あとは画像加工系もまだライブラリも揃っていませんし、厳しいのではないでしょうか。
最後に
Flutterはまだまだ発展途上なので、今後どういう状態になっていくか分からず不安な部分も多々ありますが、自分が開発しているプロダクトがFlutterの良い事例になってFlutter開発者が増えたらいいなあと思います。
そのためにも良いプロダクトを作らねば!!
Twitterはこちら https://twitter.com/kitoko552