Flutter主题管理插件theme_manager_plus的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter主题管理插件theme_manager_plus的使用

告别繁琐的颜色方案记忆!使用Theme Manager Plus,管理主题变得轻而易举。只需创建一个类来定义浅色和深色主题,调整所需的颜色和样式,即可享受流畅且现代化的应用体验。不再头疼,只有轻松高效的主题管理!

simulator-screen-recording-iphone-15-pro-2024-01-31-at-214253_5zDSZU03-ezgif com-video-to-gif-converter

开始使用

首先,在你的pubspec.yaml文件中添加theme_manager_plus作为依赖项。

theme_manager_plus: ^[version]

创建一个自定义类,定义颜色和样式,并注入这些值。例如:

class AppTheme {
  Color? backgroundColor;
  TextStyle? heading;
  TextStyle? subheading;

  AppTheme({this.backgroundColor, this.heading, this.subheading});
}

将你的MaterialApp包装在ThemeManagerWrapper中,并设置当前主题为初始主题。

home: ThemeManagerPlus<AppTheme>(
  currentTheme: lightTheme,
  darkTheme: DarkTheme,
  lightTheme: lightTheme,
  child: MyApp(),
);

从主题中访问数据:

context.themeOf<AppTheme>()?.backgroundColor

注意: 将类名替换为你自己的自定义类名。

更改当前主题:

context.changeCurrentTheme<AppTheme>();

检查当前主题是否为深色主题:

bool isDarkMode = context.isDarkMode<AppTheme>();

完整示例

以下是一个完整的示例代码,展示了如何使用theme_manager_plus插件。

import 'package:example/app_theme_color.dart';
import 'package:example/theme_model.dart';
import 'package:flutter/material.dart';
import 'package:theme_manager_plus/theme_manager_plus.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: ThemeManagerPlus<AppTheme>(
        currentTheme: DarkTheme,
        darkTheme: DarkTheme,
        lightTheme: LightTheme,
        child: const MyHomePage(title: 'Flutter Demo Home Page'),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  bool switchValue = false;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: context.themeOf<AppTheme>()?.backgroundColor,
      appBar: AppBar(
        backgroundColor: context.themeOf<AppTheme>()?.backgroundColor,
        title: Text(
          widget.title,
          style: context.themeOf<AppTheme>()?.heading,
        ),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Switch(
              value: context.isDarkMode<AppTheme>(),
              onChanged: (value) {
                context.changeCurrentTheme<AppTheme>();
              },
              activeColor: Colors.blue,
            ),
            Text(
              'You have pushed the button this many times:',
              style: context.themeOf<AppTheme>()?.heading,
            ),
            Text(
              '$_counter',
              style: context.themeOf<AppTheme>()?.heading,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class SeconScreen extends StatelessWidget {
  String myName;
  SeconScreen({required this.myName});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: InkWell(
          onTap: () {
            Navigator.of(context).pop();
          },
          child: Text("${myName}"),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用theme_manager_plus插件进行主题管理的示例代码。theme_manager_plus插件允许你轻松地在Flutter应用中管理和切换主题。

首先,确保你已经在pubspec.yaml文件中添加了theme_manager_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  theme_manager_plus: ^latest_version  # 请替换为最新版本号

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

接下来,让我们编写一些代码来展示如何使用theme_manager_plus进行主题管理。

主程序入口 (main.dart)

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化ThemeManager
  await ThemeManager.initialize();
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => ThemeNotifier()),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ThemeManager(
      builder: (context, theme) {
        return MaterialApp(
          title: 'Theme Manager Demo',
          theme: theme,
          darkTheme: ThemeData.dark(),
          themeMode: ThemeMode.system, // 可以根据需要设置为 ThemeMode.light, ThemeMode.dark 或 ThemeMode.system
          home: MyHomePage(),
        );
      },
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final themeNotifier = Provider.of<ThemeNotifier>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Theme Manager Demo'),
        actions: [
          IconButton(
            icon: Icon(
              ThemeManager.instance.brightness == Brightness.light
                  ? Icons.dark_mode
                  : Icons.light_mode,
            ),
            onPressed: () async {
              bool isDarkMode = ThemeManager.instance.brightness == Brightness.dark;
              await ThemeManager.instance.setBrightness(
                isDarkMode ? Brightness.light : Brightness.dark,
              );
              themeNotifier.notifyListeners(); // 通知监听器主题已更改
            },
          ),
        ],
      ),
      body: Center(
        child: Text(
          'Hello, Flutter!',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

class ThemeNotifier extends ChangeNotifier {
  // 可以在这里添加更多的逻辑来处理主题变化
}

解释

  1. 依赖注入与初始化

    • main.dartmain函数中,我们首先确保Flutter绑定已初始化,然后调用ThemeManager.initialize()来初始化主题管理器。
    • 使用MultiProviderChangeNotifierProvider来管理状态,这里我们创建了一个ThemeNotifier类,尽管在这个简单示例中它并未做太多事情。
  2. 主题管理

    • MyApp类使用ThemeManager包装MaterialApp,允许我们根据系统或用户选择的主题来动态应用主题。
    • ThemeManagerbuilder属性接收一个函数,该函数返回带有应用主题的MaterialApp
  3. 主题切换

    • MyHomePage中,我们添加了一个IconButtonAppBaractions中,用于切换主题。
    • 根据当前的主题(亮或暗),点击按钮会切换主题并通知ThemeNotifier的监听器(尽管在这个例子中监听器并未做实际的事情)。

注意事项

  • theme_manager_plus插件依赖于平台通道来获取系统主题设置,因此在桌面或Web平台上可能会有不同的行为。
  • 在实际应用中,你可能会在ThemeNotifier类中添加更多逻辑来处理主题变化,例如保存用户偏好设置到本地存储。

这个示例展示了如何使用theme_manager_plus插件来管理Flutter应用中的主题。希望这对你有所帮助!

回到顶部