Flutter for OpenHarmony 万能游戏库App实战 - 主题切换实现

主题切换是现代应用的重要功能。这篇文章我们来实现一个完整的主题系统,包括浅色主题、深色主题、以及跟随系统主题。通过这个功能,我们能展示如何构建一个灵活的主题管理系统

主题提供者

ThemeProvider使用Provider模式管理主题:

dart 复制代码
class ThemeProvider extends ChangeNotifier {
  ThemeMode _themeMode = ThemeMode.system;

  ThemeMode get themeMode => _themeMode;

  void setThemeMode(ThemeMode mode) {
    _themeMode = mode;
    notifyListeners();
  }

  ThemeData getLightTheme() {
    return ThemeData(
      useMaterial3: true,
      brightness: Brightness.light,
      colorScheme: ColorScheme.fromSeed(
        seedColor: Colors.blue,
        brightness: Brightness.light,
      ),
    );
  }

  ThemeData getDarkTheme() {
    return ThemeData(
      useMaterial3: true,
      brightness: Brightness.dark,
      colorScheme: ColorScheme.fromSeed(
        seedColor: Colors.blue,
        brightness: Brightness.dark,
      ),
    );
  }
}

使用ColorScheme.fromSeed创建一致的颜色方案。
支持浅色和深色两种主题。

应用集成

在MyApp中集成主题提供者:

dart 复制代码
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Consumer<ThemeProvider>(
      builder: (context, themeProvider, _) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: themeProvider.getLightTheme(),
          darkTheme: themeProvider.getDarkTheme(),
          themeMode: themeProvider.themeMode,
          home: const HomePage(),
        );
      },
    );
  }
}

使用Consumer监听ThemeProvider的变化。
根据themeMode选择合适的主题。

主题切换UI

在设置页面中实现主题切换:

dart 复制代码
          Card(
            child: Consumer<ThemeProvider>(
              builder: (context, themeProvider, _) {
                return Column(
                  children: [
                    RadioListTile<ThemeMode>(
                      title: const Text('跟随系统'),
                      subtitle: const Text('自动切换主题'),
                      value: ThemeMode.system,
                      groupValue: themeProvider.themeMode,
                      onChanged: (value) {
                        if (value != null) {
                          themeProvider.setThemeMode(value);
                        }
                      },
                    ),
                    const Divider(height: 1),
                    RadioListTile<ThemeMode>(
                      title: const Text('浅色模式'),
                      value: ThemeMode.light,
                      groupValue: themeProvider.themeMode,
                      onChanged: (value) {
                        if (value != null) {
                          themeProvider.setThemeMode(value);
                        }
                      },
                    ),
                    const Divider(height: 1),
                    RadioListTile<ThemeMode>(
                      title: const Text('深色模式'),
                      value: ThemeMode.dark,
                      groupValue: themeProvider.themeMode,
                      onChanged: (value) {
                        if (value != null) {
                          themeProvider.setThemeMode(value);
                        }
                      },
                    ),
                  ],
                );
              },
            ),
          ),

使用RadioListTile让用户选择主题模式。
支持三种模式:跟随系统、浅色、深色。

主题颜色定制

可以通过自定义ColorScheme来定制主题颜色:

dart 复制代码
  ThemeData getLightTheme() {
    return ThemeData(
      useMaterial3: true,
      brightness: Brightness.light,
      colorScheme: ColorScheme.fromSeed(
        seedColor: Colors.blue,
        brightness: Brightness.light,
      ),
      appBarTheme: const AppBarTheme(
        elevation: 0,
        centerTitle: true,
      ),
      cardTheme: CardTheme(
        elevation: 2,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(12),
        ),
      ),
    );
  }

自定义AppBar和Card的样式。
使用Material 3的动态颜色系统。

总结

这篇文章我们实现了一个完整的主题系统。涉及到的知识点包括:

  • 主题管理 - 使用ThemeProvider管理主题
  • 主题定制 - 使用ColorScheme定制主题颜色
  • Material 3 - 使用Material 3的设计系统
  • 动态颜色 - 使用ColorScheme.fromSeed创建动态颜色
  • 用户选择 - 支持用户选择主题模式
  • 系统集成 - 支持跟随系统主题

主题系统展示了如何构建一个灵活的主题管理系统 。通过完善的主题定制和用户选择,我们能为用户提供一个个性化的应用体验


欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

相关推荐
aini_lovee1 小时前
MATLAB基于小波技术的图像融合实现
开发语言·人工智能·matlab
WooaiJava1 小时前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
少云清1 小时前
【金融项目实战】7_接口测试 _代码实现接口测试(重点)
python·金融项目实战
微祎_1 小时前
Flutter for OpenHarmony:构建一个 Flutter 平衡球游戏,深入解析动画控制器、实时物理模拟与手势驱动交互
flutter·游戏·交互
深蓝电商API1 小时前
爬虫IP封禁后的自动切换与检测机制
爬虫·python
R1nG8631 小时前
多线程安全设计 CANN Runtime关键数据结构的锁优化
开发语言·cann
m0_550024631 小时前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
初次见面我叫泰隆1 小时前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
亓才孓1 小时前
[Class的应用]获取类的信息
java·开发语言
开开心心就好2 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender