セイロップの石垣です。
弊社では2019年4月からGoogle提供のクロスプラットフォーム「Flutter」に力をいれています。2020年12月までにFlutterを活用し、5つの新規アプリ開発を行いました。
優れたアプローチからアプリを開発できるので、スピーディーかつ予算を抑えたアプリの開発がしやすくなりました。
現代のアプリ開発ではFirebase(Googleが提供しているmBaaS)を用いる事が一般的になっておりますが、Firebaseとの相性が良い事も利点です。
弊社では提供するサービスにマッチする技術選定をしております。技術選定時にはメリット・デメリットを把握し、パートナー様にもお伝えするように努めております。
通常のアプリ開発ではiOSはSwiftやObjective-C、AndroidはKotlinやJavaでそれぞれ処理を記述する必要があります。
ネイティブ実装だとiOSとAndroidでそれぞれエンジニアが必要になりますし、チームごとに進捗管理工数やテスト工数がかかりますが、Flutterだと1チームでのアプリ開発が実現でき、コード量も抑えられる為、工数を抑える事ができます。
Googleの公式ドキュメントが充実しています。サンプルコードも豊富で開発者がキャッチアップをしやすいです。
2018年の段階ではFlutter公式以外の日本語ドキュメントが少ない事が開発者のハードルにはなっていましたが、Flutterを採用する企業やエンジニアが増えたことで日本語の技術記事も充実するようになりました。
Flutter公式
FlutterはWidget(部品)の組み合わせでアプリを作ります。Widgetは汎用性が高く、様々なレイアウトをスマートかつ柔軟に構築できます。
ネイティブだとiOSはStoryboardやxibファイルを使ってレイアウトファイルを作り、Androidだとxmlファイルを作り、コード部分とレイアウトのつなぎ込みが必要になります。
レイアウトファイルで作りきれないレイアウトはコード側で実装する必要があり、役割分担がしにくく、ソースコードの可読性が落ちるケースもあります。
それと比べるとFlutterはWidgetベースでレイアウトを組み込めるので、ソースコードの可読性を高めやすいです。
また、Flutter標準のアイコンデザインを活用すればデザイン費用も抑える事ができます。
Android端末は端末サイズが様々ですが、Googleのマテリアルデザインによって端末の差異を吸収でき、基本的にはどの端末でもUIが綺麗に表示されるようになっています。またボタンタップをした際の反応(リップルエフェクト)などもスマートに実装できます。
Flutterを使うとiOSでもマテリアルデザインを活用できます。iOSはiPhoneからiPad、iPhoneXなど形状が異なる端末が出てくる度にiOS側のレイアウトの仕組みが変わり、保守費用がかかる時代背景がありました。
iOSでもマテリアルデザインが使えるようになった事で端末の形状の違いはほぼ吸収できる為、将来発生しうるコストも抑えられますし、ボタンの反応を付けたいといった要望が出てきた時にも開発者が独自でロジックを書く必要がなく、マテリアルデザインを活用してスマートに実装できます。
FlutterはWidget(部品)を作り、ホットリロードによって素早く変更結果を確認できます。ネイティブのアプリ開発だと一部のレイアウト変更をしても実機で結果確認をする際は再度デバッグが必要になり、そこで開発工数がかかります。
Flutterのホットリロードを使うと、レイアウト変更をしたら即時に変更結果を確認できます。ネイティブだと基本GUIベースでレイアウトを作るので変更があった場合にGUIのつなぎこみを外し、再度作り直す必要が出てくる為、仕様変更コストがかかります。
Flutterはコードベースでレイアウトを作るので、変更があった時にコードを書き換えるだけで済むので仕様変更に強いです。
iOSとAndroidそれぞれでネイティブでレイアウトを作ると、それぞれレイアウトチェックなどのテスト工数がかかりますが、Flutterだと基本はどちらも同じような見た目で表示されるので、テスト工数を抑えられます。
画面遷移などの動作は開発者が意識しなくてもOSごとに適した動作になりますし、独自でOSごとに異なるロジックやレイアウトを表示する事も可能です。
ネイティブだとiOSアプリを作り終えてからAndroidアプリを作るケースもありますし、iOSとAndroidの開発チームで分かれて開発するので、チームのスキルや人数によって完成までにかかる期間が変わるケースもあります。
FlutterだとiOSチームとAndroidチームのような分離なく、1チームでアプリを開発できるので、アプリの同時リリースもしやすくなります。
基本的にはネイティブコードの呼び出しをすることなくアプリを作る事ができます。これまでの弊社開発実績でも95%以上はFlutter側(Dart)で完結しています。
機能要件によってはネイティブのコードを単体で実行する必要があるケースがあり、その場合はネイティブコード(SwiftやKotlinなど)の呼び出しが必要になります。
ネイティブ経験がある開発者であれば特に問題ないですが、ネイティブ経験がなければFlutterとは別にネイティブのキャッチアップも必要になります。
とは言え、iOSとAndroidそれぞれでエンジニアを確保したり、それぞれがキャッチアップをしていくにはかなりコストがかかります。必要性に迫られた時にネイティブ実装ができるFlutterはトータルコストを抑える事にも繋がります。
Flutterがサービスを正式リリースしたのは2018年12月。
そこからFlutterで扱えるコンポーネントや動作改善がスピーディーに進んでいますが、レンダリング周りやテキストのフォーカスなどの面ではネイティブの方が快適になるケースがあります。
ちなみに弊社が依頼を受けたFlutter案件(2020年12月までの案件)でFlutterがネックになった事はございません。
Flutterはあくまで技術選定を行う際の材料になります。Flutterに限った話ではございませんが、企業様の予算や要望に合わせて最適な技術選定を行っております。
ネイティブで用意されているライブラリと比べるとFlutterで用意されているライブラリの数はまだ少ないです。ネイティブだとライブラリを使って実装できる部分がFlutterだと独自実装になるケースもあります。
ライブラリの数はネイティブと比べて少ないですが、Flutter側が正式で提供しているWidgetなどのコンポーネントが豊富なので、ライブラリを使わずしてアプリを安全に組み込む事ができます。
ネイティブだとRx(Reactive Extensionsライブラリ)に依存するアプリが沢山ありますが、FlutterだとRxをほぼ使わなくてもアプリが作れるように設計されており、ライブラリ依存のような状態になりにくいです。
弊社ではFlutterの開発経験があるメンバーが複数在籍し、メンバーがキャッチアップや情報共有をしているので、安心感をもって案件を進める事ができております。
本記事がFlutterを導入する際の参考になれば幸いです。
記事を読んでいただき、ありがとうございました!