Flutter 动态主题切换与自定义主题

1. 简介

Flutter 是一个跨平台的开发框架,支持多种平台的 UI 开发。在现代应用中,用户对个性化体验的需求越来越高,因此支持多种主题模式的应用成为了标准。在这篇文章中,我们将通过代码示例,演示如何实现 Flutter 中的动态主题切换,包括亮色模式、深色模式以及自定义主题模式,带你深入理解如何灵活控制应用的外观风格。

2. 效果图

3. Flutter 中的主题系统

Flutter 提供了强大的主题系统,使用 ThemeData 类可以定义应用的全局外观风格。配合 ThemeMode,你可以轻松实现多种主题切换。

• ThemeData:用于定义具体的颜色、字体、按钮样式等。

• ThemeMode:控制当前主题模式,有三种值:

• ThemeMode.light:强制应用亮色主题。

• ThemeMode.dark:强制应用深色主题。

• ThemeMode.system:根据系统的主题设置自动切换。

3. 定义

自定义颜色这里我举例用的是scaffoldBackgroundColor作为背景颜色,如果想要对应的按钮、字体、分割线等等颜色 可以进去ThemeData里面看对应的名称,想要的东西对应的都有

4. 使用

把背景颜色改成我们刚才定义的scaffoldBackgroundColor

5. 完整代码

import 'package:flutter/material.dart';

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

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

class _MyAppState extends State<MyApp> {
  ThemeMode _themeMode = ThemeMode.system; // 默认跟随系统
  bool _isCustomTheme = false; // 是否启用自定义主题

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Dynamic Theme',
      theme: _isCustomTheme ? _customTheme() : ThemeData.light(),
      darkTheme: ThemeData.dark(),
      themeMode: _themeMode,
      home: HomePage(
        onThemeChanged: (ThemeMode themeMode) {
          setState(() {
            _themeMode = themeMode;
          });
        },
        onCustomThemeChanged: () {
          setState(() {
            _isCustomTheme = !_isCustomTheme;
          });
        },
      ),
    );
  }

  //自定义主题
  ThemeData _customTheme() {
    if (!_isCustomTheme) {
      return ThemeData.light();
    }
    return ThemeData(
      scaffoldBackgroundColor: Colors.yellow,
    );
  }
}

class HomePage extends StatelessWidget {
  final Function(ThemeMode) onThemeChanged;
  final VoidCallback onCustomThemeChanged;

  const HomePage(
      {super.key,
      required this.onThemeChanged,
      required this.onCustomThemeChanged});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,
      appBar: AppBar(title: Text('动态主题切换')),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: () => onThemeChanged(ThemeMode.light),
            child: Text('切换到亮色模式'),
          ),
          ElevatedButton(
            onPressed: () => onThemeChanged(ThemeMode.dark),
            child: Text('切换到深色模式'),
          ),
          ElevatedButton(
            onPressed: () => onThemeChanged(ThemeMode.system),
            child: Text('跟随系统设置'),
          ),
          ElevatedButton(
            onPressed: onCustomThemeChanged,
            child: Text('切换到自定义主题'),
          ),
        ],
      ),
    );
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值