为 Flutter 应用设置主题:ThemeData 和 ColorScheme 指南

在媒体和其他来源中有许多关于这个主题的文章,那么这篇文章的必要性是什么?

在本文中,我计划仅关注 ThemeData 小部件的关键点以及我的开发经验中最常用的参数,并且您将获得有关每个参数如何对您的应用程序执行操作的简要说明。

你好奇吗?继续阅读🤗。

使用 ThemeData 的主要好处

  • 保持统一的外观: 定义一个单一的 ThemeData 对象,该对象封装了应用程序的调色板、字体、形状和其他视觉元素。在所有屏幕上一致应用该主题,确保品牌识别的一致性和可识别性。
  • 为不同的主题设计不同的版本: 为浅色和深色模式、应用分区或用户首选项定义多个 ThemeData 对象。
  • 只需定义一次主题,即可在任何地方使用它们: 无需手动设置单个小组件的视觉样式,而是在应用中应用适当的 ThemeData 小组件。这减少了代码重复并简化了维护。
  • 集中控制和更新:ThemeData 对象进行更改,这些更改会自动传播到整个应用,从而确保一致性并减少重复编辑的需要。
  • 创建无障碍变体: 为有特定无障碍需求的用户建立单独的主题数据对象,例如为视觉障碍用户建立高对比度主题。

现在你已经熟悉了 ThemeData 对你的帮助,那么如何在你的应用程序中实现它呢?😊

这是一个在 Flutter 应用程序中实现深色和浅色主题的基本主题的小指南。

创建全局类

第一步是创建一个全局类,用于在应用程序中管理 ThemeData。该类包含一个方法,用于使用 ColorSheme 创建不同的 ThemeData 实例。

class GlobalThemData {static ThemeData themeData(ColorScheme colorScheme, Color focusColor) {return ThemeData(colorScheme: colorScheme, focusColor: focusColor);}
}

focusColor : 该颜色用于 TextFields 和 TextFormField 等 widget,以指示该 widget 是否有主焦点。

ColorSheme :基于 Material 规范的一组 30 种颜色,可用于配置大多数组件的颜色属性。

我们可以在本文后面更详细地讨论 ColorSheme

现在,我们可以创建更多可直接从 GlobalThemData 类访问的公有变量。

lightColorScheme:持有浅色主题的 ColorSheme

darkColorScheme:持有暗色主题的 ColorSheme

lightThemeData:持有浅色主题的 ThemeData

darkThemeData:持有深色主题的 ThemeData

class GlobalThemData {static final Color _lightFocusColor = Colors.black.withOpacity(0.12);static final Color _darkFocusColor = Colors.white.withOpacity(0.12);static ThemeData lightThemeData = themeData(lightColorScheme, _lightFocusColor);static ThemeData darkThemeData = themeData(darkColorScheme, _darkFocusColor);static ThemeData themeData(ColorScheme colorScheme, Color focusColor) {return ThemeData(colorScheme: colorScheme, focusColor: focusColor);}static const ColorScheme lightColorScheme = ColorScheme();static const ColorScheme darkColorScheme = ColorScheme();
}

如果您和我一起编码,您可能会在 ColorSheme() 上收到必需的参数错误警告。

我们可以在下一步中解决这个问题。

ColorSheme

ColorSheme 中的颜色是成对的;第一个是颜色本身,第二个是可用于该颜色的颜色,如文本和其他元素。

这 10 种颜色对于为 Flutter ThemData 创建 ColorSheme 是必需的,每种颜色的值都是可选的。

  • primary:这是应用程序中最常用的颜色
  • onPrimary:此颜色用于为原色之上的元素(例如文本、图标等)着色。
  • secondary:这定义了一种辅助颜色,通常用于不太显眼的元素,如滤镜芯片、切换按钮或背景元素,这些元素需要从主色中脱颖而出,但又不能喧宾夺主。
  • onSecondary:该颜色用于为次要颜色上的元素着色。
  • error:这是用于错误消息或警报的颜色,例如闪烁的红灯表示问题。
  • onError:这是与 error 颜色相得益彰的文本颜色,例如红色标志上的白色文本,便于阅读。
  • background:整个应用程序的主要背景色。将其视为放置所有其他 UI 元素的画布。
  • onBackground:该颜色用于为背景色上的元素着色。
  • surface:用作卡片、工作表、对话框等高级 UI 元素的基色。

