Bỏ qua menu, vào nội dung chính

Flutter, React Native hay native: chọn công nghệ làm app mobile cho doanh nghiệp

So sánh Flutter, React Native và native (Swift, Kotlin) từ góc người mua phần mềm: số mã nguồn phải duy trì, thời gian ra mắt, thông báo đẩy, duyệt App Store, tuyển người. Minh hoạ bằng cái giá ALODEV đã trả khi viết native cả hai nền tảng: 89 nghìn dòng mã, 25 màn lệch nhau và một lỗi phải sửa hai lần trong cùng một buổi chiều.

11 phút đọc

Với phần lớn app doanh nghiệp cần có mặt trên cả iPhone lẫn Android, Flutter hoặc React Native là lựa chọn hợp lý hơn native: một mã nguồn, một đội, một lần sửa lỗi cho cả hai nền tảng. Native (Swift cho iPhone, Kotlin cho Android) đáng tiền khi app gắn sâu với phần cứng, thông báo đẩy là lõi nghiệp vụ, hoặc doanh nghiệp đủ sức nuôi hai đội trong nhiều năm. Giữa Flutter và React Native, đội đang làm web bằng React nên chọn React Native; đội mới, muốn giao diện giống hệt nhau trên hai nền tảng thì Flutter dễ kiểm soát hơn.

Kết luận đó nghe quen, nhưng cái giá của từng hướng hiếm khi được nói bằng số. Bài này dùng số từ chính ALODEV: chúng tôi đã chọn native cho cả hai nền tảng của phần mềm vận hành nội bộ ALODEV AIO, và kho mã cho thấy khá rõ cái giá phải trả.

Ba hướng, khác nhau ở chỗ nào

Native nghĩa là viết hai app riêng bằng ngôn ngữ của từng hệ điều hành. App iPhone dùng Swift và công cụ Xcode, app Android dùng Kotlin và Android Studio. Mỗi app gọi thẳng thư viện của hệ điều hành, dùng thành phần giao diện của hệ điều hành.

Flutter do Google phát triển, viết bằng ngôn ngữ Dart. Flutter tự vẽ toàn bộ giao diện bằng bộ máy riêng, nên một màn hình trông giống hệt nhau trên iPhone và Android. Muốn dùng tính năng riêng của hệ điều hành thì đi qua plugin.

React Native do Meta phát triển, viết bằng JavaScript hoặc TypeScript theo cách của React. Khác Flutter, React Native dựng giao diện bằng thành phần gốc của từng hệ điều hành, nên nút bấm trên iPhone vẫn là nút của iOS. Đội đã làm web bằng React chuyển sang khá nhanh.

Về mức độ phổ biến, hai nền tảng đa nền tảng gần như ngang nhau. Khảo sát lập trình viên Stack Overflow 2024 ghi nhận 9,4% người trả lời dùng Flutter và 8,4% dùng React Native; các lựa chọn khác như .NET MAUI, Xamarin, Ionic, Capacitor đều dưới 3,5%.

Biểu đồ cột tỷ lệ lập trình viên dùng các nền tảng đa nền tảng theo Stack Overflow Developer Survey 2024: Flutter 9,4%, React Native 8,4%, .NET MAUI 3,1%, Xamarin 2,9%, Ionic 2,5%, Capacitor 1,8%
Flutter và React Native bỏ xa phần còn lại. Nguồn: Stack Overflow Developer Survey 2024, mục Other frameworks and libraries, tra ngày 25/09/2026.

Bảng so sánh cho người mua phần mềm

Flutter, React Native và native nhìn từ hệ quả kinh doanh
Tiêu chíNative (Swift + Kotlin)FlutterReact Native
Số mã nguồn giao diệnHai, viết riêngMột, cộng plugin riêng khi cầnMột, cộng module gốc khi cần
Sửa một lỗi nghiệp vụSửa hai lần, dựng hai bảnSửa một lầnSửa một lần
Tính năng mới của iOS, AndroidCó ngayChờ plugin hoặc tự viếtChờ module hoặc tự viết
Giao diệnĐúng chất từng hệ điều hànhGiống hệt nhau hai bênThành phần gốc, dáng hơi khác nhau
Thông báo đẩyAPNs và FCM trực tiếpQua plugin FirebaseQua thư viện Firebase hoặc tương tự
Duyệt App Store, Google PlayNhư nhauNhư nhauNhư nhau
Tuyển người (khảo sát 2025)Swift 5,4%, Kotlin 10,8%Dart 5,9%JavaScript 66%, TypeScript 43,6%
Hợp vớiApp dùng nhiều năm, gắn phần cứngĐội mới, giao diện thương hiệu mạnhĐội đã có React trên web

