Flutter主题适配插件adaptive_theme的使用

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

Flutter主题适配插件adaptive_theme的使用

介绍

Adaptive Theme 是为Flutter应用添加对浅色和深色主题支持最简单的方法。它允许手动设置浅色或深色主题,并且可以基于系统设置定义主题。它还能够在应用程序重启时保持主题模式的更改。

adaptive_theme

查看在线演示

使用步骤

添加依赖

pubspec.yaml中添加以下依赖:

dependencies:
  adaptive_theme: ^latest_version # 替换为最新版本号

初始化

要在你的应用中使用AdaptiveTheme,你需要将MaterialApp包装在AdaptiveTheme中。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final savedThemeMode = await AdaptiveTheme.getThemeMode();
  runApp(MyApp(savedThemeMode: savedThemeMode));
}

class MyApp extends StatelessWidget {
  final AdaptiveThemeMode? savedThemeMode;

  const MyApp({super.key, this.savedThemeMode});

  @override
  Widget build(BuildContext context) {
    return AdaptiveTheme(
      light: ThemeData.light(useMaterial3: true),
      dark: ThemeData.dark(useMaterial3: true),
      initial: savedThemeMode ?? AdaptiveThemeMode.light,
      builder: (theme, darkTheme) => MaterialApp(
        title: 'Adaptive Theme Demo',
        theme: theme,
        darkTheme: darkTheme,
        home: MyHomePage(),
      ),
      debugShowFloatingThemeButton: true, // 启用浮动按钮来切换主题模式
    );
  }
}

切换主题模式

你可以通过调用setLight()setDark()setSystem()方法轻松地切换主题模式:

AdaptiveTheme.of(context).setLight(); // 设置为浅色模式
AdaptiveTheme.of(context).setDark(); // 设置为深色模式
AdaptiveTheme.of(context).setSystem(); // 设置为系统默认模式

或者使用toggleThemeMode()来切换当前的主题模式:

AdaptiveTheme.of(context).toggleThemeMode();

更改主题

如果你想完全改变主题(例如更改颜色),可以使用setTheme方法:

AdaptiveTheme.of(context).setTheme(
  light: ThemeData(
    useMaterial3: true,
    brightness: Brightness.light,
    colorSchemeSeed: Colors.purple,
  ),
  dark: ThemeData(
    useMaterial3: true,
    brightness: Brightness.dark,
    colorSchemeSeed: Colors.purple,
  ),
);

重置主题

可以通过调用reset()方法将主题重置为初始化时提供的默认值:

AdaptiveTheme.of(context).reset();

设置默认主题

如果你想在以后重置时使用不同的默认主题,可以在设置新主题时将isDefault参数设为true

AdaptiveTheme.of(context).setTheme(
  light: ThemeData(
    useMaterial3: true,
    brightness: Brightness.light,
    colorSchemeSeed: Colors.blue,
  ),
  dark: ThemeData(
    useMaterial3: true,
    brightness: Brightness.dark,
    colorSchemeSeed: Colors.blue,
  ),
  isDefault: true,
);

获取启动时的主题模式

为了避免首次渲染时的主题闪烁,你可以在main()方法中异步加载之前保存的主题模式:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final savedThemeMode = await AdaptiveTheme.getThemeMode();
  runApp(MyApp(savedThemeMode: savedThemeMode));
}

// 在MyApp中使用savedThemeMode
AdaptiveTheme(
  light: lightTheme,
  dark: darkTheme,
  initial: savedThemeMode ?? AdaptiveThemeMode.light,
  builder: (theme, darkTheme) => MaterialApp(
    title: 'Adaptive Theme Demo',
    theme: theme,
    darkTheme: darkTheme,
    home: MyHomePage(),
  ),
)

监听主题模式变化

你可以监听主题模式的变化,并根据需要更新UI:

ValueListenableBuilder(
  valueListenable: AdaptiveTheme.of(context).modeChangeNotifier,
  builder: (_, mode, child) {
    // 更新UI逻辑
    return Container();
  },
);

浮动主题按钮

从v3.3.0开始,你可以通过设置debugShowFloatingThemeButtontrue来启用一个浮动按钮,用于快速切换主题模式:

AdaptiveTheme(
  light: ThemeData.light(),
  dark: ThemeData.dark(),
  debugShowFloatingThemeButton: true,
  initial: AdaptiveThemeMode.light,
  builder: (theme, darkTheme) => MaterialApp(
    theme: theme,
    darkTheme: darkTheme,
    home: MyHomePage(),
  ),
);

注意事项

  • 非持久化主题更改AdaptiveTheme仅持久化主题模式(浅色/深色/系统),不会持久化主题本身。如果你动态加载了新的主题,请确保在每次应用启动时重新设置。
  • 使用SharedPreferences:该插件内部使用shared_preferences来持久化主题模式。如果你的应用也使用了shared_preferences,请小心不要清除这些偏好设置,除非你希望主题模式恢复到初始状态。

