Flutter 與 React Native 2025 年功能差異與開發選擇全解析

Published on: | Last updated:

最近...嗯,其實也一直啦,很多人在問 FlutterReact Native 到底該怎麼選。感覺每隔一陣子這個話題就會被翻出來吵一次。

老實說,2025 年了,這兩個東西都能做出很賺錢、很好看的 App。選錯了也不會公司就馬上倒掉,但選對了,你的團隊未來一兩年會過得比較舒心。這才是重點。

先說結論

我自己是覺得,這不是一個「誰比較好」的問題。這比較像...你在下哪一種賭注。

Flutter,你賭的是「設計一致性」和「流暢的動畫體驗」能帶來最大價值。你希望 UI 在任何手機上看起來都一模一樣,動起來也一樣順。

React Native,你賭的是「龐大的生態系」和「團隊既有技能」的槓桿效益。你希望 web 前端工程師能無痛上手,並且大量重複使用現有的原生模組或 JavaScript 函式庫。

就這樣,很簡單。但魔鬼都在細節裡。

這兩個東西到底差在哪?

要懂它們的差別,就要從最根本的地方看起...就是它們怎麼把畫面「畫」到手機螢幕上。

Flutter 的做法很直接,它自己帶了一套繪圖引擎,叫 Skia。你可以想像成 Flutter 帶了自己的畫布跟顏料,不管到 iOS 還是 Android,它都直接在螢幕這塊畫布上把按鈕、文字、圖片一個個畫出來。所以,畫出來的東西自然就長得一模一樣。這對追求 pixel-perfect 的設計師來說,真的是福音。

React Native (RN) 呢,它的思路不一樣。它比較像個「翻譯官」或「工頭」。當你用 JavaScript 寫下「我這裡要一個按鈕」時,RN 會去跟手機系統說:「嘿,iOS,給我一個你原生的那種按鈕」、「嘿,Android,換你,也給我一個你的按鈕」。所以 RN App 裡的元件,其實都是該平台「土生土長」的。這讓 App 天生就帶有那個平台的「原生感」。

Flutter 與 React Native 渲染邏輯示意圖
Flutter 與 React Native 渲染邏輯示意圖

這個根本性的差異,就導致了後面所有的一切...效能、開發體驗、團隊找人...全部都跟這個有關。

直接看程式碼可能比較快

光說理論有點空,我們來看個最簡單的計數器 App,感受一下兩種寫法的「氣質」。

Flutter:用 Widget 把世界疊起來

Flutter 的一切都是 Widget。你的 App 就是一個巨大的 Widget 樹,一層包一層。


import 'package:flutter/material.dart';

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

class App extends StatelessWidget {
  const App({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(colorSchemeSeed: Colors.teal, useMaterial3: true),
      home: const CounterPage(),
    );
  }
}

class CounterPage extends StatefulWidget {
  const CounterPage({super.key});
  @override
  State<counterpage> createState() => _CounterPageState();
}

class _CounterPageState extends State<counterpage>
    with SingleTickerProviderStateMixin {
  int _n = 0;

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Flutter Counter')),
      body: Center(
        child: AnimatedSwitcher(
          duration: const Duration(milliseconds: 200),
          child: Text('$_n', key: ValueKey(_n), style: const TextStyle(fontSize: 64)),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => setState(() => _n++),
        child: const Icon(Icons.add),
      ),
    );
  }
}
</counterpage></counterpage>

看到了嗎?`MaterialApp`、`Scaffold`、`Center`、`Text`...全都是 Widget。你用 Dart 語言把它們組合起來。這種寫法的好處是,邏輯很集中,而且因為是自己畫,所以那個 `AnimatedSwitcher` 做出來的數字切換動畫,在兩邊平台跑起來會完全一樣。

React Native:前端工程師熟悉的老味道

如果你寫過 React,那看這個應該會覺得很親切。就是 JSX、`useState` hook,還有一個類似 CSS 的東西。


// App.tsx
import React from "react";
import { SafeAreaView, Text, Pressable, StyleSheet, Platform } from "react-native";

export default function App() {
  const [n, setN] = React.useState(0);
  return (
    <safeareaview style="{styles.container}">
      <text style="{styles.title}">React Native Counter</text>
      <text style="{styles.count}">{n}</text>
      <pressable onpress="{()"> setN(n + 1)} style={styles.btn}>
        <text style="{styles.btnText}">Add</text>
      </pressable>
    </safeareaview>
  );
}

const styles = StyleSheet.create({
  container: { flex: 1, alignItems: "center", justifyContent: "center" },
  title: { fontSize: 20, marginBottom: 8 },
  count: { fontSize: 64, marginBottom: 16 },
  btn: {
    paddingHorizontal: 20, paddingVertical: 12, borderRadius: 12,
    backgroundColor: Platform.select({ ios: "#0a84ff", android: "#03dac6" })
  },
  btnText: { color: "white", fontWeight: "600" }
});

有沒有注意到 `StyleSheet.create` 裡面那個 `Platform.select`?這就是 RN 的特色。你可以在需要的時候,輕鬆地針對不同平台寫出不同的樣式或邏輯。這讓 App 更能「入境隨俗」。

相同 App 在不同框架下的視覺表現
相同 App 在不同框架下的視覺表現

所以,到底什麼情境適合誰?

