Flutter动态主题切换插件dynamic_themer的使用

简介

动态主题切换演示

DynamicThemer 是一个用于在 Flutter 应用中实现动态主题切换的包。它支持基于用户操作、一天中的时间或系统偏好设置进行主题切换,为开发者提供了创建具有吸引力和视觉效果的应用程序的直观方式。


特性

  1. 动态亮暗模式切换
  2. 基于时间的主题触发(例如:白天亮模式,晚上暗模式)
  3. 动态渐变背景
  4. 文本、按钮和其他 UI 组件的主题定制
  5. 基于系统偏好设置的主题切换
  6. 轻松集成自定义小部件
    • DynamicThemeWrapper
    • ThemeSwitcher
    • DynamicGradientBackground

示例应用(时钟)

时钟示例

使用方法

将您的应用包装在 DynamicThemeWrapper 中,并使用提供的小部件来实现动态主题切换。

示例代码

以下是一个基本实现:

main.dart

import 'package:flutter/material.dart';
import 'package:dynamic_themer/dynamic_themer.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DynamicThemeWrapper(
      // 定义亮色主题(可选,默认使用包中默认亮色主题)
      lightTheme: ThemeData(
        brightness: Brightness.light,
        primarySwatch: Colors.blue,
        appBarTheme: const AppBarTheme(
          backgroundColor: Colors.blue, // 亮模式下的 AppBar 背景颜色
          foregroundColor: Color.fromARGB(228, 255, 255, 255), // 文本颜色
          elevation: 0, // 去除阴影以保持平面外观
        ),
        textTheme: const TextTheme(
          bodyLarge: TextStyle(color: Color.fromARGB(228, 255, 255, 255)),
        ),
      ),
      // 定义暗色主题(可选,默认使用包中默认暗色主题)
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        primarySwatch: Colors.blue,
        appBarTheme: const AppBarTheme(
          backgroundColor: Colors.black, // 暗模式下的 AppBar 背景颜色
          foregroundColor: Color.fromARGB(255, 133, 120, 206), // 文本颜色
          elevation: 0, // 去除阴影以保持平面外观
        ),
        textTheme: const TextTheme(
          bodyLarge: TextStyle(color: Color.fromARGB(255, 175, 161, 255)),
        ),
      ),
      // 定义亮色渐变主题(可选,默认使用包中默认亮色渐变主题)
      lightGradient: const LinearGradient(
        colors: [Colors.blue, Colors.lightBlueAccent],
        begin: Alignment.topLeft,
        end: Alignment.bottomRight,
      ),
      // 定义暗色渐变主题(可选,默认使用包中默认暗色渐变主题)
      darkGradient: const LinearGradient(
        colors: [Color(0xff0D324D), Color(0xff7F5A83)],
        begin: Alignment.topLeft,
        end: Alignment.bottomRight,
      ),
      // 是否启用系统主题(设为 true 将关闭自动时间切换功能)
      setSystemPreferenceTheme: false,
      child: MyApp(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DynamicGradientBackground(
      child: Scaffold(
        appBar: AppBar(
          title: Text('动态主题切换'),
          actions: [ThemeSwitcher()], // 添加主题切换按钮
        ),
        body: Center(
          child: Text('Hello, 动态主题!', style: TextStyle(fontSize: 24)),
        ),
      ),
    );
  }
}

小部件详解

1. DynamicThemeWrapper

包装您的应用以启用动态主题切换。

DynamicThemeWrapper(
  lightTheme: ThemeData(...), // 亮色主题
  darkTheme: ThemeData(...), // 暗色主题
  lightGradient: LinearGradient(...), // 亮色渐变
  darkGradient: LinearGradient(...), // 暗色渐变
  setSystemPreferenceTheme: false, // 是否启用系统主题
  child: MyApp(), // 子组件
)

2. ThemeSwitcher

添加一个主题切换按钮到您的 UI。

ThemeSwitcher()

3. DynamicGradientBackground

为您的 UI 添加动态渐变背景。

DynamicGradientBackground(
  child: YourWidget(),
)

示例项目设置(本地使用)

要将 DynamicThemer 包本地化到您的示例项目中,请按照以下步骤操作:

1. 克隆仓库

克隆包含该包的仓库:

git clone https://github.com/CodArtist/DynamicThemer.git

2. 设置示例项目

仓库结构应如下所示:

DynamicThemer/
├── lib/
│   ├── dynamic_theme_provider.dart
│   ├── theme_models.dart
│   ├── dynamic_themer.dart
│   ├── theme_switcher_widget.dart
│   ├── dynamic_gradient_widget.dart
├── pubspec.yaml
├── example/
│   ├── lib/
│   │   ├── main.dart
│   ├── pubspec.yaml

3. 运行 flutter pub get

在主目录下运行:

cd DynamicThemer
flutter pub get

4. 运行示例项目

导航到 example 文件夹并运行应用程序:

cd example
flutter run

更多关于Flutter动态主题切换插件dynamic_themer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动态主题切换插件dynamic_themer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dynamic_themer 是一个用于在 Flutter 应用中实现动态主题切换的插件。它允许你在运行时更改应用的主题,而无需重启应用。以下是如何使用 dynamic_themer 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 dynamic_themer 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  dynamic_themer: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 创建主题

接下来,你需要定义你的应用主题。你可以创建多个主题,并在运行时切换它们。

import 'package:flutter/material.dart';

final ThemeData lightTheme = ThemeData(
  brightness: Brightness.light,
  primaryColor: Colors.blue,
  accentColor: Colors.blueAccent,
);

final ThemeData darkTheme = ThemeData(
  brightness: Brightness.dark,
  primaryColor: Colors.indigo,
  accentColor: Colors.indigoAccent,
);

3. 初始化 DynamicThemer

在你的 main.dart 文件中,初始化 DynamicThemer 并设置默认主题。

import 'package:flutter/material.dart';
import 'package:dynamic_themer/dynamic_themer.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DynamicThemer(
      defaultTheme: lightTheme,
      child: MaterialApp(
        title: 'Dynamic Theme Demo',
        theme: DynamicThemer.of(context).currentTheme,
        home: HomeScreen(),
      ),
    );
  }
}

4. 切换主题

在应用的任何地方,你都可以使用 DynamicThemer.of(context).setTheme() 方法来切换主题。

import 'package:flutter/material.dart';
import 'package:dynamic_themer/dynamic_themer.dart';

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dynamic Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                DynamicThemer.of(context).setTheme(lightTheme);
              },
              child: Text('Light Theme'),
            ),
            ElevatedButton(
              onPressed: () {
                DynamicThemer.of(context).setTheme(darkTheme);
              },
              child: Text('Dark Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 监听主题变化

如果你需要在主题变化时执行某些操作,可以使用 DynamicThemer.of(context).addListener() 方法来监听主题变化。

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  void initState() {
    super.initState();
    DynamicThemer.of(context).addListener(_onThemeChanged);
  }

  void _onThemeChanged() {
    // 主题变化时的操作
    setState(() {});
  }

  @override
  void dispose() {
    DynamicThemer.of(context).removeListener(_onThemeChanged);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dynamic Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                DynamicThemer.of(context).setTheme(lightTheme);
              },
              child: Text('Light Theme'),
            ),
            ElevatedButton(
              onPressed: () {
                DynamicThemer.of(context).setTheme(darkTheme);
              },
              child: Text('Dark Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

6. 获取当前主题

你可以使用 DynamicThemer.of(context).currentTheme 来获取当前应用的主题。

ThemeData currentTheme = DynamicThemer.of(context).currentTheme;
回到顶部