因此,我们可以按如下方式设置我们的 lightColorScheme and darkColorScheme 变量。

static const ColorScheme lightColorScheme = ColorScheme(primary: Color(0xFFB93C5D),onPrimary: Colors.black,secondary: Color(0xFFEFF3F3),onSecondary: Color(0xFF322942),error: Colors.redAccent,onError: Colors.white,background: Color(0xFFE6EBEB),onBackground: Colors.white,surface: Color(0xFFFAFBFB),onSurface: Color(0xFF241E30),brightness: Brightness.light,);
static const ColorScheme darkColorScheme = ColorScheme(primary: Color(0xFFFF8383),secondary: Color(0xFF4D1F7C),background: Color(0xFF241E30),surface: Color(0xFF1F1929),onBackground: Color(0x0DFFFFFF),error: Colors.redAccent,onError: Colors.white,onPrimary: Colors.white,onSecondary: Colors.white,onSurface: Colors.white,brightness: Brightness.dark,);

现在,我们为浅色和深色主题设置了一个 ColorScheme,那么如何在主题数据中使用它呢?

创建 ThemeData

我们需要修改 GlobalThemeData 中的 themeData 方法,为 ThemeData 创建一个合适的值 ColourScheme,并传递给它。

static ThemeData themeData(ColorScheme colorScheme, Color focusColor) {return ThemeData(colorScheme: colorScheme,canvasColor: colorScheme.background,scaffoldBackgroundColor: colorScheme.background,highlightColor: Colors.transparent,focusColor: focusColor);}
  • canvasColor: 这是整个屏幕或应用程序窗口的背景色。它定义了所有其他 UI 元素的基色。
  • scaffoldBackgroundColor: 这具体定义了脚手架本身的背景颜色,包括应用栏、正文内容区域和底部导航栏(如果存在)。
  • highlightColor: 该属性定义了用户点击并按住 Widget 时短暂显示的颜色。它为用户提供了交互已注册的视觉反馈。
  • focusColor:该属性定义了用于直观显示当前哪个元素具有焦点的颜色,这意味着该元素将接收键盘输入。这对于突出显示当前活动元素,吸引用户注意非常有用。

这些只是示例,还有许多其他选项 ThemeData 可供您探索。

因此,我们最终的 GlobalThemeData 类应该是这样的:

class GlobalThemData {static final Color _lightFocusColor = Colors.black.withOpacity(0.12);static final Color _darkFocusColor = Colors.white.withOpacity(0.12);static ThemeData lightThemeData =themeData(lightColorScheme, _lightFocusColor);static ThemeData darkThemeData = themeData(darkColorScheme, _darkFocusColor);static ThemeData themeData(ColorScheme colorScheme, Color focusColor) {return ThemeData(colorScheme: colorScheme,canvasColor: colorScheme.background,scaffoldBackgroundColor: colorScheme.background,highlightColor: Colors.transparent,focusColor: focusColor);}static const ColorScheme lightColorScheme = ColorScheme(primary: Color(0xFFB93C5D),onPrimary: Colors.black,secondary: Color(0xFFEFF3F3),onSecondary: Color(0xFF322942),error: Colors.redAccent,onError: Colors.white,background: Color(0xFFE6EBEB),onBackground: Colors.white,surface: Color(0xFFFAFBFB),onSurface: Color(0xFF241E30),brightness: Brightness.light,);static const ColorScheme darkColorScheme = ColorScheme(primary: Color(0xFFFF8383),secondary: Color(0xFF4D1F7C),background: Color(0xFF241E30),surface: Color(0xFF1F1929),onBackground: Color(0x0DFFFFFF),error: Colors.redAccent,onError: Colors.white,onPrimary: Colors.white,onSecondary: Colors.white,onSurface: Colors.white,brightness: Brightness.dark,);
}

是的!我们刚刚为我们的应用程序创建了一个漂亮的主题。现在怎么办?

设置 ThemeData

MaterialApp 中设置所需的主题。

class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,title: 'Flutter Demo',themeMode: ThemeMode.light, //or ThemeMode.darktheme: GlobalThemData.lightThemeData,darkTheme: GlobalThemData.darkThemeData,home: const ShowCaseHome(),);}
}

这将为您的应用程序提供默认的浅色主题,您可以将模式更改为深色。您可以探索 InheritedWidget 或 Provider 的强大功能,以实现动态切换。这不在本文的讨论范围之内,如有需要,我们可以在今后的文章中详细讨论。

