「えっ、これ一本で両方動くの?」と衝撃を受けた夜
あれは確か、2019年の夏だったと思います。
当時、私はフリーランスのエンジニアとして、あるスタートアップのアプリ開発を手伝っていました。
クライアントの要望はいつものやつです。
「iOSとAndroid、両方出したいです。予算は少なめです。納期は3ヶ月で。」
現場のエンジニアなら分かると思いますが、これは「デスマーチ確定」のフラグです。
SwiftでiOSを書き、Kotlin(当時はまだJavaも多かったかな)でAndroidを書く。
UIの挙動を合わせるために、デザイナーと何度も調整する。
片方のバグを直したら、もう片方で別のバグが出る。
そんな二重苦、三重苦が目に見えていました。
そんな時、海外のテックブログで話題になっていた「Flutter」というツールを、半信半疑で試してみたんです。
Googleが作っているらしいけど、どうせReact Nativeみたいなもんでしょ?
JavaScriptの非同期処理で沼るやつでしょ?
そんな軽い気持ちでした。
でも、チュートリアルを動かして、エミュレータ上のボタンを押した瞬間。
私の常識は粉々に砕け散りました。
コードを修正して Ctrl + S を押した瞬間、アプリが再起動することなく、画面が一瞬で書き換わったんです。
いわゆる「ホットリロード」という機能なんですが、これが魔法に見えました。
「待たなくていいの? ビルド時間はどこに行ったの?」
そして、書き上げたコードは、iPhoneでもAndroidでも、ピクセル単位で全く同じように美しく動きました。
「これだ。これで俺たちの残業はなくなる」
その夜、私は興奮して朝までドキュメントを読み漁りました。
あれから数年。今では私の主戦場は完全にFlutterになりました。
案件の単価も上がり、開発スピードは倍になり、何より「アプリを作る楽しさ」を思い出させてくれました。
かつての私のように「ネイティブ開発の二重管理」に疲れた人や、これから「最短でアプリエンジニアになりたい」人に向けて、Flutterの魅力と現実、そして稼ぎ方を、現場の泥臭い話を交えて徹底的に解説します。
教科書には載っていない、エラーと戦った時間の分だけ詰まったリアルなガイドです。

なぜ今、Flutter一択なのか? クロスプラットフォームの歴史と現在地
「クロスプラットフォーム」という言葉には、苦い思い出がある人も多いかもしれません。
かつては「Cordova」や「Monaca」といった、Web技術(HTML/CSS)でアプリを作るハイブリッドアプリが流行りました。
でも、あれは正直、「動きがモッサリ」していました。
ネイティブアプリ特有のヌルヌル感がなく、ユーザー体験(UX)はお世辞にも良いとは言えなかった。
その後、「React Native」が出てきて状況は改善しましたが、それでもOSのアップデートに追従するのが大変だったり、ネイティブモジュールとの連携で謎のエラーに悩まされたりしました。
そこに現れたのがFlutterです。
なぜFlutterが覇権を取りつつあるのか。技術的な理由はいくつかありますが、現場視点での「推しポイント」は以下の3つです。
1. 描画エンジンごと持っている強み
これ、初心者は「ふーん」で終わらせがちなんですが、めちゃくちゃ重要です。
他のクロスプラットフォーム技術は、OS標準のUI部品(ボタンとかリストとか)を呼び出して使います。だから、iOSとAndroidで微妙に見た目が違ったり、OSのバージョンによって崩れたりするんです。
でもFlutterは違います。
ゲームエンジンのように、Skia(スキア)という描画エンジンを使って、「全部自前で絵を描いて」います。
ボタンも文字も、Flutterがピクセル単位で描画しています。
だから、OSのバージョンや機種に関係なく、「開発者が意図した通りのデザイン」が100%再現されるんです。
デザイナーから渡されたFigmaのデザインを、1ミリのズレもなく実装できた時の快感と言ったらありません。
2. Dartという言語の「ちょうど良さ」
Flutterは「Dart(ダート)」という言語を使います。
「えー、また新しい言語覚えるの?」と思いましたよね。私も思いました。
でも、Dartは驚くほど「普通」なんです。
JavaやJavaScript、C#を触ったことがある人なら、3日あれば読めるようになります。
変なクセがない。Googleが「UI構築のために最適化した」と言うだけあって、痒い所に手が届く仕様になっています。
特に最近導入された「Null Safety(ヌルセーフティ)」は強力です。
「ここで変数が空っぽ(Null)になる可能性があるよ!」と、コードを書いている最中に教えてくれます。
おかげで、アプリが突然落ちる(クラッシュする)事故が激減しました。
3. 圧倒的な開発スピード(ホットリロード)
冒頭でも触れましたが、ホットリロードは麻薬です。
ネイティブ開発だと、ちょっと文字色を変えただけで、ビルドして、インストールして、起動して…と数分待たされることがザラにあります。
この数分の待ち時間が、エンジニアの集中力を削ぐんです。Twitter見ちゃうんです。
Flutterなら、保存して1秒未満で反映されます。
UIの調整をしながら、「あ、ここもうちょっと右かな」「色はこっちがいいかな」と、デザイナーと画面を見ながらリアルタイムで修正できます。
このスピード感を知ってしまうと、もう元には戻れません。