Dòng tuyển người lấy từ khảo sát Stack Overflow 2025, tỷ lệ người trả lời dùng từng ngôn ngữ. Con số nói lên kích thước nhóm người có thể tuyển, không nói lên chất lượng. Nó giải thích vì sao React Native thường là lựa chọn an toàn nhất về nhân sự: người biết JavaScript nhiều hơn hẳn người biết Dart hay Swift.

Cái giá của native hai nền tảng, đo trên kho mã ALODEV

ALODEV AIO có bốn giao diện dùng chung một backend: web Next.js, app iPhone viết Swift, app Android viết Kotlin, và một vỏ Android cũ bọc web bằng Capacitor đã bị thay thế. Đếm ngày 25/09/2026, hai app native cộng lại là 89.193 dòng mã cho cùng một bộ nghiệp vụ.

Biểu đồ số dòng mã của bốn giao diện ALODEV AIO: web Next.js 161.231 dòng, app iOS Swift 55.066 dòng, app Android Kotlin 34.127 dòng, vỏ Capacitor 11 dòng
Bốn giao diện của cùng một phần mềm, đếm bằng wc -l ngày 25/09/2026. Web gồm cả khu quản trị nên lớn nhất; hai app native cộng lại 89.193 dòng.

Cùng một lỗi, sửa hai lần trong một buổi chiều

Ngày 30/07/2026, lúc 15:19, kho Android ghi một commit sửa giờ chấm công hiển thị lệch 7 tiếng. Lúc 16:51 cùng ngày, kho iOS ghi build 40 với nội dung sửa đúng lỗi đó. Lỗi đọc múi giờ nằm ở phía app, nên mỗi mã nguồn phải tự sửa, tự kiểm tra, tự dựng bản mới. Với Flutter hay React Native, đây là một lần sửa.

Hai app trôi dần khỏi nhau

Ngày 11/09/2026, đội viết một tài liệu đối chiếu từng màn của app iPhone với màn tương ứng của app Android. Kết quả là 25 dòng, mỗi dòng một màn có khác biệt về hành vi, dữ liệu gọi hoặc thông tin hiển thị. Trang chủ Android nhắc báo cáo chưa nộp, trang chủ iPhone thì không. Màn phiếu lương Android rút gọn còn một con số, iPhone hiện đủ bảng kê. Không ai cố ý làm lệch; mỗi app được sửa theo yêu cầu vào những thời điểm khác nhau.

Bảng trích tài liệu SO-SANH-IOS-ANDROID.md của ALODEV liệt kê khác biệt hành vi giữa app iOS và Android ở các màn trang chủ, việc của tôi, chat, phiếu lương
Tám dòng đầu trong tài liệu đối chiếu 25 màn giữa app iOS và app Android của ALODEV AIO (11/09/2026). Mỗi dòng là một việc phải làm hai lần.

Với chủ doanh nghiệp, độ lệch này có giá theo hai kiểu. Kiểu thứ nhất là chi phí trực tiếp: mỗi tính năng mới phải viết, kiểm thử và gửi duyệt hai lần. Kiểu thứ hai khó thấy hơn: nhân viên dùng iPhone và nhân viên dùng Android nhìn thấy hai thứ khác nhau, hỏi nhau không khớp, và bộ phận hỗ trợ phải biết cả hai.

Đổi lại, native cho được gì

Native cũng trả lại nhiều thứ. App Android native của ALODEV có thông báo đẩy qua Firebase Cloud Messaging chạy thật ngay trong ngày đầu viết lại, thứ vỏ Capacitor trước đó chưa làm được. App iPhone khoá Face ID bằng một tệp 43 dòng. Cả hai dùng thành phần giao diện của hệ điều hành, người dùng quen tay. Với một phần mềm nội bộ mà chính công ty dùng mỗi ngày, cái giá hai mã nguồn là chấp nhận được. Với một doanh nghiệp thuê ngoài làm app lần đầu, nó thường không đáng.

Chọn Flutter hay React Native

Khi đã quyết đi đường đa nền tảng, câu hỏi còn lại ít mang tính kỹ thuật hơn người ta nghĩ. Hai nền tảng đều đủ trưởng thành cho app doanh nghiệp, đều có công ty lớn đứng sau, đều dựng được app lên App Store và Google Play.

  • Chọn React Native khi doanh nghiệp đã có web viết bằng React hoặc Next.js. Kiểu dữ liệu, cách gọi API, một phần logic kiểm tra dữ liệu có thể dùng chung, và người làm web đọc được mã app.
  • Chọn Flutter khi giao diện thương hiệu là ưu tiên và cần giống hệt nhau trên mọi máy, hoặc khi đội bắt đầu từ con số không và không có quán tính JavaScript.
  • Với cả hai, hỏi nhà cung cấp danh sách plugin sẽ dùng cho thông báo đẩy, camera, đăng nhập sinh trắc học, và ai bảo trì các plugin đó. Plugin bỏ dở là rủi ro lớn nhất của app đa nền tảng.

