Flutter主题管理插件material_themes_manager的使用

Flutter主题管理插件material_themes_manager的使用

material_themes_manager简介

material_themes_manager 是一个用于在 Flutter 应用中轻松管理主题的插件。它允许开发者快速切换主题模式(如深色模式和浅色模式),并支持自定义主题配置。


使用步骤

1. 添加依赖

pubspec.yaml 文件中添加 material_themes_manager 依赖:

dependencies:
  material_themes_manager: ^版本号

然后运行以下命令以安装依赖:

flutter pub get

2. 初始化插件

main.dart 文件中初始化 MaterialThemesManager 并将其作为 ChangeNotifierProvider 提供给整个应用。

示例代码

// ignore_for_file: depend_on_referenced_packages

import 'package:flutter/material.dart';
import 'package:material_themes_manager/material_themes_manager.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    // Providers 是在 [MyApp] 外部定义的,以便测试时可以模拟 [MyApp]
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => MaterialThemesManager()),
      ],
      child: MyApp(),
    ),
  );
}

3. 配置应用主题

MaterialApp 中使用 MaterialThemesManager 来动态设置主题模式、主题和深色主题。

示例代码

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Consumer<MaterialThemesManager>(
      builder: (context, themeManager, child) {
        return MaterialApp(
          title: "Theme Manager Demo",
          home: MyHomePage(),
          debugShowCheckedModeBanner: themeManager.isDarkModeEnabled,
          themeMode: themeManager.getThemeMode(), // 自动根据用户偏好设置主题模式
          theme: themeManager.getPrimaryLightTheme(), // 浅色主题
          darkTheme: themeManager.getPrimaryDarkTheme(), // 深色主题
        );
      },
    );
  }
}

4. 实现主题切换功能

在应用中添加一个按钮,用于切换深色模式。

示例代码

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: context.watch<MaterialThemesManager>().getTheme(ThemeGroupType.POM).appBarTheme.backgroundColor,
        title: const Text('Example'),
      ),
      body: Center(
        child: Stack(
          children: <Widget>[
            context.watch<MaterialThemesManager>().getBackgroundGradient(BackgroundGradientType.MAIN_BG), // 设置背景渐变
            Center(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  const Text('是否启用深色模式:'),
                  DarkModeEnabledText(), // 显示当前深色模式状态
                  Container(
                    width: 150,
                    height: 150,
                    decoration: context.watch<MaterialThemesManager>().getBoxDecorationShadow(
                      shadowIntensity: ShadowIntensity.DARK, // 设置阴影强度
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read<MaterialThemesManager>().toggleDarkModeEnabled(), // 切换深色模式
        tooltip: '切换深色模式',
        child: const Icon(Icons.add),
      ),
    );
  }
}

5. 自定义主题组件

可以通过 MaterialThemesManager 提供的方法来自定义主题组件,例如背景渐变、阴影效果等。

示例代码

class DarkModeEnabledText extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text(
      '${context.watch<MaterialThemesManager>().isDarkModeEnabled.toString()}', // 动态显示深色模式状态
    );
  }
}

完整示例代码

以下是完整的示例代码,包含主题切换功能和自定义主题组件:

// ignore_for_file: depend_on_referenced_packages

import 'package:flutter/material.dart';
import 'package:material_themes_manager/material_themes_manager.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => MaterialThemesManager()),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Consumer<MaterialThemesManager>(
      builder: (context, themeManager, child) {
        return MaterialApp(
          title: "Theme Manager Demo",
          home: MyHomePage(),
          debugShowCheckedModeBanner: themeManager.isDarkModeEnabled,
          themeMode: themeManager.getThemeMode(),
          theme: themeManager.getPrimaryLightTheme(),
          darkTheme: themeManager.getPrimaryDarkTheme(),
        );
      },
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: context.watch<MaterialThemesManager>().getTheme(ThemeGroupType.POM).appBarTheme.backgroundColor,
        title: const Text('Example'),
      ),
      body: Center(
        child: Stack(
          children: <Widget>[
            context.watch<MaterialThemesManager>().getBackgroundGradient(BackgroundGradientType.MAIN_BG),
            Center(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  const Text('是否启用深色模式:'),
                  DarkModeEnabledText(),
                  Container(
                    width: 150,
                    height: 150,
                    decoration: context.watch<MaterialThemesManager>().getBoxDecorationShadow(
                      shadowIntensity: ShadowIntensity.DARK,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read<MaterialThemesManager>().toggleDarkModeEnabled(),
        tooltip: '切换深色模式',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class DarkModeEnabledText extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text(
      '${context.watch<MaterialThemesManager>().isDarkModeEnabled.toString()}',
    );
  }
}

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

1 回复

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


material_themes_manager 是一个用于管理 Flutter 应用中 Material 主题的插件。它可以帮助你轻松地切换和管理不同的主题,而不需要手动编写大量的代码。下面是如何使用 material_themes_manager 插件的步骤:

1. 添加依赖

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

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

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

2. 创建主题

你可以通过继承 MaterialTheme 类来创建自定义主题。例如:

import 'package:material_themes_manager/material_themes_manager.dart';

class MyCustomTheme extends MaterialTheme {
  @override
  ThemeData get lightTheme => ThemeData(
    primaryColor: Colors.blue,
    accentColor: Colors.blueAccent,
    // 其他自定义样式
  );

  @override
  ThemeData get darkTheme => ThemeData(
    primaryColor: Colors.indigo,
    accentColor: Colors.indigoAccent,
    // 其他自定义样式
  );
}

3. 初始化主题管理器

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

import 'package:flutter/material.dart';
import 'package:material_themes_manager/material_themes_manager.dart';
import 'my_custom_theme.dart'; // 导入你自定义的主题

void main() {
  // 初始化主题管理器并设置默认主题
  MaterialThemesManager.initialize(
    defaultTheme: MyCustomTheme(),
  );

  runApp(MyApp());
}

4. 使用主题管理器

在你的应用中使用 MaterialThemesManager 来获取当前主题,并在需要时切换主题:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Theme Demo',
      theme: MaterialThemesManager.instance.currentTheme.lightTheme,
      darkTheme: MaterialThemesManager.instance.currentTheme.darkTheme,
      themeMode: ThemeMode.system, // 可以根据系统设置自动切换主题
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Theme Manager Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Theme: ${MaterialThemesManager.instance.currentTheme.runtimeType}',
            ),
            ElevatedButton(
              onPressed: () {
                // 切换主题
                MaterialThemesManager.instance.setTheme(MyCustomTheme());
              },
              child: Text('Switch Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 切换主题

你可以通过调用 MaterialThemesManager.instance.setTheme() 方法来切换主题,如上例所示。

6. 保存和加载主题

material_themes_manager 还提供了保存和加载主题的功能,你可以使用 MaterialThemesManager.instance.saveTheme()MaterialThemesManager.instance.loadTheme() 来持久化主题设置。

// 保存当前主题
MaterialThemesManager.instance.saveTheme();

// 加载保存的主题
MaterialThemesManager.instance.loadTheme();
回到顶部