環境構築:最初の難関「パスが通らない」問題
さて、やる気が出てきたところで、最初の壁にぶつかっていただきましょう(笑)。
環境構築です。
Flutterは、導入のハードルが少しだけ高いです。
特にWindowsユーザーと、M1/M2/M3チップのMacユーザーは、それぞれ別の罠が待ち受けています。
flutter doctor の診断を受けよう
Flutterのインストール自体は公式サイトからSDKをダウンロードするだけなんですが、その後にコマンドラインで実行する flutter doctor という診断ツールが鬼門です。
このコマンドを打つと、あなたのPCの状態をチェックして、「ここがダメ」「あそこが足りない」と教えてくれるんですが、最初は真っ赤なバツ印だらけになります。
- Android Studioが入ってないぞ
- Android SDKのライセンスに同意してないぞ
- Xcodeが入ってないぞ(Macの場合)
- CocoaPodsがないぞ
これらを一つ一つ潰していく作業は、RPGのレベル上げに似ています。
特に「パスを通す(Path)」という作業。
ターミナル(黒い画面)に慣れていない人は、ここで「コマンドが見つかりません」と言われて心を折られます。
私も新しいPCを買うたびに、環境変数設定で一瞬悩みます。「あれ、zshrcだっけ? bash_profileだっけ?」と。

