Flutter系统主题适配插件system_theme的使用

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

Flutter系统主题适配插件system_theme的使用

插件介绍

system_theme 是一个Flutter插件,用于获取当前系统的主题信息。它支持多种平台,包括Android、iOS、Web、macOS、Windows和Linux等,并允许开发者获取系统的强调色(accent color)以及监听该颜色的变化。

支持的平台

Feature Android 10+ iOS Web macOS 10.4+ Windows 10+ 和 XBox Linux GTK 3+
获取强调色 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
监听变化 ✔️

使用方法

导入包

首先需要在项目中导入 system_theme 包:

import 'package:system_theme/system_theme.dart';

获取系统强调色

通过访问 SystemTheme.accentColor.accent 属性来获取系统强调色:

final accentColor = SystemTheme.accentColor.accent;

为了确保在应用启动时能够正确加载强调色,可以在 main() 函数中调用 load() 方法:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SystemTheme.accentColor.load();
  runApp(MyApp());
}

配置备用强调色

为了避免运行时出现意外情况,建议设置一个备用强调色。当系统无法提供强调色时将使用此颜色:

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

  SystemTheme.fallbackColor = const Color(0xFF865432);
  await SystemTheme.accentColor.load();

  runApp(MyApp());
}

监听强调色变化

可以使用 SystemTheme.onChange 流来监听强调色的变化:

SystemTheme.onChange.listen((event) {
  debugPrint('强调色已更改为 ${event.accentColor}');
});

或者使用 SystemThemeBuilder 小部件来实现相同功能:

SystemThemeBuilder(builder: (context, accent) {
  return ColoredBox(color: accent.accentColor);
});

检查是否支持强调色

利用 flutter/foundation 包提供的 defaultTargetPlatform 属性,可以检查当前平台是否支持强调色:

import 'package:flutter/foundation.dart' show defaultTargetPlatform;

void main() {
  final supported = defaultTargetPlatform.supportsAccentColor;

  print('当前平台${supported ? '支持' : '不支持'}强调色');
}

示例代码

下面是一个完整的示例应用程序,展示了如何使用 system_theme 插件:

import 'package:flutter/material.dart';
import 'package:system_theme/system_theme.dart';
import 'package:flutter/foundation.dart' show defaultTargetPlatform;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SystemTheme.accentColor.load();
  SystemTheme.onChange.listen((color) {
    debugPrint('强调色已更改为 ${color.accent}');
  });

  runApp(const MaterialApp(home: MyApp()));
}

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

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return SystemThemeBuilder(builder: (context, accent) {
      final colors = [
        accent.lightest,
        accent.lighter,
        accent.light,
        accent.accent,
        accent.dark,
        accent.darker,
        accent.darkest,
      ];
      return Scaffold(
        body: Column(children: [
          Text(
              '强调色: ${defaultTargetPlatform.supportsAccentColor ? '支持' : '不支持'}'),
          ...colors.map((color) {
            return Expanded(
              child: Container(
                color: color,
                alignment: Alignment.center,
                child: Text(
                  [
                    '最浅',
                    '较浅',
                    '浅',
                    '默认',
                    '深',
                    '较深',
                    '最深',
                  ][colors.indexOf(color)] +
                      '\n${color.toHex()}',
                  style: Theme.of(context).textTheme.titleLarge?.copyWith(
                        color: color.computeLuminance() >= 0.5
                            ? Colors.black
                            : Colors.white,
                      ),
                  textAlign: TextAlign.center,
                ),
              ),
            );
          }).toList(),
        ]),
      );
    });
  }
}

extension ColorExtension on Color {
  String toHex() {
    return '#${value.toRadixString(16).padLeft(8, '0').substring(2, 8)}';
  }
}

这个例子创建了一个简单的Flutter应用,它会根据系统的强调色自动调整界面颜色,并显示不同色调的颜色块及其对应的十六进制值。


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

1 回复

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


当然,以下是如何在Flutter应用中使用system_theme插件来实现系统主题适配的示例代码。这个插件允许你监听并响应系统主题(例如,暗模式和亮模式)的变化。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  system_theme: ^x.y.z  # 请替换为最新版本号

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

2. 导入插件

在你需要使用系统主题适配功能的Dart文件中导入system_theme插件:

import 'package:system_theme/system_theme.dart';

3. 监听系统主题变化

你可以使用SystemTheme.observe来监听系统主题的变化。下面是一个简单的示例,展示了如何根据系统主题的变化来动态更新应用的主题:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  Brightness _brightness = Brightness.light;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addObserver(this);
    _updateBrightness();

    // 监听系统主题变化
    SystemTheme.observe((brightness) {
      setState(() {
        _brightness = brightness;
      });
    });
  }

  @override
  void dispose() {
    WidgetsBinding.instance?.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    // 当应用从后台回到前台时,可以重新检查系统主题
    if (state == AppLifecycleState.resumed) {
      _updateBrightness();
    }
  }

  void _updateBrightness() {
    setState(() {
      _brightness = MediaQuery.of(context).platformBrightness;
    });
  }

  @override
  Widget build(BuildContext context) {
    final theme = _brightness == Brightness.dark
        ? ThemeData.dark()
        : ThemeData.light();

    return MaterialApp(
      title: 'Flutter System Theme Demo',
      theme: theme,
      home: Scaffold(
        appBar: AppBar(
          title: Text('System Theme Demo'),
        ),
        body: Center(
          child: Text('Current Theme: $_brightness'),
        ),
      ),
    );
  }
}

解释

  1. 依赖导入:导入system_themeflutter/material.dart
  2. 状态管理:使用StatefulWidget_MyAppState来管理应用的状态。
  3. 监听系统主题变化:使用SystemTheme.observe来监听系统主题的变化,并在变化时更新状态。
  4. 应用生命周期管理:在didChangeAppLifecycleState中处理应用从后台回到前台的情况,重新检查系统主题。
  5. 主题应用:根据当前的系统亮度(_brightness)来动态应用ThemeData.dark()ThemeData.light()

这样,你的Flutter应用就能根据系统主题的变化动态地调整自身的主题了。

回到顶部