最近...嗯,其實也一直啦,很多人在問 Flutter 跟 React 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 天生就帶有那個平台的「原生感」。
這個根本性的差異,就導致了後面所有的一切...效能、開發體驗、團隊找人...全部都跟這個有關。
直接看程式碼可能比較快
光說理論有點空,我們來看個最簡單的計數器 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 更能「入境隨俗」。
所以,到底什麼情境適合誰?
這才是重點。技術沒有好壞,只有適不適合你的專案和團隊。
1. 品牌、設計感先決的 App?
我自己會偏向 Flutter。當行銷和設計部門要求 App 的動畫、顏色、佈局在所有地方都必須分毫不差時,Flutter 的統一渲染能省下超多溝通和測試的力氣。你的設計系統可以直接變成一套 Widget 程式庫。
2. 公司內有一堆原生功能要整合?
那可能 React Native 會方便一點。例如公司已經有寫好的藍牙通訊、影像處理、或是一些很特別的硬體溝通模組(SDKs)。RN 可以比較輕易地去「橋接」這些現成的原生程式碼,然後把其他 UI 和商業邏輯拉到 JavaScript/TypeScript 層,讓開發速度變快。
3. 團隊想跟 Web 共用程式碼?
React Native 的優勢就出來了。如果你的 Web 前端也是用 React,那很多商業邏輯(例如狀態管理、API 請求、資料處理)幾乎可以直接在 Web 和 App 之間共用,尤其是現在流行用 Monorepo 的架構來管理專案,這點真的蠻香的。
一張表讓你感受一下差異
如果還是很難決定,下面這張表可能可以幫你釐清思路。我盡量用白話文講。
| 比較面向 | 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,你未來要處理的問題可能是「如何管理好混亂的依賴和效能邊界」。
想清楚你的團隊,更擅長解決哪一類問題。答案,其實就出來了。
如果你們團隊剛好也在做選擇,或是有用過其中一個的經驗,不妨在下面留言分享一下你們的考量或踩過的坑吧。滿好奇大家實際上的想法。