現場のアドバイス:VS Codeを使おう
開発エディタ(コードを書くソフト)は、「Android Studio」か「VS Code(Visual Studio Code)」の二択です。
Google公式はAndroid Studioを推していますが、私はVS Codeを強くおすすめします。
理由はシンプル。「軽いから」です。
Android Studioは高機能ですが、メモリを馬鹿食いします。ChromeとSlackとAndroid Studioを開いたら、メモリ16GBのMacBookでもファンが唸り始めます。
VS Codeならサクサク動きますし、拡張機能も豊富です。最初はVS Codeで十分です。
実践:Flutterアプリの構造と「Widget」の考え方
環境構築というドラゴンを倒したら、いよいよコードを書いていきます。
Flutterを理解する上で、たった一つ、絶対に覚えなければならない概念があります。
それは、「Everything is a Widget(すべてはウィジェットである)」 ということです。
マトリョーシカの世界
Flutterのコードは、ウィジェット(部品)の中にウィジェットを入れる、という入れ子構造(ツリー構造)で作られます。
画面全体がウィジェット。その中のセンター配置用のウィジェット。その中のボタンウィジェット。その中のテキストウィジェット。
まるでマトリョーシカです。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('初めてのFlutter'),
),
body: Center(
child: const Text('Hello, World!'),
),
),
);
}
}
このコードを見て、「うわ、カッコ () とか閉じ括弧 } が多いな」と思いましたか?
正常な反応です(笑)。
Flutterのコードは、ネスト(入れ子)が深くなりがちです。
これを綺麗に整形するために、VS Codeの設定で「保存時に自動フォーマット」をオンにしておくことが、精神衛生上きわめて重要です。
Stateless と Stateful の違い
もう一つ、初心者が必ず躓くのが「StatelessWidget」と「StatefulWidget」の違いです。
- Stateless(ステートレス): 状態を持たない。一度描画されたら変化しない。静的な画面。
- Stateful(ステートフル): 状態を持つ。データが変わると画面が再描画される。動的な画面。
例えば、「ただの画像を表示するだけ」ならStateless。「ボタンを押したら数字が増えるカウンター」ならStatefulです。
最初は「画面が動くならStateful」と覚えておけばOKです。
現場レベルでは、この状態管理をもっと効率的に行うために「Riverpod」というライブラリを使うのが鉄板ですが、それは脱初心者してからで大丈夫です。

初心者がハマる「レイアウトの沼」
コードが動くようになると、次に作りたいデザインを作ろうとして、「レイアウトが思った通りにならない」という沼にハマります。
これは100%通る道です。
Column と Row の使い分け
Flutterのレイアウトは、基本的に「縦に並べる(Column)」か「横に並べる(Row)」かの組み合わせで作ります。
これ自体は単純なんですが、「要素を端に寄せたい」「均等に並べたい」という時に、MainAxisAlignment と CrossAxisAlignment というプロパティを使います。
これがどっちがどっちだか、いつまで経っても覚えられないんです(笑)。
私は今でも、迷ったら両方試して「あ、こっちか」とやってます。そんなもんです。
Container のサイズ問題
「画面いっぱいに広げたいのに、なぜか小さくまとまってしまう」
「画像が画面からはみ出して、黄色と黒の警告バーが出る」
これもFlutterあるあるです。Expanded や Flexible といったウィジェットを使って、「余ったスペースを埋める」という指示を出してあげる必要があります。
この感覚は、実際にコードを書いて、画面が崩れるのを見て、直して…を繰り返さないと身につきません。
座学では無理です。とにかく崩してください。

副業エンジニアとしてのFlutter戦略
さて、ここからはお金の話をしましょう。
「Flutterを覚えたら、本当に稼げるの?」
答えは YES です。しかも、かなり効率よく。
案件のトレンド:新規開発とリプレイス
今、クラウドソーシングやフリーランスエージェントには、Flutter案件が溢れています。
大きく分けて2つのパターンがあります。
- スタートアップの新規開発(PoC)
- 「とにかく早く、安く、iOSとAndroid両方出したい」という需要。
- Flutterの独壇場です。MVP(実用最小限の製品)を作るなら、ネイティブで作る理由がありません。
- 単価はピンキリですが、丸ごと請け負えば50万~100万円以上も狙えます。
- レガシーアプリのリプレイス
- 「昔作ったJavaのAndroidアプリとObjective-CのiOSアプリを、Flutterで作り直して統一したい」という需要。
- これは企業案件に多いです。保守コストを下げたい企業の切実な願いです。
- 長期契約になりやすく、月単価80万円~の準委任契約も狙えます。
ひとりで「全部」作れる強み
Flutterができるということは、「ひとりでiPhoneアプリとAndroidアプリの両方を作れる」ということです。
これはクライアントからすると、コミュニケーションコストが半分になることを意味します。
「iOS担当のAさんと、Android担当のBさん」に指示を出すより、「Flutter担当のあなた」一人に頼む方が圧倒的に楽なんです。
だから、単価交渉でも強気に出られます。
「一人で両方対応するので、1.5人分の単価をください」と言っても、クライアントにはメリットがあるので通ります。
ポートフォリオには「Firebase」を組み合わせろ
未経験から案件を取るためにポートフォリオを作るなら、ただのToDoアプリでは弱いです。
必ず Firebase(ファイヤーベース) を組み込んでください。
FirebaseはGoogleが提供するバックエンド(サーバー側)のサービスです。
これを使うと、ログイン認証、データベース、画像保存などの機能が、サーバー側のコードを書かずに実装できます。
Flutter × Firebase は「個人開発の黄金コンビ」です。
この構成で、「ログインできて、データを保存できて、リアルタイムに更新されるチャットアプリ」なんかを作ってストアに公開すれば、即戦力として見てもらえます。
採用担当者は「動くアプリがストアにあるか」を一番に見ます。GitHubのコードよりも、App StoreのURLの方が100倍強いです。

