给S32K3的中断上个‘闹钟’:手把手配置INTM监控PIT定时器中断响应
2026/5/7 5:21:27
在鸿蒙(HarmonyOS)应用中集成Flutter时,深色模式的适配是一个关键需求。以下详细说明如何实现鸿蒙深色模式与Flutter界面的联动适配,并提供代码案例。
鸿蒙OS通过Configuration类提供系统主题状态信息,开发者可以获取当前系统的UI模式配置。其中深色模式的判断是通过uiMode和UI_MODE_NIGHT_MASK的组合运算实现的。
获取当前UI模式配置:
int uiMode = getResourceManager().getConfiguration().uiMode;判断是否为深色模式:
boolean isDarkMode = (uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;在Ability的onStart生命周期中,我们需要将主题状态传递给Flutter模块:
建立通信通道:
FlutterHarmonyAppBundle.getInstance() .getFlutterEngine() .getDartExecutor()发送主题状态:
.send("harmony/theme", isDarkMode);// MainAbility.java public class MainAbility extends Ability { private static final String CHANNEL_NAME = "harmony/theme"; @Override public void onStart(Intent intent) { super.onStart(intent); // 1. 获取当前系统主题配置 Configuration config = getResourceManager().getConfiguration(); int uiMode = config.uiMode; // 2. 判断是否为深色模式 boolean isDarkMode = (uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; // 3. 通过MethodChannel传递给Flutter FlutterHarmonyAppBundle.getInstance() .getFlutterEngine() .getDartExecutor() .send(CHANNEL_NAME, isDarkMode); } }FlutterHarmonyAppBundle已正确初始化Flutter端主题状态接收 在Flutter中通过MethodChannel监听鸿蒙端的主题变化,实现步骤如下:
// main.dart // 定义通道名称,需要与鸿蒙端保持一致 const String CHANNEL_NAME = 'harmony/theme'; final MethodChannel _channel = MethodChannel(CHANNEL_NAME);void _listenThemeChanges() { _channel.setMethodCallHandler((MethodCall call) async { // 检查调用的方法名称 if (call.method == 'isDarkMode') { // 获取鸿蒙端传递的布尔值参数 final isDark = call.arguments as bool; // 调用主题更新方法 _updateAppTheme(isDark); } }); }void _updateAppTheme(bool isDark) { // 根据布尔值确定亮度模式 final brightness = isDark ? Brightness.dark : Brightness.light; // 重新构建MaterialApp以应用新主题 runApp( MaterialApp( theme: ThemeData( brightness: brightness, // 可以扩展更多主题配置 primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(), ), ); }void main() { WidgetsFlutterBinding.ensureInitialized(); _listenThemeChanges(); runApp(MyApp()); }应用场景说明:
注意事项:
// theme_provider.dart import 'package:flutter/material.dart'; /// 主题状态管理类 class ThemeProvider with ChangeNotifier { bool _isDark = false; // 默认使用亮色主题 ThemeMode _themeMode = ThemeMode.light; // 添加主题模式枚举 bool get isDark => _isDark; ThemeMode get themeMode => _themeMode; /// 设置暗黑模式状态 void setDarkMode(bool value) { _isDark = value; _themeMode = value ? ThemeMode.dark : ThemeMode.light; notifyListeners(); // 通知所有监听者状态已变更 } /// 切换主题模式(亮色/暗色) void toggleTheme() { _isDark = !_isDark; _themeMode = _isDark ? ThemeMode.dark : ThemeMode.light; notifyListeners(); } }// main.dart void main() { runApp( ChangeNotifierProvider( create: (_) => ThemeProvider(), child: const MyApp(), ), ); }// app_widget.dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Consumer<ThemeProvider>( builder: (_, provider, __) => MaterialApp( title: '主题切换示例', debugShowCheckedModeBanner: false, theme: ThemeData.light().copyWith( primaryColor: Colors.blue, colorScheme: ColorScheme.light( primary: Colors.blue, secondary: Colors.blueAccent, ), ), darkTheme: ThemeData.dark().copyWith( colorScheme: ColorScheme.dark( primary: Colors.blueGrey, secondary: Colors.blueGrey[300], ), ), themeMode: provider.themeMode, // 使用当前主题模式 home: const HomePage(), ), ); } }// 切换按钮示例 Switch( value: Provider.of<ThemeProvider>(context).isDark, onChanged: (value) { Provider.of<ThemeProvider>(context, listen: false).setDarkMode(value); }, ) // 或者使用IconButton IconButton( icon: Icon( Provider.of<ThemeProvider>(context).isDark ? Icons.light_mode : Icons.dark_mode ), onPressed: () { Provider.of<ThemeProvider>(context, listen: false).toggleTheme(); }, )// 在ThemeProvider中添加持久化逻辑 Future<void> loadThemePref() async { final prefs = await SharedPreferences.getInstance(); _isDark = prefs.getBool('isDark') ?? false; _themeMode = _isDark ? ThemeMode.dark : ThemeMode.light; notifyListeners(); } Future<void> saveThemePref() async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool('isDark', _isDark); }// 自定义主题数据 ThemeData customLightTheme = ThemeData( primarySwatch: Colors.indigo, brightness: Brightness.light, // 其他自定义配置... ); ThemeData customDarkTheme = ThemeData( primarySwatch: Colors.amber, brightness: Brightness.dark, // 其他自定义配置... );// 检测系统主题偏好 void initSystemTheme() { WidgetsBinding.instance.window.platformBrightness.addListener(() { final brightness = WidgetsBinding.instance.window.platformBrightness; setDarkMode(brightness == Brightness.dark); }); }// theme_provider.dart import 'package:flutter/material.dart'; /// 主题状态管理类 class ThemeProvider with ChangeNotifier { bool _isDark = false; // 默认使用亮色主题 ThemeMode _themeMode = ThemeMode.light; // 添加主题模式枚举 bool get isDark => _isDark; ThemeMode get themeMode => _themeMode; /// 设置暗黑模式状态 void setDarkMode(bool value) { _isDark = value; _themeMode = value ? ThemeMode.dark : ThemeMode.light; notifyListeners(); // 通知所有监听者状态已变更 } /// 切换主题模式(亮色/暗色) void toggleTheme() { _isDark = !_isDark; _themeMode = _isDark ? ThemeMode.dark : ThemeMode.light; notifyListeners(); } }// main.dart void main() { runApp( ChangeNotifierProvider( create: (_) => ThemeProvider(), child: const MyApp(), ), ); }// app_widget.dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Consumer<ThemeProvider>( builder: (_, provider, __) => MaterialApp( title: '主题切换示例', debugShowCheckedModeBanner: false, theme: ThemeData.light().copyWith( primaryColor: Colors.blue, colorScheme: ColorScheme.light( primary: Colors.blue, secondary: Colors.blueAccent, ), ), darkTheme: ThemeData.dark().copyWith( colorScheme: ColorScheme.dark( primary: Colors.blueGrey, secondary: Colors.blueGrey[300], ), ), themeMode: provider.themeMode, // 使用当前主题模式 home: const HomePage(), ), ); } }// 切换按钮示例 Switch( value: Provider.of<ThemeProvider>(context).isDark, onChanged: (value) { Provider.of<ThemeProvider>(context, listen: false).setDarkMode(value); }, ) // 或者使用IconButton IconButton( icon: Icon( Provider.of<ThemeProvider>(context).isDark ? Icons.light_mode : Icons.dark_mode ), onPressed: () { Provider.of<ThemeProvider>(context, listen: false).toggleTheme(); }, )// 在ThemeProvider中添加持久化逻辑 Future<void> loadThemePref() async { final prefs = await SharedPreferences.getInstance(); _isDark = prefs.getBool('isDark') ?? false; _themeMode = _isDark ? ThemeMode.dark : ThemeMode.light; notifyListeners(); } Future<void> saveThemePref() async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool('isDark', _isDark); }// 自定义主题数据 ThemeData customLightTheme = ThemeData( primarySwatch: Colors.indigo, brightness: Brightness.light, // 其他自定义配置... ); ThemeData customDarkTheme = ThemeData( primarySwatch: Colors.amber, brightness: Brightness.dark, // 其他自定义配置... );// 检测系统主题偏好 void initSystemTheme() { WidgetsBinding.instance.window.platformBrightness.addListener(() { final brightness = WidgetsBinding.instance.window.platformBrightness; setDarkMode(brightness == Brightness.dark); }); }对于自定义组件,通过MediaQuery获取当前主题亮度:
Widget build(BuildContext context) { final brightness = MediaQuery.of(context).platformBrightness; final isDark = brightness == Brightness.dark; return Container( color: isDark ? Colors.grey[900] : Colors.white, child: Text( 'Adaptive Text', style: TextStyle( color: isDark ? Colors.white : Colors.black, ), ), ); }鸿蒙与Flutter协同的完整示例结构:
harmony_app/ ├── java/ # 鸿蒙端代码 │ └── MainAbility.java └── flutter/ ├── lib/ │ ├── main.dart │ ├── theme_provider.dart │ └── app_widget.dart └── pubspec.yaml注意事项
@Override public void onStart(Intent intent) { super.onStart(intent); FlutterHarmonyAppBundle.init(this); }Provider( create: (_) => ThemeNotifier(), child: MaterialApp( theme: ThemeData.light(), darkTheme: ThemeData.dark(), home: MyHomePage(), ) )assets/ images/ light/ logo.png dark/ logo.pngImage.asset( isDarkMode ? 'assets/images/dark/logo.png' : 'assets/images/light/logo.png' )通过以上方法可以实现:
实际开发中可根据项目需求:
欢迎大家加入[开源鸿蒙跨平台开发者社区](https://openharmonycrossplatform.csdn.net),一起共建开源鸿蒙跨平台生态。