Start Debugging

Flutter vs React Native vs .NET MAUI: 2026 年の新しいモバイルプロジェクトでどれを選ぶべきか

2026 年にグリーンフィールドのモバイルアプリを始める場合、ピクセル単位で同一の UI とアニメーション予算が重要なら Flutter 3.44 を、チームがすでに TypeScript で生活しておりリアルなブラウザ兄弟が必要なら React Native 0.82 を、iOS と Android がより広い .NET 製品の一部であり Microsoft の純正サポートが必要なら .NET MAUI 11 を選びましょう。

今日始まる新しい iOS と Android のアプリにとって、正直な答えはこうです。ピクセル単位で同一の UI、ジャンクのない 120 Hz アニメーション、単一の Dart コードベースが優先事項なら Flutter 3.44 を選びましょう。エンジニアリングチームが TypeScript ファーストで、JS パッケージエコシステムをすぐに使いたく、将来のブラウザ版が視野に入っているなら React Native 0.82 を選びましょう。モバイルがより広い .NET 11 製品の 1 つのサーフェスにすぎず、サポート契約に Microsoft が乗っていることが譲れないなら .NET MAUI 11 を選びましょう。パフォーマンスはビジネスアプリの 95% で同点です。チームの適合性とエコシステムの適合性があなたの代わりに選びます。

この記事は、Flutter 3.44 (2026 年 5 月から安定版、Material 3 パッケージを分割)、React Native 0.82 (2026 年 4 月から安定版、New Architecture が必須、Bridgeless がデフォルト)、.NET MAUI 11 (執筆時点でプレビュー、GA は 2026 年 11 月予定、Android と iOS で CoreCLR がデフォルト) を対象としています。3 つとも iOS 18 と Android 15+ に配信でき、3 つとも hot reload をサポートし、3 つとも App Store と Play Store に出荷例があります。プロジェクトを実際に左右する違いは、言語、レンダリングモデル、エコシステムの成熟度、そしてバックエンドを書き直さずにチームを乗せられるプラットフォームです。

2026 年における各フレームワークの実態

Flutter 3.44 は Dart ファースト、Skia でレンダリングする UI ツールキットです。すべてを自前で描画します。ButtonUIButton でも AppCompatButton でもなく、使用した Material または Cupertino ウィジェットに基づいて Flutter エンジンが描画したピクセルそのものです。iOS ユーザーはネイティブに見える Cupertino テーマのウィジェットを、Android ユーザーは Material 3 のウィジェットを得ますが、フレームワークがあらゆるレイアウトとジェスチャを所有します。3.44 リリースで materialcupertino は別パッケージに移され、iOS 側では Swift Package Manager で配布されるようになりました。これによりモジュール単位の差分は追いやすくなりますが、pubspec.yaml に一度きりの移行コストが加わります。

React Native 0.82 は、turbo-modules ブリッジ経由でネイティブの iOS と Android のビューにマッピングする JavaScript / TypeScript フレームワークです。0.78 以降は New Architecture (Fabric レンダラー + TurboModules + JSI) が新規プロジェクトのデフォルトとなり、0.82 以降はレガシーブリッジが完全に削除されました。Bridgeless モードは、可能な場合に JavaScript がネイティブコードを同期的に呼び出すことを意味し、これにより歴史的な “RN は遅く感じる” という不満は 2026 年には 2022 年ほど真実ではなくなっています。JS エンジンは両プラットフォームでデフォルト Hermes、expo が事実上のビルドオーケストレーターです。素の react-native init テンプレートはまだ存在しますが、新しいアプリの推奨経路ではなくなりました。

.NET MAUI 11 は Microsoft の純正フレームワークです。プラットフォームネイティブのコントロールをラップします。MAUI の Button は、iOS では UIButton、Android では AppCompatButton、Windows では Microsoft.UI.Xaml.Controls.Button、Mac Catalyst では NSButton です。.NET 11 で Android と iOS のデフォルトランタイムが CoreCLR になり、Flutter と RN との歴史的な起動時間ギャップの大半が埋まりました。MAUI は WinUI 3 や Blazor Hybrid と同じ XAML / C# スタックを共有するので、最も理にかなうのは iOS と Android が Windows デスクトップや Blazor Web 製品の兄弟である場合であり、モバイルが宇宙のすべてである場合ではありません。

機能マトリクス

