Trả lời nhanh: Flutter là bộ công cụ của Google cho phép viết một lần rồi chạy trên cả iOS lẫn Android, dùng ngôn ngữ Dart và tự vẽ toàn bộ giao diện thay vì gọi thành phần của hệ điều hành. React Native đi hướng khác: viết bằng JavaScript và dùng chính thành phần gốc của từng nền tảng. Chọn thế nào? Quy tắc thực dụng nhất: đội đã mạnh JavaScript thì chọn React Native, đội bắt đầu từ đầu và cần giao diện đồng nhất thì chọn Flutter.
Câu hỏi này gặp ở mọi dự án di động, và câu trả lời trên mạng thường thiên vị theo bên viết bài. Sự thật ít kịch tính hơn: cả hai đều đủ tốt để làm ứng dụng thương mại nghiêm túc, đã có nhiều sản phẩm lớn chứng minh. Thứ quyết định thường không phải công nghệ mà là đội ngũ bạn đang có và loại giao diện bạn định làm.
Flutter hoạt động thế nào
Điểm khác biệt cốt lõi nằm ở cách vẽ giao diện. Flutter không mượn nút bấm hay ô nhập của hệ điều hành, nó tự vẽ từng điểm ảnh bằng bộ máy đồ họa riêng. Hệ quả rất thực tế:
- Giao diện giống hệt nhau trên iOS, Android và mọi đời máy. Với sản phẩm cần bản sắc thương hiệu nhất quán, đây là lợi thế lớn.
- Hiệu ứng và chuyển động dễ kiểm soát, vì bạn nắm toàn quyền vẽ thay vì phụ thuộc thành phần hệ thống.
- Không tự động có giao diện mới của hệ điều hành. Khi Apple hay Google đổi phong cách, ứng dụng của bạn vẫn giữ nguyên cho tới khi bạn cập nhật.
Ngôn ngữ là Dart, ít phổ biến hơn JavaScript nhưng học nhanh với người đã biết một ngôn ngữ hướng đối tượng. Phần lớn lập trình viên nắm được trong một tới hai tuần.
React Native đi hướng ngược lại
React Native dựng giao diện bằng chính các thành phần gốc của từng hệ điều hành. Nút bấm trên iOS là nút bấm của iOS thật, cuộn trang là cơ chế cuộn của hệ thống.
- Cảm giác đúng chất nền tảng, người dùng iPhone thấy quen tay ngay.
- Tận dụng được người biết JavaScript, mà số này rất đông. Đội web chuyển sang làm mobile với chi phí học thấp hơn hẳn.
- Hệ sinh thái thư viện khổng lồ từ thế giới JavaScript.
- Đổi lại giao diện có khác biệt nhỏ giữa hai nền tảng, và bạn phải xử lý những khác biệt đó.
Về hiệu năng, khoảng cách giữa hai bên đã thu hẹp nhiều so với vài năm trước. Với ứng dụng thương mại điện tử, mạng xã hội hay quản lý thông thường, người dùng không phân biệt được.
Chọn theo tình huống thật
Chọn Flutter khi: đội chưa có nền JavaScript mạnh nên xuất phát điểm ngang nhau; giao diện có nhiều thành phần tùy biến và hiệu ứng riêng; bạn muốn hình ảnh giống hệt nhau trên mọi máy; hoặc bạn nhắm cả bản web và bản máy tính từ cùng mã nguồn.
Chọn React Native khi: đội đã làm React cho web, đây là lý do mạnh nhất và cũng phổ biến nhất; ứng dụng cần cảm giác chuẩn nền tảng; bạn muốn dùng lại phần logic đã viết cho web; hoặc bạn cần tuyển người nhanh, vì thị trường JavaScript rộng hơn.
Chọn viết riêng cho từng nền tảng khi: ứng dụng phụ thuộc nặng vào tính năng phần cứng đặc thù; hoặc hiệu năng đồ họa là yêu cầu sống còn như trò chơi và ứng dụng xử lý ảnh nặng.
Với phần lớn ứng dụng kinh doanh ở Việt Nam, cả hai lựa chọn đầu đều đưa được sản phẩm ra thị trường, và yếu tố quyết định thời gian giao hàng là đội ngũ chứ không phải công cụ.
Phần hạ tầng mà cả hai đều cần
Chọn xong công nghệ thì phần việc kỹ thuật còn lại giống nhau đáng ngạc nhiên:
- Nhánh Android build trên Linux, dựng máy theo bài máy build Android.
- Nhánh iOS bắt buộc qua máy Mac, không có đường vòng, chi tiết ở bài build iOS có cần Mac.
- Backend và API chạy trên máy chủ Linux, và đây thường là phần tốn công nhất của cả dự án.
- Hệ thống tự động dựng bản thử để đội kiểm thử luôn có bản mới.
Nói cách khác, quyết định Flutter hay React Native ảnh hưởng tới cách viết giao diện, còn phần hạ tầng phía sau thì gần như không đổi. Nhiều đội bỏ hàng tuần tranh luận về lựa chọn đầu rồi lại xem nhẹ phần sau, trong khi phần sau mới là chỗ quyết định tốc độ giao hàng hằng ngày.
Rủi ro nên tính trước
Thư viện cầu nối tới tính năng gốc. Cả hai đều dựa vào các gói do cộng đồng viết để chạm tới camera, bluetooth, thanh toán. Trước khi chốt, hãy kiểm tra những tính năng đặc thù của dự án bạn đã có gói ổn định chưa, và gói đó còn được bảo trì không.
Chi phí nâng cấp phiên bản. Cả hai đều phát hành bản mới đều đặn, và việc nâng cấp đôi khi kéo theo sửa nhiều chỗ. Hãy tính công bảo trì này vào kế hoạch dài hạn thay vì chỉ tính công viết mới.
Tuyển người. Ở Việt Nam, người biết React nhiều hơn người biết Dart, nhưng cộng đồng Flutter cũng đã đông và tăng nhanh. Nếu bạn dự định mở rộng đội trong năm tới, hãy khảo sát thị trường nhân lực ở khu vực mình trước khi chốt.
Chọn theo tình huống thật, không theo cuộc tranh luận
| Tình huống | Nên chọn | Vì sao |
|---|---|---|
| Đội đã mạnh về JavaScript và web | Nền tảng dùng JavaScript | Tận dụng được người sẵn có |
| Đội chưa có kinh nghiệm di động, tuyển mới | Chọn theo thị trường tuyển dụng địa phương | Người quan trọng hơn công nghệ |
| Ứng dụng cần giao diện đồng nhất trên hai nền tảng | Nền tảng tự vẽ giao diện | Kiểm soát pixel tốt hơn |
| Ứng dụng dùng nhiều tính năng thiết bị đặc thù | Cả hai đều được, kiểm thư viện trước | Đây mới là yếu tố quyết định |
| Cần chia sẻ mã với ứng dụng web đã có | Nền tảng dùng JavaScript | Chia sẻ được phần logic |
Yếu tố quyết định thật với công ty Việt Nam thường là câu thứ hai: tuyển được người nào. Chọn nền tảng mà thị trường lao động địa phương không có người là tự chuốc khó khăn, dù nền tảng đó tốt hơn trên giấy.
Máy chủ phía sau, phần chung của mọi ứng dụng
- Máy chủ phía sau: ứng dụng di động nào cũng cần nơi lưu dữ liệu và xử lý nghiệp vụ. Đây là phần chiếm nhiều công sức hơn chính ứng dụng.
- Máy dựng bản Android: chạy trên máy chủ Linux được, xem bài về dựng ứng dụng Android.
- Máy dựng bản iOS: bắt buộc phải là máy Mac, không có ngoại lệ. Xem bài về ranh giới máy Mac.
- Nơi lưu và phân phối bản thử cho người kiểm thử trước khi nộp cửa hàng.
Ba rủi ro nên tính trước
- Thư viện của bên thứ ba ngừng bảo trì. Kiểm ngày cập nhật gần nhất của các thư viện quan trọng trước khi phụ thuộc vào chúng.
- Nâng cấp phiên bản lớn có thể tốn nhiều công. Tính vào kế hoạch bảo trì hằng năm, đừng coi ứng dụng làm xong là xong.
- Yêu cầu của cửa hàng ứng dụng thay đổi, ví dụ yêu cầu về quyền riêng tư và về phiên bản hệ điều hành tối thiểu. Ứng dụng không cập nhật sẽ bị gỡ khỏi cửa hàng.
Câu hỏi thường gặp
Flutter có nhanh hơn React Native không?
Trong các phép đo tổng hợp, Flutter thường nhỉnh hơn ở cảnh có hiệu ứng chuyển động phức tạp vì nó tự vẽ giao diện. Với ứng dụng kinh doanh thông thường, khác biệt nhỏ tới mức người dùng không nhận ra.
Học Dart có khó không?
Không khó với người đã biết một ngôn ngữ hướng đối tượng. Phần lớn lập trình viên viết được màn hình đầu tiên sau vài ngày và làm việc thoải mái sau một tới hai tuần. Cái tốn thời gian hơn là học cách tổ chức trạng thái ứng dụng.
Có thể dùng chung mã nguồn với web không?
Flutter chạy được trên web nhưng kết quả hợp với ứng dụng nội bộ hơn là trang cần chuẩn SEO. React Native chia sẻ được phần logic với React web khá tự nhiên, còn phần giao diện vẫn phải viết riêng.
Cần chuẩn bị hạ tầng gì trước khi bắt đầu?
Một máy Linux để build nhánh Android và chạy backend, một máy Mac cho nhánh iOS, cùng nơi lưu bản dựng cho đội kiểm thử. Phần backend nên đặt trong nước nếu người dùng của bạn ở Việt Nam.
