aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh hoạ style và layout trong React Native với màn hình mobile, spacing và typography

React Native useColorScheme: đổi theme mà không cache màu từ module

Suong Nguyen by Suong Nguyen
01/11/2026
in React Native
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Ứng dụng mở ở light mode rồi không đổi màu khi người dùng chuyển hệ thống sang dark mode. Một nguyên nhân thường gặp là code đọc Appearance.getColorScheme tại cấp module, tính màu một lần rồi giữ nguyên object style đó cho các lần render sau.

Bài đối chiếu tài liệu React Native 0.88 ngày 01/11/2026. Mẫu dùng useColorScheme và component core. Chỉ logic chọn palette được chạy bằng Node; chưa build native hoặc thử thay đổi theme trên thiết bị, nên phần kiểm tra UI vẫn cần thực hiện trong dự án.

1. Giá trị hiện tại có thể thay đổi

useColorScheme theo dõi thay đổi từ Appearance và cung cấp giá trị cho render. Không cần tự đăng ký thêm listener chỉ để lặp lại chức năng cơ bản của hook trong ví dụ này.

Tài liệu đang tham chiếu có ba giá trị cần xét: light, dark và null khi native module không khả dụng. Mẫu chọn light làm fallback cho null. Đó là chính sách hiển thị của demo, không có nghĩa null được hệ điều hành định nghĩa là light.

2. Giữ palette tĩnh, chọn palette trong render

Các màu có thể được khai báo ở cấp module vì chúng là hằng số của thiết kế. Quyết định đang dùng bộ nào cần dựa trên giá trị hook ở lần render hiện tại.

import React from 'react';
import {StyleSheet, Text, View, useColorScheme} from 'react-native';

const palettes = {
  light: {
    background: '#ffffff',
    surface: '#f1f5f9',
    text: '#0f172a',
    secondary: '#334155',
  },
  dark: {
    background: '#0f172a',
    surface: '#1e293b',
    text: '#f8fafc',
    secondary: '#cbd5e1',
  },
};

export function paletteFor(scheme) {
  return scheme === 'dark' ? palettes.dark : palettes.light;
}

export default function ThemeDemo() {
  const scheme = useColorScheme();
  const colors = paletteFor(scheme);
  return (
    <View style={[styles.screen, {backgroundColor: colors.background}]}>
      <Text style={[styles.title, {color: colors.text}]}>Giao diện theo theme</Text>
      <View style={[styles.card, {backgroundColor: colors.surface}]}>
        <Text style={{color: colors.text}}>Scheme: {scheme ?? 'null'}</Text>
        <Text style={{color: colors.secondary}}>
          Đổi cài đặt giao diện rồi quay lại kiểm tra màn hình.
        </Text>
      </View>
    </View>
  );
}

const styles = StyleSheet.create({
  screen: {flex: 1, padding: 24, justifyContent: 'center', gap: 16},
  title: {fontSize: 24, fontWeight: '600'},
  card: {padding: 16, borderRadius: 12, gap: 8},
});

Đặt component vào màn hình React Native đã có vùng chứa phù hợp. StyleSheet giữ phần bố cục không phụ thuộc theme; màu được thêm ở render. Không cần tạo lại toàn bộ hệ thống style chỉ để đổi một màu chữ.

3. Phép thử logic không phải phép thử native

Hàm paletteFor được trích nguyên từ snippet và kiểm tra trên Node.js 24.18.1 với light, dark và null. Kết quả chọn đúng object palette theo chính sách demo. Phép thử đó chưa chứng minh hook nhận được sự kiện hệ điều hành hoặc component render đúng trên Android/iOS.

Trong app thật, mở màn hình, đổi appearance ở cài đặt hệ thống rồi quay lại. Kiểm tra cả nền, chữ, màu phụ và các màn hình con. Nếu chỉ cập nhật background mà quên màu Text, giao diện có thể khó đọc dù hook đã cập nhật đúng.

Đọc scheme ở module rồi nhét màu vào StyleSheet một lần sẽ không tự tính lại khi hook ở component khác thay đổi. Hãy tìm nơi giá trị được chụp, thay vì thêm force update vào nhiều màn hình để bù cho snapshot cũ.

4. Phân biệt lựa chọn hệ thống và override của app

Appearance còn có khả năng override scheme ở cấp ứng dụng. Theo tài liệu hiện tại, setColorScheme với auto bỏ override để theo hệ thống; nó không thay đổi cài đặt appearance của hệ điều hành hoặc các app khác.

Mẫu không gọi API override và không có bộ chọn theme riêng. Nếu sản phẩm hỗ trợ ba lựa chọn sáng, tối, theo hệ thống, hãy xác định một nơi làm nguồn quyết định rồi kiểm tra cả ba chế độ. Đừng vừa giữ state riêng vừa override Appearance ở nhiều nơi mà không rõ thứ tự ưu tiên.

Lỗi thường gặp và giới hạn

Nếu máy luôn trả một scheme, kiểm tra cấu hình native của project và override đang tồn tại trước khi kết luận hook lỗi. Khi chụp screenshot trên iOS, tài liệu có lưu ý về thời điểm snapshot light/dark và cập nhật bất đồng bộ; cần phân biệt ảnh chụp với trạng thái UI đang tương tác.

Mẫu chưa cấu hình status bar, navigation bar, ảnh theo theme hoặc thư viện navigation. Nó cũng không tự chứng minh mọi cặp màu đạt tiêu chí tương phản của sản phẩm. Dùng checklist hiển thị và kiểm tra thiết bị để hoàn thiện các lớp đó sau khi logic chọn palette đã rõ ràng.

Nguồn tham khảo

  • React Native: useColorScheme
  • React Native: Appearance và override
  • React Native: style và thứ tự áp dụng

Tags: HooksReact NativeTheme
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh hoạ component React Native như các khối giao diện tái sử dụng

React Native Pressable: tách phản hồi nhấn và hành động

by Suong Nguyen
31/10/2026
0

Dùng trạng thái pressed cho phản hồi giao diện, onPress cho thao tác và kiểm tra riêng nhấn giữ, hủy cử chỉ, vùng chạm.

Minh hoạ FlatList hiển thị danh sách bài viết trong React Native

React Native RefreshControl: giữ refreshing đúng vòng đời của lượt tải

by Suong Nguyen
30/10/2026
0

Tách trạng thái loading của giao diện với khóa chống lượt refresh chồng nhau, và luôn kết thúc spinner sau thành công hoặc lỗi.

Minh hoạ form TextInput validation và keyboard trong React Native

React Native TextInput: bàn phím numeric không thay thế validation

by Suong Nguyen
29/10/2026
0

Giữ input số lượng dưới dạng string trong lúc nhập, kiểm tra định dạng và khoảng giá trị khi xác nhận.

Minh hoạ state thay đổi và làm giao diện React Native cập nhật lại

React Native Switch: cập nhật value từ onValueChange và khóa đúng bằng disabled

by Suong Nguyen
28/10/2026
0

Dựng một cài đặt boolean có nguồn dữ liệu rõ ràng, tránh Switch bật rồi trở lại giá trị cũ và tách trạng thái khóa khỏi giá trị...

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native useColorScheme: đổi theme mà không cache màu từ module
  • Return trong finally có thể che cả return lẫn lỗi ban đầu
  • Android Intent extra: thiếu dữ liệu khác với giá trị 0

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply