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%.

Bảng so sánh cho người mua phần mềm
| Tiêu chí | Native (Swift + Kotlin) | Flutter | React Native |
|---|---|---|---|
| Số mã nguồn giao diện | Hai, viết riêng | Một, cộng plugin riêng khi cần | Mộ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ản | Sửa một lần | Sửa một lần |
| Tính năng mới của iOS, Android | Có ngay | Chờ plugin hoặc tự viết | Chờ module hoặc tự viết |
| Giao diện | Đúng chất từng hệ điều hành | Giống hệt nhau hai bên | Thành phần gốc, dáng hơi khác nhau |
| Thông báo đẩy | APNs và FCM trực tiếp | Qua plugin Firebase | Qua thư viện Firebase hoặc tương tự |
| Duyệt App Store, Google Play | Như nhau | Như nhau | Như 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ới | App 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ụ.

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.

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ị.