這才是重點。技術沒有好壞,只有適不適合你的專案和團隊。

1. 品牌、設計感先決的 App?
我自己會偏向 Flutter。當行銷和設計部門要求 App 的動畫、顏色、佈局在所有地方都必須分毫不差時,Flutter 的統一渲染能省下超多溝通和測試的力氣。你的設計系統可以直接變成一套 Widget 程式庫。

2. 公司內有一堆原生功能要整合?
那可能 React Native 會方便一點。例如公司已經有寫好的藍牙通訊、影像處理、或是一些很特別的硬體溝通模組(SDKs)。RN 可以比較輕易地去「橋接」這些現成的原生程式碼,然後把其他 UI 和商業邏輯拉到 JavaScript/TypeScript 層,讓開發速度變快。

3. 團隊想跟 Web 共用程式碼?
React Native 的優勢就出來了。如果你的 Web 前端也是用 React,那很多商業邏輯(例如狀態管理、API 請求、資料處理)幾乎可以直接在 Web 和 App 之間共用,尤其是現在流行用 Monorepo 的架構來管理專案,這點真的蠻香的。

React Native 讓 Web 開發團隊能更快地投入 App 開發
React Native 讓 Web 開發團隊能更快地投入 App 開發

一張表讓你感受一下差異

如果還是很難決定,下面這張表可能可以幫你釐清思路。我盡量用白話文講。

比較面向 Flutter React Native
UI 一致性 幾乎 100% 一致。設計師會愛死你,QA 測畫面也輕鬆。 會「入境隨俗」,按鈕、捲動行為會像原生 App。有時是優點,有時是 bug 的來源...
效能體感 順的時候非常順,特別是動畫。因為它自己全權控制畫面,沒有中間商賺差價。 一般畫面沒問題。但長列表、複雜手勢和動畫就需要特別用對函式庫(例如 FlashList、Reanimated)來優化,不然很容易卡。
團隊上手速度 需要學 Dart 語言和 Flutter 的 Widget 概念。說真的不難,但對沒接觸過的人來說就是個新東西。 會 React 的前端工程師,大概...一杯咖啡的時間就能開始寫頁面了。學習曲線非常平緩。
生態系與套件 官方的工具鏈很完整,該有的都有。但一些比較冷門的第三方套件,選擇就沒那麼多。 JS/TS 的世界...你懂的。幾乎所有你想得到的功能都有人做好了套件。缺點是有時候選擇太多,反而不知道哪個好。
在台灣找人 會 Dart/Flutter 的人相對少一些,但通常都是很有熱情的「真愛粉」,技術深度可能不錯。這點是根據一些台灣的開發社群和像 CakeResume 上的觀察啦。 React/TS 人才庫非常大,在 104 或 Yourator 上找人不難。但...要找到同時懂 App 效能調校、而不只是會切版的前端,需要花點心力面試。

風險與應變

選技術框架,也要考慮一下最壞的情況。

Flutter 的風險...
很多人會怕:「萬一 Google 哪天不玩了怎麼辦?」嗯,這確實是個萬年老問題。不過,目前看起來 Google 在 Flutter 上的投入還很深,甚至用在他們未來的 Fuchsia 作業系統上。所以短期內應該還好。比較實際的風險是,當你需要一個非常非常新的、或是很冷門的原生 API 時(例如 iOS 18 剛發布的某個功能),你可能需要等社群把套件做出來,或者自己動手寫 `Platform Channels` 去橋接,這會需要懂一點原生開發。

React Native 的風險...
就是 JS 生態圈的「自由」帶來的混亂。特別是「升級」。RN 本身、React、還有你用到的幾十個第三方套件,版本之間有時會打架。每次大版本升級,都可能會是一場小災難,需要花時間去解 dependency 的問題。尤其最近幾年 RN 從舊的 Bridge 架構遷移到新的 JSI 架構,中間就讓不少舊專案痛了一陣子。

最後的審核清單

好,如果到這裡你還是很糾結,試著回答下面幾個問題,答案應該就很明顯了。

  • 你的 App 最重要的賣點是獨特的品牌動畫和視覺體驗嗎? → 偏向 Flutter
  • 你的團隊大部分成員都是資深的 React 前端工程師嗎? → 偏向 React Native
  • 專案需要大量使用手機原生的硬體功能,而且公司內部已經有相關程式碼了? → 偏向 React Native
  • 你希望設計稿出來長怎樣,App 就 99% 長那樣,不想花時間處理平台差異? → 偏向 Flutter
  • 你是一個很小的團隊,或甚至是個人開發者,想趕快做出第一個版本? → 選你或你的團隊最熟的那個。 真的,這時候開發速度比什麼都重要。

說到底,這兩個框架真的沒有誰絕對優秀。它們只是提供了兩種不同的解決問題的思路。

選擇 Flutter,你未來可能要處理的問題是「如何更好地與原生平台互動」;選擇 React Native,你未來要處理的問題可能是「如何管理好混亂的依賴和效能邊界」。

想清楚你的團隊,更擅長解決哪一類問題。答案,其實就出來了。

如果你們團隊剛好也在做選擇,或是有用過其中一個的經驗,不妨在下面留言分享一下你們的考量或踩過的坑吧。滿好奇大家實際上的想法。

Related to this topic:

Comments

撥打專線 LINE免費通話