Flutterとは 何なのか 〜できること、できないこと

はじめに

私は、Watanabe Ryunosukeと言います。渋谷の会社でアプリ開発者としてフルタイムで働いています。
おもにFlutterを使用して開発しています。

Flutterを業務で使いはじめて数ヶ月が経ち、段々と慣れてきたこの辺りで「Flutterとは 何なのか」について整理しておこうと思い、この記事を書くことにしました。

この記事を読んで少しでもFlutterに興味を持ってくれる人がいたらいいな、と思います。

ただし書き

この文章はあくまで一人のプログラマとしての意見または感想です。
所属している会社の意向とは何も関係がありません。
また、ビジネスとしてFlutterが使えるかどうかについては何も書きません。


Flutterについて

Flutterは、Googleによって開発されたモバイルアプリケーションSDK (Software Development Kit)です。

Flutterの公式ページには下のように書いています。

Flutter allows you to build beautiful native apps on iOS and Android from a single codebase.
(Google翻訳: Flutterを使うと、iOSとAndroid上で単一のコードベースから美しいネイティブアプリケーションを構築できます。)
https://flutter.io/

つまり、クロスプラットフォームの開発技術です。
一つのコードを書けば、AndroidとiOSどちらのプラットフォームでもアプリケーションが動くという技術です。

上の文章を読んだ人に「そんな夢物語があるんですか。」と聞かれてしまったら、「ありません。」と答えます。(正直に)

ですが、「9割くらいは実現できています。」と答える事もできます。

以下では、その理由について書いていこうと思います。

Flutterが目指していること

Flutterが目指していることは、公式ページに書いてある言葉のとおりです。
つまり、「iOSとAndroid上で単一のコードベースからアプリケーションを構築することを可能にすること」です。

Flutterが出てくるより前にも、クロスプラットフォームモバイル開発の技術は沢山ありました。React NativeやXamarinなどです。

それらも目指すことは同じでした。ですが、Flutterは実現のためにそれらとは違ったやり方で臨んでいます。

Flutterの考え方

現実的な選択
まず、Flutterはクロスプラットフォームにおいて100%のコードを共通化しないという選択をしています。

各プラットフォームのOSの機能に大きく依存するコードについては、ネイティブの言語で実装する必要があります。(カメラ機能、通知機能、SharedPrefferencesなどです)※

これが、上で書いた「夢物語はない」理由になります。

独自のレンダリングエンジン

一方で、Skiaを用いた独自のレンダリングエンジンを実装しており、UIの部品やアニメーションなど見た目に関わるコードの共通化ができるようになっています。
これが、Flutterの最も重要な特徴だと考えています。

既存のクロスプラットフォーム技術との違い

React NativeやXamarinは、iOS・Androidの各プラットフォームのコードを呼び出して描画しますが、Flutterは独自のレンダリングエンジンで描画するという点で違います。

結果として、見た目に関わるコードを共通化して、パフォーマンスも悪くないアプリケーションの開発ができるようになっています。

これが、上で「9割くらいは実現できています。」とも答えられる理由です。

※従来のクロスプラットフォームと似た技術ですが、各プラットフォームのコードを呼び出すPluginという機構が提供されています。

Flutterとは何なのか

「Flutterって何なんだろう」とか「Flutterってどういう技術なんだろう」と思ってる方は沢山いると思います。

日々触っている私にも、よく分かりませんでした。

「クロスプラットフォーム開発」「独自のレンダリングエンジン」「HotReload」など特徴は挙げられても、一言で言い表すのは難しいと感じていました。

ですが、最近は下のように捉えるとしっくりきています。

Flutterは、
(最終的にアプリになってしまう)
「超高機能なプロトタイピングツール」
または、
「アプリケーション開発に特化したレンダリングエンジン」
である。

こんな風に捉えると、Flutterのいいところを引き出せたり、守備範囲ではないところも受け入れられると感じています。

この下の、私がFlutterを実務で使って感じた「できること」「できないこと」を読んでもらえると、少し雰囲気が伝わるかな、と思います。

できること

・UIのレイアウト、アニメーション、画面遷移などが簡単に実装できる

・Hot Reloadを使って、高速に開発ができる
 - デザイナさんと対面で実際に動く画面を見ながら、その場でデザイン修正する等もスムーズに出来ます

・コンポーネント指向、ビジネスロジックを分離するBLoC Pattern、Plugin機構によって、熟練度・得意分野の異なるプログラマの共同開発ができる

・ライブラリのソースコードが読めること、丁寧なコメントがされていること、丁寧なエラーメッセージで、容易にデバッグができる

・2Dゲームなどの複雑なアニメーションなども、Flutterの仕組みを理解していれば実装できる

できないこと

・プラットフォームに大きく依存する機能をネイティブのコードを書かずに実装する 
 - Pluginという機構を使って、プラットフォームに依存する機能を実装して、Flutter側から呼び出します
 - 公開されているPluginが要件に合えば、そのまま使えることもあります。

・各社が用意しているSDKをネイティブのコードを書かずに使う
 - 上と被る部分もありますが、Flutterは2018/12に1.0が出たばかりなので、各社Flutterで使えるSDKを提供していない場合がほとんどです。


まとめ

最後まで読んでいただきまして、ありがとうございます。

ここまで読んでくださった方はお分かりになるかと思いますが、私はかなりFlutterを支持しています。
元々趣味で始めましたし、今の職場に勤めるきっかけになったのはFlutterを技術採用しているからでした。

Flutterは慣れると、コーディングから実際に動作をさせるまでが、本当に速くできます。開発していると少しあっけない感じもあります。
ですが、毎日触っていると、時々フレームワークの設計や描画の仕組みなどで感動することがあり、学びがあります。
レンダリング周りのコードを理解すれば、大体どんな画でも描けるようになる、というのも魅力の一つです。

また、ここまでで書いたとおり、結局は各プラットフォームごとの実装の知識が必要になります。
各プラットフォームに対応するためのPluginも、公開されているものはまだまだ足りていないものもあります。
ですので、現在iOS・Androidのモバイルアプリケーション開発を行っている方が参入するとたくさん活躍の場があると思います。

最初に書いたとおり、この記事を読んで少しでもFlutterに興味を持ってくれる人がいたらいいな、と思います。

以上、「Flutterとは何なのか 〜できること、できないこと」でした。

この記事が気に入ったらサポートをしてみませんか?