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

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

dynamic_theme

动态更改主题无烦恼

主题切换示例

此插件用于在运行时更改主题并持久化该主题。

我写了一篇关于它的Medium文章,可以在这里查看!

Medium文章链接

在项目中引入

pubspec.yaml文件中添加以下依赖:

dependencies:
  dynamic_theme: ^1.0.0

然后运行flutter pub get并导入它:

import 'package:dynamic_theme/dynamic_theme.dart';

如果需要对话框功能:

import 'package:dynamic_theme/theme_switcher_widgets.dart';

使用方法

将你的MaterialApp包裹成如下形式:

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return new DynamicTheme(
      defaultBrightness: Brightness.light, // 默认亮度
      data: (brightness) => new ThemeData(
        primarySwatch: Colors.indigo, // 主色调
        brightness: brightness, // 当前亮度
      ),
      themedWidgetBuilder: (context, theme) {
        return new MaterialApp(
          title: 'Flutter Demo',
          theme: theme, // 应用的主题
          home: new MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    );
  }
}

更改主题

可以通过以下方式更改主题:

void changeBrightness() {
  DynamicTheme.of(context).setBrightness(
      Theme.of(context).brightness == Brightness.dark 
          ? Brightness.light 
          : Brightness.dark);
}

void changeColor() {
  DynamicTheme.of(context).setThemeData(new ThemeData(
      primaryColor: Theme.of(context).primaryColor == Colors.indigo 
          ? Colors.red 
          : Colors.indigo));
}

当通过setBrightness更改亮度时,还会将其存储到共享偏好设置中。

其他特性

一个用于更改亮度的对话框小部件!

亮度切换对话框

开始使用

有关如何开始使用Flutter的更多信息,请查阅我们的官方文档

有关如何编辑包代码的帮助,请查阅官方文档


完整示例代码

以下是一个完整的示例代码,展示了如何使用dynamic_theme插件实现动态主题切换:

import 'package:dynamic_theme/dynamic_theme.dart';
import 'package:dynamic_theme/theme_switcher_widgets.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return DynamicTheme(
        defaultBrightness: Brightness.light,
        data: (brightness) => ThemeData(
              primarySwatch: Colors.indigo,
              brightness: brightness,
            ),
        themedWidgetBuilder: (context, theme) {
          return MaterialApp(
            title: 'Flutter Demo',
            theme: theme,
            home: MyHomePage(title: 'Flutter Demo Home Page'),
          );
        });
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Easy Theme"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              onPressed: changeBrightness,
              child: const Text("Change brightness"),
            ),
            RaisedButton(
              onPressed: changeColor,
              child: const Text("Change color"),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: showChooser,
        child: const Icon(Icons.add),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(
              icon: Icon(Icons.insert_drive_file), title: Text("Tab 1")),
          BottomNavigationBarItem(
              icon: Icon(Icons.show_chart), title: Text("Tab 2")),
        ],
      ),
    );
  }

  void showChooser() {
    showDialog<void>(
        context: context,
        builder: (context) {
          return BrightnessSwitcherDialog(
            onSelectedTheme: (brightness) {
              DynamicTheme.of(context).setBrightness(brightness);
            },
          );
        });
  }

  void changeBrightness() {
    DynamicTheme.of(context).setBrightness(
        Theme.of(context).brightness == Brightness.dark
            ? Brightness.light
            : Brightness.dark);
  }

  void changeColor() {
    DynamicTheme.of(context).setThemeData(ThemeData(
        primaryColor: Theme.of(context).primaryColor == Colors.indigo
            ? Colors.red
            : Colors.indigo));
  }
}

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

1 回复

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


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

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 dynamic_theme 依赖:

dependencies:
  flutter:
    sdk: flutter
  dynamic_theme: ^1.0.0

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

2. 初始化 DynamicTheme

在你的 main.dart 文件中,初始化 DynamicTheme 并将你的应用包裹在 DynamicTheme 组件中:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DynamicTheme(
      defaultBrightness: Brightness.light,
      data: (brightness) => ThemeData(
        primarySwatch: Colors.blue,
        brightness: brightness,
      ),
      themedWidgetBuilder: (context, theme) {
        return MaterialApp(
          title: 'Dynamic Theme Example',
          theme: theme,
          home: MyHomePage(),
        );
      },
    );
  }
}

3. 切换主题

在你的 MyHomePage 中,你可以通过调用 DynamicTheme.of(context).setBrightness() 方法来切换主题:

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dynamic Theme Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Change Theme',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                DynamicTheme.of(context).setBrightness(
                  Theme.of(context).brightness == Brightness.dark
                      ? Brightness.light
                      : Brightness.dark,
                );
              },
              child: Text('Toggle Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

现在,你可以运行你的应用并点击按钮来切换主题。应用的主题会在亮色和暗色之间切换。

5. 自定义主题

你还可以在 DynamicThemedata 回调中自定义主题的其他属性,例如 primaryColoraccentColor 等。

DynamicTheme(
  defaultBrightness: Brightness.light,
  data: (brightness) => ThemeData(
    primarySwatch: Colors.blue,
    brightness: brightness,
    primaryColor: brightness == Brightness.dark ? Colors.blueGrey : Colors.blue,
    accentColor: brightness == Brightness.dark ? Colors.cyan : Colors.orange,
  ),
  themedWidgetBuilder: (context, theme) {
    return MaterialApp(
      title: 'Dynamic Theme Example',
      theme: theme,
      home: MyHomePage(),
    );
  },
);
回到顶部