FAQ:初心者が抱える不安に答えます
ここで、私がメンターとしてよく受ける質問に答えておきます。
Q. 本当にMacがないとダメですか?
A. 本気で仕事にするなら、Macが必要です。
WindowsでもFlutter開発はできますし、Androidアプリは作れます。でも、iOSアプリをビルド(生成)するにはMacが必須です。これはAppleの規約と仕組み上の問題なので回避できません。
学習段階ならWindowsでもOKですが、案件を受ける段階になったら、経費だと思ってMacBook Air(M1以上)を買ってください。絶対に元は取れます。
Q. 英語が読めないと厳しいですか?
A. 厳しいですが、無理ではありません。
Flutterの一次情報は公式ドキュメント(英語)です。エラーメッセージも英語です。
でも、今はDeepLやChatGPTがあります。エラー文をコピペして「これどういう意味?」とAIに聞けば、日本語で優しく教えてくれます。
英語力よりも、「わからないことを調べる力」の方が大事です。
Q. SwiftやKotlin(ネイティブ)は勉強しなくていいの?
A. 最初はしなくていいです。
Flutterだけで95%のアプリは作れます。
残りの5%(カメラの高度な制御やBluetoothなどの特殊な機能)でネイティブの知識が必要になることがありますが、それは壁にぶつかってから勉強すれば遅くありません。
まずはFlutterで「アプリを作る楽しさ」を知ってください。
Q. 挫折しそうです。どうすればいいですか?
A. 完璧を目指さないことです。
レイアウトが崩れても、コードが汚くても、動けば正義です。
そして、Twitter(X)などで「Flutter学習中」と発信して、仲間を見つけてください。
QiitaやZennの記事を読むのもいいですが、一番いいのは「自分の作りたいアプリ」を作ることです。
「推しの活動を記録するアプリ」とか「近所のラーメン屋をメモするアプリ」とか。
自分のために作る時が、一番成長します。
世界を変える武器を、その手に
長々と語ってきましたが、私が伝えたいことは一つです。
「Flutterは、個人の可能性を最大化するツールだ」 ということです。
かつては、アイデアがあっても、それを形にするにはiOSエンジニアとAndroidエンジニアを雇うか、自分が何年もかけて両方を学ぶしかありませんでした。
でも今は、Flutterがあります。
あなたの頭の中にあるアイデアを、たった一つのコードベースで、世界中の何十億人というスマホユーザーに届けることができるんです。
もちろん、学習には苦労もあります。
環境構築でハマり、レイアウトの沼に沈み、赤いエラー画面に枕を濡らす夜もあるでしょう。
でも、その先には「自分の作ったアプリが、誰かのスマホの中で動いている」という、何物にも代えがたい感動が待っています。
プログラミングスクールに通うのもいいですが、まずは公式サイトを開いて、インストールしてみてください。
その一歩が、あなたのエンジニアとしてのキャリアを、そして人生を変えるかもしれません。
さあ、エディタを開きましょう。
Hello, World! の向こう側へ。