Khi nào KHÔNG nên chọn từng hướng

  • Không nên native hai nền tảng khi ngân sách chỉ đủ một đội, hoặc khi nghiệp vụ còn thay đổi hằng tuần. Mỗi thay đổi nhân đôi, và hai app sẽ lệch nhau nhanh hơn tốc độ đội kịp đối chiếu.
  • Không nên đa nền tảng khi app phụ thuộc vào tính năng mới nhất của iOS hoặc Android, cần xử lý camera theo từng khung hình, Bluetooth, định vị chạy nền liên tục. Phần lớn thời gian sẽ dành cho viết module gốc, lúc đó lợi thế một mã nguồn không còn.
  • Không nên làm app nào cả khi người dùng mở vài lần mỗi tuần và không cần thông báo đẩy. Một trang web chạy tốt trên điện thoại đủ dùng, bài cuối của cụm này nói kỹ hơn.
  • Không nên chọn theo độ hot trên mạng. Chọn theo đội sẽ bảo trì app trong ba năm tới: đội đó giỏi ngôn ngữ nào.

Câu hỏi thường gặp

Flutter hay React Native chạy nhanh hơn?

Với app doanh nghiệp gồm danh sách, biểu mẫu và biểu đồ, người dùng không phân biệt được. Khác biệt hiệu năng chỉ đáng bàn ở app đồ hoạ nặng, hoạt ảnh phức tạp hoặc xử lý dữ liệu lớn ngay trên máy.

Làm app bằng React Native có dùng lại được mã web không?

Dùng lại được phần logic như kiểu dữ liệu, gọi API, kiểm tra dữ liệu nhập. Phần giao diện phải viết lại, vì React Native dùng thành phần của điện thoại thay cho thẻ HTML.

Đã làm native rồi có chuyển sang Flutter được không?

Được, nhưng đó là viết lại app. Cách ít rủi ro là giữ backend, viết bản Flutter hoặc React Native song song, chuyển dần từng nhóm người dùng, và chỉ gỡ bản cũ khi số liệu sử dụng xác nhận bản mới đủ tốt.

App đa nền tảng có bị App Store từ chối không?

Không vì lý do công nghệ. Apple duyệt theo tính năng và trải nghiệm; app Flutter hay React Native có giao diện riêng, tính năng thật thì được duyệt như app native. Rủi ro bị từ chối cao nằm ở app chỉ bọc lại một website.

Có cách nào giảm độ lệch khi đã làm native hai nền tảng?

Có ba cách: đặc tả chung một nơi cho cả hai app, đối chiếu định kỳ từng màn như tài liệu 25 dòng ở trên, và đẩy càng nhiều logic nghiệp vụ về backend càng tốt để app chỉ còn phần hiển thị.

Bài viết liên quan

Ký sự lập trình
Ký sự lập trình10 phút đọc

Vì sao app iOS nên viết bằng Swift: làm app iPhone cho doanh nghiệp, chi phí và rủi ro thật

Doanh nghiệp cần app iPhone dùng hằng ngày, gắn Face ID, thông báo đẩy, camera thì Swift là lựa chọn mặc định. Bài giải thích vì sao bằng hệ quả kinh doanh: duyệt App Store, thông báo đẩy, cập nhật iOS mới, tuyển người, và kể lại app iOS ALODEV AIO viết bằng SwiftUI không dùng thư viện bên thứ ba. Kèm phần khi nào không nên viết Swift.

Ký sự lập trình11 phút đọc

Vì sao dự án web nên viết bằng TypeScript thay vì JavaScript

TypeScript là gì với người mua phần mềm: JavaScript cộng thêm kiểu dữ liệu, bắt một lớp lỗi trước khi phần mềm tới tay khách. Bài có ví dụ chạy thật về lỗi tính tiền, số liệu từ Stack Overflow 2025 và nghiên cứu ICSE 2017, cách Alodev đặt TypeScript làm cổng chặn trong ba kho mã, và những lần cổng đó tự gây sự cố.

Ký sự lập trình11 phút đọc

Vì sao website chậm dù thuê hosting mạnh: đo Lighthouse ba trang thật

Máy chủ trả HTML trong 21 đến 225 mili giây, nhưng nội dung chính hiện sau 7 đến 18 giây. Alodev đo Lighthouse ba website thật, kể cả alodev.vn, để chỉ ra thứ làm chậm tốc độ website: CSS chặn hiển thị, font, JavaScript và mã bên thứ ba. Kèm bảng khi nào nâng hosting mới có ích.

Nhận bài mới

Để lại email để nhận bài mới của series Ký sự lập trình, hoặc theo dõi bằng RSS.

RSS Ký sự lập trình

Email chỉ dùng để gửi bài mới, xem Chính sách bảo mật.

Trao đổi về dự án