Flutter主题管理插件dotup_flutter_themed的使用

Flutter主题管理插件dotup_flutter_themed的使用

简介

dotup_flutter_themed 是一个用于简化 Flutter 主题管理的插件。通过它,你可以轻松地扩展和切换不同的主题。

安装

首先,你需要将插件添加到你的项目中:

flutter pub add dotup_flutter_themed

基础用法

示例代码

import 'package:flutter/material.dart';
import 'package:dotup_flutter_themed/theme_builder.dart';

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ThemeBuilder(
      // 提供主题数据
      data: ThemeQueryData(
        dark: ThemeData.dark(),
        light: ThemeData.light(),
      ),
      builder: (dark, light, themeMode) {
        // 获取主题
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          darkTheme: dark,
          theme: light,
          themeMode: themeMode,
          home: const ThemedHome(),
        );
      },
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          IconButton(
              onPressed: () {
                // 切换主题模式
                final x = ThemeQuery.of<ThemeQueryData>(context);
                x.toggleThemeMode();
              },
              icon: const Icon(Icons.dark_mode)),
        ],
      ),
      body: Center(
        child: Column(
          children: const [
            Text('Nice!'),
            Text('https://flutter-apps.ml'),
          ],
        ),
      ),
    );
  }
}

高级用法

你还可以通过自定义主题扩展来进一步增强主题管理功能。

示例代码

import 'package:flutter/material.dart';
import 'package:dotup_flutter_themed/theme_builder.dart';
import 'package:dotup_flutter_themed/custom_theme_query_data.dart';

// 定义在深色和浅色主题中要添加的额外内容
class MyThemeExtensions {
  late Color brandColor;

  MyThemeExtensions({
    Color? brandColor,
  }) : brandColor = brandColor ?? Colors.green.shade400;
}

// 定义自己的主题查询数据以便于访问
class MyTheme extends CustomThemeQueryData<MyThemeExtensions> {
  MyTheme({
    required ThemeData dark,
    required ThemeData light,
    ThemeMode themeMode = ThemeMode.dark,
  }) : super(
          dark: dark,
          light: light,
          themeMode: themeMode,
          darkCustom: MyThemeExtensions(brandColor: Colors.blue.shade400),
          lightCustom: MyThemeExtensions(brandColor: Colors.white70),
        );

  static MyTheme of(BuildContext context) {
    return ThemeQuery.of<MyTheme>(context);
  }

  void toggleThemeMode() {
    if (themeMode == ThemeMode.dark) {
      themeMode = ThemeMode.light;
    } else {
      themeMode = ThemeMode.dark;
    }
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ThemeBuilder<MyTheme>(
      // 提供主题数据
      data: MyTheme(
        dark: ThemeData.dark(),
        light: ThemeData.light(),
      ),
      builder: (dark, light, themeMode) {
        // 获取主题
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          darkTheme: dark,
          theme: light,
          themeMode: themeMode,
          home: const ThemedHome(),
        );
      },
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          IconButton(
              onPressed: () {
                // 切换主题模式
                final x = MyTheme.of(context);
                x.toggleThemeMode();
              },
              icon: Icon(
                Icons.language,
                // 获取当前主题模式的自定义值
                color: MyTheme.of(context).custom.brandColor,
              )),
        ],
      ),
      body: Center(
        child: Column(
          children: const [
            Text('Nice!'),
            Text('https://flutter-apps.ml'),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


dotup_flutter_themed 是一个用于 Flutter 应用主题管理的插件。它允许开发者轻松地管理和切换应用的主题,支持自定义主题和动态主题切换。以下是如何使用 dotup_flutter_themed 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dotup_flutter_themed: ^0.0.1  # 请检查最新版本

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

2. 创建主题

你可以创建多个主题,并在应用中进行切换。以下是一个简单的主题定义示例:

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

final lightTheme = AppTheme(
  name: 'Light',
  themeData: ThemeData(
    brightness: Brightness.light,
    primaryColor: Colors.blue,
    accentColor: Colors.blueAccent,
  ),
);

final darkTheme = AppTheme(
  name: 'Dark',
  themeData: ThemeData(
    brightness: Brightness.dark,
    primaryColor: Colors.indigo,
    accentColor: Colors.indigoAccent,
  ),
);

3. 初始化 ThemeManager

在应用的入口点(通常是 main.dart),初始化 ThemeManager 并设置默认主题:

import 'package:flutter/material.dart';
import 'package:dotup_flutter_themed/dotup_flutter_themed.dart';
import 'themes.dart'; // 假设主题定义在 themes.dart 文件中

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 ThemeManager
  await ThemeManager.initialize(
    themes: [lightTheme, darkTheme],
    defaultTheme: lightTheme,
  );

  runApp(MyApp());
}

4. 使用 ThemeManager

在应用的 MaterialAppCupertinoApp 中,使用 ThemeManager 提供的主题:

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Theme Demo',
      theme: ThemeManager.currentTheme.themeData,
      home: MyHomePage(),
    );
  }
}

5. 动态切换主题

你可以通过 ThemeManager 动态切换主题。例如,在按钮点击事件中切换主题:

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Theme: ${ThemeManager.currentTheme.name}',
            ),
            ElevatedButton(
              onPressed: () {
                ThemeManager.setTheme(darkTheme);
              },
              child: Text('Switch to Dark Theme'),
            ),
            ElevatedButton(
              onPressed: () {
                ThemeManager.setTheme(lightTheme);
              },
              child: Text('Switch to Light Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

6. 监听主题变化

如果你需要在主题变化时执行某些操作,可以使用 ThemeManageronThemeChanged 监听器:

ThemeManager.onThemeChanged.listen((theme) {
  print('Theme changed to: ${theme.name}');
});

7. 保存和加载主题

ThemeManager 还支持将当前主题保存到本地存储,并在应用启动时加载上次保存的主题:

// 保存当前主题
await ThemeManager.saveTheme();

// 加载保存的主题
await ThemeManager.loadTheme();

8. 完整示例

以下是一个完整的示例,展示了如何使用 dotup_flutter_themed 插件:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 ThemeManager
  await ThemeManager.initialize(
    themes: [
      AppTheme(
        name: 'Light',
        themeData: ThemeData(
          brightness: Brightness.light,
          primaryColor: Colors.blue,
          accentColor: Colors.blueAccent,
        ),
      ),
      AppTheme(
        name: 'Dark',
        themeData: ThemeData(
          brightness: Brightness.dark,
          primaryColor: Colors.indigo,
          accentColor: Colors.indigoAccent,
        ),
      ),
    ],
    defaultTheme: AppTheme(
      name: 'Light',
      themeData: ThemeData(
        brightness: Brightness.light,
        primaryColor: Colors.blue,
        accentColor: Colors.blueAccent,
      ),
    ),
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Theme Demo',
      theme: ThemeManager.currentTheme.themeData,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Theme: ${ThemeManager.currentTheme.name}',
            ),
            ElevatedButton(
              onPressed: () {
                ThemeManager.setTheme(AppTheme(
                  name: 'Dark',
                  themeData: ThemeData(
                    brightness: Brightness.dark,
                    primaryColor: Colors.indigo,
                    accentColor: Colors.indigoAccent,
                  ),
                ));
              },
              child: Text('Switch to Dark Theme'),
            ),
            ElevatedButton(
              onPressed: () {
                ThemeManager.setTheme(AppTheme(
                  name: 'Light',
                  themeData: ThemeData(
                    brightness: Brightness.light,
                    primaryColor: Colors.blue,
                    accentColor: Colors.blueAccent,
                  ),
                ));
              },
              child: Text('Switch to Light Theme'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部