SafeAreaView là một thành phần React Native cho bố cục tính đến vùng an toàn của màn hình trên các thiết bị có tai thỏ và góc tròn. Trên iPhone có Notch và Dynamic Island, nội dung có thể bị che bởi camera và các chỉ báo. SafeAreaView tự động thêm padding, ngăn giao diện bị cắt bởi các phần tử hệ thống. Tìm hiểu thêm về Safe Area trong tài liệu chính thức của Meta.
Ý chính
SafeAreaView là một thành phần React Native tự động thêm padding bên trong để nội dung không bị che bởi các phần tử giao diện hệ thống: thanh trạng thái, Notch, Dynamic Island và thanh điều hướng hệ thống. Thành phần này xuất hiện trong React Native 0.50 cho iOS và sau đó được mở rộng cho Android.
Trên iOS, SafeAreaView sử dụng UIView.safeAreaInsets gốc, được giới thiệu trong iOS 11 (2017). Trên Android, thành phần tính đến WindowInsets — các insets hệ thống có sẵn từ Android 5.0 (API 21). Theo Apple (2026), 92% iPhone đang hoạt động có màn hình với notch hoặc Dynamic Island.
Khái niệm Safe Area là một phần của khuyến nghị Apple HIG (Human Interface Guidelines). Trước iPhone X (2017), toàn bộ không gian màn hình đều an toàn. Với sự xuất hiện của Notch, Apple đã xác định các khu vực không nên đặt nội dung: phần cắt camera, chỉ báo thời gian và pin, chỉ báo home. Android đã triển khai một khái niệm tương tự với sự ra đời của màn hình notch vào năm 2018.
Trên iOS, SafeAreaView đọc safeAreaInsets từ hướng dẫn bố cục gốc. Inset phía trên bao gồm chiều cao của thanh trạng thái (thường là 44 hoặc 50 điểm cho iPhone có Notch). Inset phía dưới là 34 điểm cho chỉ báo Home. Android sử dụng WindowInsets — inset trên cho thanh trạng thái và inset dưới cho điều hướng hệ thống.
| Nền tảng | Inset trên | Inset dưới | Nguồn |
|---|---|---|---|
| iOS (Notch) | 44-50 pt | 34 pt | safeAreaInsets.top / .bottom |
| iOS (không Notch) | 20 pt | 0 pt | safeAreaInsets.top / .bottom |
| Android (có notch) | 24-48 dp | 24-48 dp | WindowInsets.systemBarsInsets |
| Android (không notch) | 24 dp | 0 dp | WindowInsets.statusBarsInsets |
Quan trọng: SafeAreaView tự động áp dụng padding, nhưng chỉ cho container gốc. Các thành phần lồng nhau không nhận được bảo vệ — mỗi màn hình phải có SafeAreaView riêng. Đối với cửa sổ modal và BottomSheet, hãy tính đến các insets riêng biệt.
Notch là phần cắt phần cứng ở trên cùng của màn hình chứa camera và cảm biến. Nó xuất hiện trên iPhone X (2017). Dynamic Island là vùng phần mềm-phần cứng của iPhone 14 Pro trở lên, thay thế Notch bằng một phần tử tương tác. Cả hai đều yêu cầu inset trên 50-56 pt.
Trên Android, các notch có nhiều hình dạng khác nhau: hình giọt nước, punch-hole, dải dưới camera. SafeAreaView trên Android sử dụng WindowInsets, tính đến hình dạng của notch. Đối với ứng dụng ở chế độ ngang, các inset bên được thêm vào để ngăn nội dung chồng lên các phần tử hệ thống.
import React from 'react';
import { SafeAreaView, View, Text } from 'react-native';
const App = () => (
<SafeAreaView style={{ flex: 1 }}>
<View style={styles.content}>
<Text>Content is safe from Notch and system bars</Text>
</View>
</SafeAreaView>
);Cách tiếp cận Edge-to-edge (Android 15+) khuyến nghị vẽ nội dung dưới các thanh hệ thống, nhưng tính đến các insets cho các phần tử tương tác. SafeAreaView giúp duy trì sự cân bằng này: nền được vẽ dưới các thanh, trong khi các nút và văn bản vẫn ở trong vùng an toàn.
SafeAreaView là cách đơn giản nhất để bảo vệ nội dung, nhưng không phải lúc nào cũng linh hoạt. Thành phần áp dụng cùng một padding cho tất cả các cạnh, điều này bất tiện khi cần padding khác nhau cho các cạnh khác nhau. Ví dụ, padding bên có thể không cần thiết, trong khi padding dưới có thể chỉ cần cho một nút.
Các lựa chọn thay thế chính: useSafeAreaInsets từ react-native-safe-area-context (giải pháp linh hoạt nhất), StatusBar.currentHeight trên Android, Platform.OS với kiểm tra thủ công model thiết bị. Đối với các trường hợp phức tạp, hãy sử dụng kết hợp SafeAreaView cho container tổng thể và useSafeAreaInsets cho các phần tử riêng lẻ.
import { useSafeAreaInsets } from 'react-native-safe-area-context';
const CustomHeader = () => {
const insets = useSafeAreaInsets();
return (
<View style={{ paddingTop: insets.top }}>
<Header />
</View>
);
};Thư viện react-native-safe-area-context là tiêu chuẩn thực tế để làm việc với Safe Area trong React Native. Nó được hỗ trợ bởi Expo, React Navigation và hầu hết các bộ UI. Nó cung cấp cả hook và thành phần Consumer cho cả hai cách tiếp cận hàm và dựa trên lớp.
react-native-safe-area-context là một thư viện cung cấp API linh hoạt hơn SafeAreaView tích hợp sẵn. Lợi thế chính là truy cập vào các giá trị inset riêng lẻ (top, bottom, left, right) thông qua hook useSafeAreaInsets, cho phép áp dụng inset có chọn lọc.
Thư viện cũng cung cấp SafeAreaProvider — một thành phần bắt buộc ở cấp cao nhất của ứng dụng. Nó đăng ký nhận thay đổi insets hệ thống khi xoay màn hình hoặc mở bàn phím. React Navigation sử dụng thư viện này theo mặc định.
SafeAreaView từ react-native-safe-area-context khác với thành phần tích hợp sẵn: nó hoạt động trên nhiều thiết bị hơn và hỗ trợ hoạt ảnh thay đổi inset. Đối với các dự án mới, nên cài đặt thư viện này như một phụ thuộc và sử dụng SafeAreaView của nó thay vì thành phần tích hợp sẵn.
SafeAreaView thường được sử dụng không đúng cách. Lỗi đầu tiên là bọc mọi thành phần trong SafeAreaView, tạo ra padding kép. Quy tắc: một SafeAreaView cho một View gốc của màn hình. Các thành phần lồng nhau kế thừa các insets thông qua bố cục Flex.
Lỗi thứ hai là bỏ qua Android. Trên Android, SafeAreaView sử dụng WindowInsets, có thể khác nhau giữa các phiên bản OS. Trên Android 15+, các thanh hệ thống có thể trong suốt và insets thay đổi. Luôn kiểm tra SafeAreaView trên thiết bị thực, không chỉ trong trình giả lập.
Lỗi thứ ba là padding cứng. Không bao giờ sử dụng Platform.OS === 'ios' ? 44 : 24 — giá trị insets thay đổi giữa các model và phiên bản OS. Luôn sử dụng API hệ thống: safeAreaInsets hoặc useSafeAreaInsets. Dynamic Island trên iPhone 15 Pro có insets khác với Notch trên iPhone X.
Câu hỏi thường gặp
SafeAreaView hoạt động trên iOS 11+ và Android 5+. Trên các thiết bị cũ, insets sẽ bằng 0, điều này không gây lỗi nhưng có thể cần điều chỉnh thủ công. Để tương thích tối đa, hãy sử dụng react-native-safe-area-context.
SafeAreaView tích hợp sẵn không cho phép chọn các cạnh. Sử dụng useSafeAreaInsets từ react-native-safe-area-context: lấy insets.top và áp dụng paddingTop. Hoặc bọc SafeAreaView trong một View với lề âm để bù đắp cho inset dưới.
Trên một số thiết bị Android, SafeAreaView có thể không hoạt động do cài đặt của nhà sản xuất. Đảm bảo rằng React Native 0.64+ đang được sử dụng. Để đảm bảo hoạt động, hãy cài đặt react-native-safe-area-context và bọc ứng dụng trong SafeAreaProvider.
Có, khi xoay màn hình, SafeAreaView tính toán lại các insets. ở chế độ ngang trên iPhone có Notch, các insets bên có thể là 0, trong khi inset trên vẫn được giữ nguyên. Thành phần react-native-safe-area-context tự động đăng ký các thay đổi hướng.
SafeAreaView quản lý các insets nội dung từ tất cả các phần tử hệ thống (thanh trạng thái, Notch, chỉ báo home). StatusBar là một thành phần để kiểm soát màu sắc, kiểu dáng và khả năng hiển thị của thanh trạng thái. Chúng giải quyết các nhiệm vụ khác nhau và có thể được sử dụng cùng nhau.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm