Harmony OS Next
Implementing In-App Dark Mode Switching in HarmonyOS Next
The implementation uses @Provider
and @Consume
to share a lightMode
variable across components, with persisted settings for consistent theme application.
1. Declare @Provide in Entry Component
@Entry
@Component
struct QuickTestMainPage {
@Provide lightMode: boolean = true; // true = Light mode, false = Dark mode
}
2. Retrieve Persistent Theme Setting
import { StyleFit } from './utils/StyleFit';
@Entry
@Component
struct QuickTestMainPage {
@Provide lightMode: boolean = true;
aboutToAppear() {
// Retrieve saved theme preference
this.lightMode = StyleFit.getLightMode();
}
}
3. StyleFit Utility Class Implementation
export class StyleFit {
private static lightMode: boolean = true; // Default: Light mode
// Initialize from persistent storage
static init() {
PreferencesUtil.getString("light_mode").then(value => {
StyleFit.lightMode = (value === "1" || value === "");
})
}
// Update theme preference
static setLightMode(value: boolean) {
StyleFit.lightMode = value;
PreferencesUtil.putSync("light_mode", value ? "1" : "0");
}
// Get current theme
static getLightMode() {
return StyleFit.lightMode;
}
}
4. Color Token Management with StyleRes
export enum StyleColor {
backgroundColor, // Background color
pageColor, // Page color
cardBgColor, // Card background
cardBgActiveColor,// Active card background
textNormalColor, // Normal text
textBoldColor, // Bold text
blackTextActiveColor, // Active black text
texSubColor, // Secondary text
shadowColor, // Shadow color
}
export class StyleRes {
static getStyleColor(styleColor: StyleColor, lightMode: boolean) {
switch (styleColor) {
case StyleColor.backgroundColor:
return lightMode ? "#ffffffff" : "#FF191B27";
case StyleColor.pageColor:
return lightMode ? "#fff7f8fb" : "#FF191B27";
case StyleColor.cardBgColor:
return lightMode ? "#ffffffff" : "#FF292B38";
case StyleColor.cardBgActiveColor:
return lightMode ? "#FFE0EFFF" : "#FF162741";
case StyleColor.textNormalColor:
return lightMode ? "#FF465069" : "#FF999FB5";
case StyleColor.textBoldColor:
return lightMode ? "#FF191B27" : "#FF999FB5";
case StyleColor.blackTextActiveColor:
return lightMode ? "#FF191B27" : "#FF0080FF";
case StyleColor.texSubColor:
return lightMode ? "#FF465069" : "#FF999FB5";
case StyleColor.shadowColor:
return lightMode ? "#14000000" : "#FF222634";
default:
return "#ffffffff";
}
}
}
5. Applying Themes in UI Components
import { StyleColor, StyleRes } from './utils/StyleRes';
@Component
struct BottomTool {
@Consume lightMode: boolean; // Access theme state
build() {
Column() {
// Component content
}
.backgroundColor(StyleRes.getStyleColor(
StyleColor.backgroundColor,
this.lightMode
))
}
}
Theme Switching Implementation:
// Toggle theme in any component
Button('Toggle Theme')
.onClick(() => {
const newMode = !this.lightMode;
StyleFit.setLightMode(newMode);
this.lightMode = newMode;
})
Key Features:
-
Centralized State Management:
@Provide
/@Consume
for reactive theme updates - Persistent Settings: Theme preferences saved across app sessions
- Token-Based Design: Central color definitions ensure consistency
- Simple Integration: Single-line color application in components
- Flexible Theming: Easy to add new color tokens or themes
This implementation provides a maintainable, scalable solution for dark/light theme switching that automatically propagates changes throughout the application.
Top comments (0)