希望您能得到一些有价值的信息,感谢您的阅读🤗。


https://medium.com/@nikhithsunil/theme-your-flutter-app-a-guide-to-themedata-and-colorscheme-d8bca920a6b5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/679823.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防火墙技术基础篇:什么是包过滤技术

什么是防火墙包过滤技术 当数据在网络中传输时,它们被分割成小的单元,称为数据包。防火墙的包过滤是一种基本的网络安全技术,用于检查这些数据包并根据预定义的规则决定是否允许它们通过防火墙。 防火墙包过滤是一种关键的网络安全技术&am…

代码随想录Day 41|Leetcode|Python|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…

数据猎手:使用Java和Apache HttpComponents库下载Facebook图像

引言 在信息驱动的时代,互联网上的数据成为了无可比拟的宝藏。本文旨在探讨如何通过利用Java和Apache HttpComponents库,从全球最大的社交网络平台Facebook上获取图像数据。 作为全球最大的社交网络平台,Facebook聚集了数以亿计的用户&#…

企业百度百科词条怎么修改

在进行企业百度百科词条的修改前,首先需要做好以下准备: 注册并登录百度账号:只有注册并登录了百度账号,你才能进行词条的编辑和修改。 熟悉百度百科编辑规则:了解百度百科的编辑规则,包括内容要求、格式规…

爬虫爬取必应和百度搜索界面的图片

爬虫爬取必应和百度搜索界面的图片 爬取bing搜索图片界面爬取百度搜索界面图片结果如下 爬取bing搜索图片界面 浏览器驱动下载地址 对应版本即可 浏览器驱动 mad直接用 import os import re from selenium import webdriver from selenium.webdriver import Keys from sel…

【进程间通信】共享内存

文章目录 共享内存常用的接口指令利用命名管道实现同步机制总结 System V的IPC资源的生命周期都是随内核的。 共享内存 共享内存也是为了进程间进行通信的,因为进程间具有独立性,通信的本质是两个不同的进程看到同一份公共资源,所以共享内存…

[蓝桥杯]真题讲解:合并数列(双指针+贪心)

[蓝桥杯]真题讲解&#xff1a;班级活动&#xff08;贪心&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;合并数列&#xff08;双指针贪心&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #define in…

Metasploit Framework(MSF)从入门到实战(二)

Metasploit Framework&#xff08;MSF&#xff09;从入门到实战&#xff08;一&#xff09;_安装msf更新-CSDN博客 MSF模块介绍 MSF有7个模块&#xff0c;分别对下面目录下的7个子文件夹&#xff1a; auxiliary&#xff08;辅助模块 &#xff09; show auxiliary //查看所有…

UBoat:一款功能强大的HTTP Botnet学习与研究工具

关于UBoat UBoat是一款功能强大的HTTP Botnet概念验证工具&#xff0c;该工具支持复刻一个现实场景中完整功能的Botnet测试环境&#xff0c;广大研究人员可以利用UBoat深入学习和研究Botnet的工作机制&#xff0c;以此来提升安全检测和保护策略。 功能介绍 1、基于C开发&…

分析 vs2019 c++20 语法规范下的全局函数: _Pocca ,这涉及到分配器的传递

&#xff08;1&#xff09;看 STl 源码时涉及到容器对象的 copy 时会调用该函数&#xff0c;例如 string 容器的 copy 操作&#xff1a; &#xff08;2&#xff09;该函数的源码如下&#xff1a; 从此源码得出结论&#xff0c;如果不自己写分配器&#xff0c;使用 STL 提供的标…

【人工智能】博弈搜索(极小极大值、α-β剪枝)

1. 极小极大值算法 人工智能中 “博弈” 通常专指博弈论专家们称为有完整信息的、确定性的、轮流行动的、两个游戏者的零和游戏&#xff08;如国际象棋)。术语中&#xff0c;这是指在确定的、完全可观察的环境中两个 Agent必须轮流行动&#xff0c;在游戏结束时效用值总是相等并…

蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app

本文来自&#xff1a;蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app - 源码1688 卡券绿色循环计划—— 一项旨在构建卡券价值再利用生态的社会责任感项目。在当前数字化消费日益普及的背景下&#xff0c;大量礼品卡、优惠券因各种原因未能有效…