示例代码

以下是完整的示例代码,展示了如何创建一个包含主题切换功能的应用程序:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final savedThemeMode = await AdaptiveTheme.getThemeMode();
  runApp(MyApp(savedThemeMode: savedThemeMode));
}

class MyApp extends StatelessWidget {
  final AdaptiveThemeMode? savedThemeMode;

  const MyApp({super.key, this.savedThemeMode});

  @override
  Widget build(BuildContext context) {
    return AdaptiveTheme(
      light: ThemeData(
        useMaterial3: true,
        brightness: Brightness.light,
        colorSchemeSeed: Colors.blue,
      ),
      dark: ThemeData(
        useMaterial3: true,
        brightness: Brightness.dark,
        colorSchemeSeed: Colors.blue,
      ),
      initial: savedThemeMode ?? AdaptiveThemeMode.light,
      builder: (theme, darkTheme) => MaterialApp(
        title: 'Adaptive Theme Demo',
        theme: theme,
        darkTheme: darkTheme,
        home: const MyHomePage(),
      ),
      debugShowFloatingThemeButton: true,
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Adaptive Theme Demo'),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text(
                '这是一个展示adaptive_theme使用的示例应用。',
              ),
              const Text(
                '你可以使用下面的开关在浅色和深色主题之间切换。',
              ),
              const SizedBox(height: 20),
              Row(
                mainAxisSize: MainAxisSize.min,
                children: [
                  const Text('浅色'),
                  const SizedBox(width: 10),
                  Switch(
                    value: AdaptiveTheme.of(context).mode.isDark,
                    onChanged: (value) {
                      if (value) {
                        AdaptiveTheme.of(context).setDark();
                      } else {
                        AdaptiveTheme.of(context).setLight();
                      }
                    },
                  ),
                  const SizedBox(width: 10),
                  const Text('深色'),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

通过以上步骤,你就可以在Flutter应用中轻松实现浅色和深色主题的切换,并且能够持久化用户的主题选择。


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

1 回复

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


当然,以下是如何在Flutter项目中使用adaptive_theme插件来实现主题适配的示例代码。adaptive_theme插件允许你根据系统主题(如亮色或暗色模式)动态更改你的Flutter应用的主题。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  adaptive_theme: ^2.0.0  # 请检查最新版本号

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

2. 配置主题

在你的main.dart文件中,配置你的主题数据并使用AdaptiveTheme来管理这些主题。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AdaptiveTheme(
      // 初始化主题数据
      light: ThemeData(
        brightness: Brightness.light,
        primarySwatch: Colors.blue,
        // 其他主题配置...
      ),
      dark: ThemeData(
        brightness: Brightness.dark,
        primarySwatch: Colors.blueGrey,
        // 其他主题配置...
      ),
      // 设置初始主题模式,可以设置为 AdaptiveThemeMode.light, AdaptiveThemeMode.dark 或 AdaptiveThemeMode.system
      initial: AdaptiveThemeMode.system,
      builder: (context, theme) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: theme,
          home: MyHomePage(),
        );
      },
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Adaptive Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hello, Flutter!',
              style: Theme.of(context).textTheme.headline4,
            ),
            ElevatedButton(
              onPressed: () {
                // 手动切换主题
                AdaptiveTheme.of(context).setThemeMode(
                  AdaptiveThemeMode.of(context) == AdaptiveThemeMode.light
                      ? AdaptiveThemeMode.dark
                      : AdaptiveThemeMode.light,
                );
              },
              child: Text('Toggle Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 监听主题变化(可选)

如果你想在主题变化时执行一些额外的操作,可以在你的Widget中使用AdaptiveThemeListener

import 'package:adaptive_theme/adaptive_theme.dart';

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    return AdaptiveThemeListener(
      builder: (context, themeMode) {
        print('Theme mode changed to: $themeMode');
        return Container(
          // 你的Widget内容
        );
      },
      child: Container(
        // 你的Widget内容
      ),
    );
  }
}

4. 使用自定义主题(可选)

你也可以通过覆盖AdaptiveThemebuildMaterialApp方法来使用自定义的MaterialApp配置。

AdaptiveTheme(
  light: ThemeData(
    // 自定义的Light主题
  ),
  dark: ThemeData(
    // 自定义的Dark主题
  ),
  initial: AdaptiveThemeMode.system,
  buildMaterialApp: (context, theme) {
    return MaterialApp(
      // 自定义的MaterialApp配置
      theme: theme,
      // 其他配置...
      home: MyHomePage(),
    );
  },
);

通过这些步骤,你应该能够在Flutter项目中成功使用adaptive_theme插件来实现主题适配。根据你的需求,你可以进一步自定义和扩展这些代码。

回到顶部