Kỹ năng web của bạn, tiến thêm một bước tới túi user: app native (Swift/Kotlin) và cross-platform (React Native/Flutter) — cùng thói quen ship-it.
← / → để chuyển slide · chuyển EN/VI bên dưới
Không phải một URL — một gói code + asset sống ngay trên thiết bị.
App được tải từ store (hoặc link) và chạy ngay trên thiết bị — có mạng hay không cũng chạy.
NATIVE: viết bằng ngôn ngữ riêng của nền tảng (Swift trên iOS, Kotlin trên Android). CROSS-PLATFORM: viết một lần, gói cho cả hai (React Native, Flutter).
Code → build → chạy trên thiết bị hoặc máy ảo → nhìn → sửa. Vòng lặp dev y hệt web — chỉ khác đích đến là điện thoại.
Cùng ý tưởng reactive như web: màn hình là hàm của state. Đổi state, UI tự vẽ lại — dù là tab trình duyệt hay điện thoại.
Cả quyết định mobile gói trong một slide.
Swift cho iOS, Kotlin cho Android. Nhanh nhất, bóng bẩy nhất, truy cập đủ phần cứng — nhưng HAI codebase, hai ngôn ngữ, hai app store.
Chọn khi chính nền tảng là sản phẩm.
React Native (JSX) hoặc Flutter (Dart): viết một lần, ship cả hai store. Khoảng 90–95% trải nghiệm native với hầu hết app.
Chọn khi có mặt ở khắp nơi là quan trọng nhất.
Bốn lựa chọn đáp ứng 99% công việc mobile thực tế.
iOS, iPadOS, macOS. Hiện đại, an toàn, nhanh; cách duy nhất để có app Apple chuẩn mực. IDE là Xcode.
Ngôn ngữ chính thức của Android: ngắn gọn, thân thiện với Java, an toàn null. IDE là Android Studio.
Truy cập đủ phần cứng (camera, GPS, cảm biến, push), hiệu năng tốt nhất, và công cụ được store khuyến nghị.
Hai codebase và hai ngôn ngữ cho hai store — gấp đôi công, gấp đôi hàng chờ duyệt.
Kỹ năng web của bạn, trên điện thoại: JavaScript + JSX render thành widget native THẬT. Expo là lối vào dễ nhất.
Bộ công cụ của Google: codebase Dart tự VẼ UI của nó (không dùng widget native). Một diện mạo chuẩn pixel trên mọi màn hình.
Một codebase, cả hai store. Hot reload: lưu file là thấy trên máy trong một giây. Hệ sinh thái lớn, trưởng thành.
5–10% hoàn thiện cuối, và đôi khi vướng với tính năng phần cứng mới nhất (native module lấp khoảng trống).
| Swift | Kotlin | React Native | Flutter | |
|---|---|---|---|---|
| Con đường | Native (iOS) | Native (Android) | Cross | Cross |
| Kiểu UI | Widget Apple native | Widget Android native | Widget native thật qua JS | Tự vẽ UI của nó |
| Store | App Store | Google Play | Both / Cả hai | Both / Cả hai |
| Hợp nhất cho | Sản phẩm iOS cao cấp | Sản phẩm Android cao cấp | Team JS, MVP nhanh | Chuẩn pixel, cả hai nền tảng |
Lưu file → app đang chạy cập nhật trong một giây, không cần build lại. Vòng lặp dev nhanh gấp 10 lần.
Emulator là điện thoại trong chương trình — ổn cho hầu hết việc, nhưng pin, camera và độ trễ thật chỉ có trên phần cứng thật.
JS được đóng gói; Dart được biên dịch (AOT) thành mã máy. Store nhận một gói đã ký: .ipa / .apk / .aab.
useState trong React Native, setState trong Flutter: cùng thỏa thuận reactive bạn gặp trên web, do framework thực thi.
Đúng là kiến thức React web của bạn — View và Text chỉ là div và p của app.
import { useState } from "react";
export default function App() {
const [count, setCount] = useState(0);
return (
<View style={styles.box}>
<Text>Tap count: {count}</Text>
<Button title="Tap" onPress={() => setCount(count + 1)} />
</View>
);
}
State đổi → màn hình vẽ lại — cùng thỏa thuận như web, nhưng giờ trên điện thoại.
Flutter dựng màn hình thành một cây Widget — UI là code, do engine tự vẽ.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("Hello, mobile")
)
);
}
}
Scaffold → Center → Text: ba widget, một màn hình. Đó là toàn bộ mẫu hình.
Expo trỏ điện thoại về laptop của bạn; flutter build rồi đẩy lên thiết bị.
Framework JS của Meta + bộ công cụ Expo — cách nhanh nhất để dev JS ship lên cả hai store.
Bộ công cụ cross-platform của Google. Hậu thuẫn công ty lớn, cộng đồng lớn, UI đồng nhất khắp nơi.
App Store + Google Play: hàng chờ duyệt, ký, version — nửa shipper của mobile. Dự trù một ngày cho lần nộp đầu.
Chọn sai là viết lại; chọn đúng là nhàm chán — và nhàm chán là tốt.
Một nền tảng quan trọng trước, sản phẩm sống còn nhờ camera/GPS/hiệu năng, hoặc bạn muốn 1% hoàn thiện cuối cùng.
Trả giá một lần; nền tảng kia làm sau.
Có mặt trên cả hai store ngay từ ngày đầu là quan trọng, bạn là team JS (→ React Native) hoặc muốn một UI nhất quán chuẩn pixel (→ Flutter).
Ship nhanh hơn, lặp nhanh hơn — 5% cuối để sau.
Cây cầu JS/Dart → native khi framework không chạm được phần cứng trực tiếp.
Token APNs/FCM, luồng quyền, app gõ cửa user — một chủ đề có giấy tờ riêng.
Lưu cục bộ, giải quyết xung đột, ra vào mạng — 10% khó của app thực thụ.
Build đã ký, rollout từng phần, mua trong ứng dụng, gói thuê bao — nửa shipper của mobile.
Mobile app chỉ là codebase của bạn khoác lên một thiết bị: cùng state, cùng vòng lặp build-chạy-nhìn, cùng kỷ luật ship — cái duy nhất mới là user cầm nó trong túi.
Giờ bạn đã nói được mọi ngôn ngữ trong khóa học — chọn một và ship đi.