機能Flutter 3.44React Native 0.82.NET MAUI 11
主要言語Dart 3.7TypeScript / JavaScriptC# 14
レンダリングモデルSkia、プラットフォーム間で同一のピクセルFabric / TurboModules 経由のネイティブビュープラットフォームごとのネイティブコントロール
iOSはいはいはい
Androidはいはいはい
Windows デスクトップはい (3.16 から安定版)コミュニティ (react-native-windows)はい (WinUI 3)
macOS デスクトップはい (3.16 から安定版)コミュニティ (react-native-macos)Mac Catalyst
Linux デスクトップはい (3.10 から安定版)いいえいいえ
Web (ブラウザ)プレビュー、大規模アプリ向けはプロダクション非対応はい (React DOM 経由、コード共有は限定的)いいえ (Blazor Hybrid は別建て)
Hot reloadサブ秒、ステートフルFast Refresh、ステートフルはい (.NET 11)
Android のデフォルトランタイム (.NET 11)AOT コンパイル済み DartHermes JSCoreCLR
デフォルト IDEVS Code、Android StudioVS Code、WebStormVisual Studio 2026、Rider
パッケージエコシステムpub.dev、5 万以上のパッケージnpm、JS の全世界NuGet、.NET エコシステム
純正サポートGoogleMeta + コミュニティMicrosoft
New Architecture / ランタイムベースライン常時 AOT0.80 以降必須.NET 11 Preview 4 以降 CoreCLR がデフォルト
ライセンスBSD-3MITMIT
状態管理のデフォルトRiverpod、Bloc、ProviderRedux Toolkit、Zustand、TanStack QueryCommunityToolkit.Mvvm

ほとんどのプロジェクトを決めるのは 3 つの行、主要言語、レンダリングモデル、純正サポートです。残りは細部の調整です。エンジニアリングチームが TypeScript を書き、バックエンドが Node なら、React Native への移行は数か月ではなく数日です。チームが .NET と Entity Framework Core に対して C# を書いているなら、MAUI は DTO、検証、さらには ViewModel を Web 層と共有できるようにします。Flutter は、生産的な言語が事実上フレームワーク固有である唯一の選択肢であり、チームが Dart を書いたことがなければ本物の税金になります。

Flutter 3.44 を選ぶとき

次の場合に Flutter を選びましょう。

最小構成の Flutter 3.44 main.dart:

// Flutter 3.44, Dart 3.7
import 'package:flutter/material.dart';

void main() => runApp(const HelloApp());

class HelloApp extends StatelessWidget {
  const HelloApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Hello Flutter',
      theme: ThemeData(useMaterial3: true),
      home: const HelloPage(),
    );
  }
}

class HelloPage extends StatelessWidget {
  const HelloPage({super.key});

  @override
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(title: const Text('Hello')),
        body: const Center(child: Text('Hello, Flutter')),
      );
}

useMaterial3: true フラグは 3.44 でデフォルトになっており (内部で何が変わったかは Flutter 3.44 の Material と Cupertino パッケージ分割 を参照)、新規プロジェクトではこの行を省略できます。

React Native 0.82 を選ぶとき

次の場合に React Native を選びましょう。

最小構成の React Native 0.82 App.tsx:

// React Native 0.82, Expo SDK 53, TypeScript 5.6
import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View } from 'react-native';

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello, React Native</Text>
      <StatusBar style="auto" />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

Expo がデフォルトのスキャフォールドになりました。新規プロジェクトは npx create-expo-app、カスタムネイティブモジュールが必要なら expo prebuild、クラウドビルドの .ipa.aab 成果物には EAS Build を使います。“bare workflow” はまだ存在しますが、チームは Expo SDK 51 以降、新規アプリには推奨していません。

.NET MAUI 11 を選ぶとき

次の場合に MAUI を選びましょう。

最小構成の MAUI 11 MauiProgram.cs:

// .NET 11, C# 14, Microsoft.Maui.Controls 11.0.x
using Microsoft.Extensions.Logging;

namespace HelloMaui;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });

#if DEBUG
        builder.Logging.AddDebug();
#endif
        return builder.Build();
    }
}

.NET 11 Preview 4 における CoreCLR デフォルト化の切り替え は、Android と iOS で歴史的な MAUI のコールドスタートギャップの大半を埋めるもので、これは 8.0 GA 以来フレームワークに対する単一の最大の更新です。

ベンチマーク: コールドスタートとバンドルサイズ

