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

相关推荐
橙橙笔记9 小时前
QT的安装
开发语言·qt·安装·软件
Python私教9 小时前
多个项目怎么安全合并?适配层、双轨验证与可回滚切换
python·软件架构·系统迁移
船厂电气自动化ai大模型9 小时前
AI大模型与数学第42课:泰勒级数完整展开(神经网络近似核心)
人工智能·python·深度学习·算法·机器学习
格林威9 小时前
C#图像像素放大:邻域平均、双线性插值实现像素放大的C#实现代码
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
兔兔兔兔19 小时前
记录C++ 8
开发语言·c++
刘新洲10 小时前
我以为 AI Agent 只是调模型,直到我亲手补上审批、Outbox 和故障恢复
python·agent·fastapi
NINO10 小时前
深度解析 Android ANR:从标准分析流程到 NativePollOnce 疑难破局
android
qq_5137280410 小时前
浏览器配置 + 文件上传 + 截图
python·selenium·测试工具·计算机外设
阿巴斯甜10 小时前
AppFunctions 完整介绍
android
名字还没想好☜10 小时前
Go 1.23 range-over-func 迭代器实战:自定义可迭代类型、提前退出与惰性求值
开发语言·后端·golang·go·迭代器