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

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

概述

tako_dynamic_theme 是一个用于在 Flutter 应用中实现动态主题切换的插件。通过此插件,您可以轻松地为应用添加多种主题,并允许用户在运行时切换这些主题。


示例效果

下图展示了 tako_dynamic_theme 插件的动态主题切换功能:

示例动图


开始使用

1. 添加依赖

首先,在您的 pubspec.yaml 文件中添加 tako_dynamic_theme 依赖:

dependencies:
  flutter:
    sdk: flutter
  tako_dynamic_theme: x.y.z

然后运行以下命令以获取依赖:

flutter pub get

使用方法

包裹根部件

将您的应用包裹在 TakoDynamicThemeWidget 中,以便启用动态主题切换功能。您可以通过 themeMap 提供不同的主题,并设置默认主题(fallbackTheme)。

void main() {
  runApp(
    TakoDynamicThemeWidget(
      themeMap: {
        "light": ThemeData.light(), // 定义亮色主题
        "dark": ThemeData.dark(),   // 定义暗色主题
        "night": ThemeConfig.nightTheme, // 引入预定义的主题
      },
      fallbackTheme: ThemeData.light(), // 设置默认主题
      child: const MyApp(),
    ),
  );
}

切换主题

通过调用 TakoDynamicTheme.of(context).changeTheme() 方法来切换主题。例如,点击按钮后切换到“夜色”主题:

OutlinedButton(
  onPressed: () => TakoDynamicTheme.of(context).changeTheme(themeKey: "night"),
  child: const Text("切换到夜色主题"),
);

完整示例代码

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

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

void main() {
  runApp(
    TakoDynamicThemeWidget(
      themeMap: {
        "light": ThemeData.light(), // 亮色主题
        "dark": ThemeData.dark(),   // 暗色主题
        "night": ThemeConfig.nightTheme, // 夜色主题
      },
      fallbackTheme: ThemeData.light(), // 默认主题
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 动态主题示例',
      theme: TakoDynamicTheme.of(context).themeData, // 动态主题数据
      home: Scaffold(
        appBar: AppBar(
          title: const Text("动态主题切换"),
          leading: IconButton(
            icon: const Icon(Icons.arrow_back),
            onPressed: () {},
          ),
        ),
        body: Padding(
          padding: const EdgeInsets.all(20),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () =>
                        TakoDynamicTheme.of(context).changeTheme(themeKey: "light"),
                    child: const Text("亮色主题"),
                  ),
                  ElevatedButton(
                    onPressed: () =>
                        TakoDynamicTheme.of(context).changeTheme(themeKey: "dark"),
                    child: const Text("暗色主题"),
                  ),
                  ElevatedButton(
                    onPressed: () =>
                        TakoDynamicTheme.of(context).changeTheme(themeKey: "night"),
                    child: const Text("夜色主题"),
                  ),
                ],
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () {},
                    child: const Text("普通按钮"),
                  ),
                  OutlinedButton(
                    onPressed: () {},
                    child: const Text("边框按钮"),
                  ),
                  TextButton(
                    onPressed: () {},
                    child: const Text("文本按钮"),
                  ),
                ],
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  Switch(value: true, onChanged: (value) {}),
                  Switch(value: false, onChanged: (value) {}),
                  Radio(value: 1, groupValue: 1, onChanged: (value) {}),
                  Radio(value: 0, groupValue: 1, onChanged: (value) {}),
                  Checkbox(value: true, onChanged: (value) {}),
                  Checkbox(value: false, onChanged: (value) {}),
                ],
              ),
              TextField(
                decoration: const InputDecoration(hintText: "输入框"),
              ),
              Slider(value: 0.5, onChanged: (value) {}),
            ],
          ),
        ),
      ),
    );
  }
}

运行示例代码

如果您想运行完整的示例代码,请按照以下步骤操作:

  1. 克隆示例仓库:

    git clone https://github.com/wingstako/tako_dynamic_theme.git
    
  2. 进入示例目录并运行:

    cd tako_dynamic_theme/example
    flutter run
    

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

1 回复

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


tako_dynamic_theme 是一个用于 Flutter 应用的动态主题切换插件。它允许你在应用中轻松地切换主题,并且支持自定义主题。以下是如何使用 tako_dynamic_theme 插件的步骤:

1. 添加依赖

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

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

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

2. 初始化主题

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

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return TakoDynamicTheme(
      defaultTheme: ThemeData.light(), // 默认主题
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: TakoDynamicTheme.of(context).theme, // 使用动态主题
        home: MyHomePage(),
      ),
    );
  }
}

3. 切换主题

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

class MyHomePage 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: () {
                TakoDynamicTheme.of(context).setTheme(ThemeData.light()); // 切换到亮色主题
              },
              child: Text('Light Theme'),
            ),
            ElevatedButton(
              onPressed: () {
                TakoDynamicTheme.of(context).setTheme(ThemeData.dark()); // 切换到暗色主题
              },
              child: Text('Dark Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 自定义主题

你可以创建自定义主题并将其传递给 setTheme 方法。

ThemeData customTheme = ThemeData(
  primarySwatch: Colors.blue,
  brightness: Brightness.light,
  // 其他自定义主题属性
);

ElevatedButton(
  onPressed: () {
    TakoDynamicTheme.of(context).setTheme(customTheme); // 切换到自定义主题
  },
  child: Text('Custom Theme'),
);

5. 持久化主题

如果你希望在应用重启后保持用户选择的主题,可以使用 SharedPreferences 或其他持久化存储来保存和加载主题。

import 'package:shared_preferences/shared_preferences.dart';

Future<void> saveTheme(ThemeData theme) async {
  final prefs = await SharedPreferences.getInstance();
  prefs.setString('theme', theme.brightness == Brightness.light ? 'light' : 'dark');
}

Future<ThemeData> loadTheme() async {
  final prefs = await SharedPreferences.getInstance();
  final theme = prefs.getString('theme');
  return theme == 'light' ? ThemeData.light() : ThemeData.dark();
}

main.dart 中加载保存的主题:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final savedTheme = await loadTheme();
  runApp(MyApp(savedTheme: savedTheme));
}

class MyApp extends StatelessWidget {
  final ThemeData savedTheme;

  MyApp({required this.savedTheme});

  @override
  Widget build(BuildContext context) {
    return TakoDynamicTheme(
      defaultTheme: savedTheme,
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: TakoDynamicTheme.of(context).theme,
        home: MyHomePage(),
      ),
    );
  }
}

在切换主题时保存主题:

ElevatedButton(
  onPressed: () async {
    final theme = ThemeData.light();
    TakoDynamicTheme.of(context).setTheme(theme);
    await saveTheme(theme);
  },
  child: Text('Light Theme'),
);
回到顶部