以下の数値は、フレームワークごとの “Hello World” テンプレートをリリースビルドし、Pixel 8 (Android 15) と iPhone 15 (iOS 18.4) にインストールしたものです。コールドスタートは am start (Android) と Instruments の Launch トレース (iOS) から測定し、プロファイル事前最適化なし、MAUI で Native AOT なし、Flutter で Impeller オン、RN で Hermes + Fabric です。

指標Flutter 3.44React Native 0.82MAUI 11 (CoreCLR)
Android コールドスタート、アプリコードのみ320 ms450 ms480 ms
Android APK サイズ、release、単一アーキ19 MB24 MB22 MB
iOS コールドスタート、アプリコードのみ280 ms340 ms360 ms
iOS IPA サイズ、release28 MB35 MB38 MB
アイドル時メモリフットプリント (Android)78 MB110 MB132 MB
重いスクロール下での FPS119.2117.8118.4

Flutter はエンジンが起動時から AOT コンパイル済み Dart であり、JS や CoreCLR ランタイムを先に立ち上げないため、全方位でコールドスタートに勝利します。React Native は Hermes + Fabric が初期化コストをフレームごとではなく一度だけ支払うため、以前より MAUI に近づきました。CoreCLR 上の MAUI は、引用されている可能性のある MAUI-on-Mono 値 (同じテンプレートで Android で ~720 ms) よりも RN に近づいています。FPS の行は本質的に同点です。アプリが立ち上がってしまえば 3 つともデバイスのリフレッシュ天井でレンダリングします。コールドスタートはアプリ起動時の体感に効きます。持続 FPS はアプリ内の触感に効きます。最初の行は “アイコンがキビキビ感じるか” を決定します。最後の行は “アプリがモダンに感じるか” を決定します。最初の行のギャップは本物ですが小さく、最後の行のギャップは測定できません。

あなたの代わりに決めてしまう落とし穴

好みに関係なく決定を強制するものが 3 つあります。

  1. チームの既存言語。 TypeScript チームは React Native を選びます。C# チームは MAUI を選びます。既存スタックを持たないチーム、あるいは Dart を学ぶ意思のあるチームだけが Flutter を選びます。シニアエンジニアにモバイルプロジェクトでしか使わない 3 つ目の言語を教えるコストは本物であり、機能マトリクスの表には現れません。
  2. Web が v1 になくともロードマップに入っている場合。 “いずれ Web 版を出荷する” が製品スペックに入っているなら、react-native-web を使った RN または Flutter Web が 2 つの実行可能な経路ですが、2026 年にプロダクションレディなのは RN だけです。Flutter Web は非自明なアプリにとってプレビュー品質のターゲットであり、Flutter チームもそう述べています。MAUI にはブラウザストーリーがありません (Blazor Hybrid はプログラミングモデルが異なる別スタックです)。MAUI を選んで後で Web 版が必要になった場合、2 つ目のアプリを書くことになります。
  3. 抽象化できない純正ネイティブモジュール。 App Tracking Transparency ダイアログ、App Clips、Live Activities、Dynamic Island ウィジェット、Wear OS タイル、Health Connect、App Intents。Flutter にはこれらのほとんどにプラグインがあり、一部はまだコミュニティメンテナンスです。RN は Expo エコシステムのおかげで最も広いプラグインカバレッジを持ちます。MAUI は下層のコントロールが実際のプラットフォームのウィジェットであるため、ネイティブのプラットフォーム API を直接公開し、機能ごとのプラグインギャップは少ないです。製品スペックの最初の四半期に iOS プラットフォーム機能が 3 つ以上並ぶなら MAUI が最も摩擦が低く、Android プラットフォーム機能が 3 つ以上並ぶなら、プラグインエコシステムがより広いので Flutter か RN の方が楽です。

エコシステムがどう分岐するかの実用的な例として、AI 統合があります。TypeScript と Python 向けの Anthropic SDK は純正です。Dart 向けの Anthropic SDK はコミュニティメンテナンスです。.NET 向けの Anthropic SDK はコミュニティメンテナンスですが、.NET 11 の Microsoft.Extensions.AI でカバーされており、これはプロバイダークライアントではないにせよ抽象化層では純正です。モバイルアプリが直接 AI 呼び出しを行うなら、2026 年において RN が顕著な差で最も摩擦の少ない経路です。

再確認した推奨

今日始まる新しいモバイルアプリの場合:

既存アプリからの移行を検討している場合:

関連

参考資料

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る