Flutter - Material3适配

demo 地址: https://github.com/iotjin/jh_flutter_demo
代码不定时更新,请前往github查看最新代码

Flutter - Material3适配

  • 对比图
  • 具体实现
    • 一些组件的变化
  • 代码实现
    • Material2的ThemeData
    • Material3的ThemeData

Material3适配官方文档

flutter SDK升级到3.16.0之后 ThemeData()useMaterial3属性如果不设置默认为true,这时运行项目会发现有些UI效果和之前有点不一样,如果原本使用的是默认的主题色,此时会发现主题色已经发生变化,因为Material3的默认主题不再是蓝色,变成了紫色。
如果不想使用Material3直接设置useMaterial3: false即可

对比图

以下图片中的一些组件已经做了适配如FloatingActionButton按钮、TextField的边框等,方便对比展示效果,具体请查看代码

Material2Material3

具体实现

Material3适配官方文档

  • Material3适配主要通过ThemeData实现的
  • 在demo中,一部分常用的组件都有抽出来的公用组件,一般情况把组件适配一下通过使用公用组件可以避免直接设置ThemeData带来的问题。当然直接设置ThemeData也可以
  • 设置 ThemeData(ThemeData(useMaterial3: true, ...) 使用 Material3

其中最重要的是设置主色调,在 Material3 中官方推荐通过 colorScheme: ColorScheme.fromSeed设置主色调,当然通过 ColorScheme.fromSwatch()也可以设置,不过可能需要多配置点东西
其余的就是一些组件的设置了

一些组件的变化

  • Text() 样式调整
  • TextButton()、ElevatedButton()、OutlinedButton()等 风格变化,更圆润
  • FloatingActionButton()形状从圆形变成矩形
  • Switch() UI变化
  • Card()背景色
  • AppBar()底部阴影、图标颜色等
  • BottomNavigationBar()水波纹效果变化
  • TabBar()底部线

代码实现

以下是通过ThemeData()设置整个项目的,对应demo的全局主题设置文件getThemeData()函数
根据需要打开并配置, 如果有基础组件也可以针对组件单独配置
单个适配或对比详见 demo代码UITest3文件

Material2的ThemeData

  static _m2ThemeData(Color themeColor, {bool isDarkMode = false}) {
    // 暗黑模式高亮显示颜色
    var darkPrimaryThemeColor = KColors.kThemeColor;

    return ThemeData(
      useMaterial3: false,
      primarySwatch: JhColorUtils.materialColor(themeColor),
      primaryColor: themeColor,
      colorScheme: ColorScheme.fromSwatch().copyWith(
        brightness: isDarkMode ? Brightness.dark : Brightness.light,
        secondary: isDarkMode ? KColors.kThemeDarkColor : themeColor,
        // surfaceTint: Colors.transparent, // 影响 card 的配色,M3下是applySurfaceTint
        // outline: Colors.grey, // M3 设置OutlinedButton、TextField 边框颜色(尽量单独设置) , Color(0xff79747e)
      ),
      // 页面背景色
      scaffoldBackgroundColor: isDarkMode ? KColors.kBgDarkColor : KColors.kBgColor,
      // 导航条在base_appbar页面配置(没使用base_appbar的按下面配置的)
      appBarTheme: AppBarTheme(
        systemOverlayStyle: JhStatusBarUtils.getStatusBarStyle(isDark: isDarkMode),
        color: isDarkMode ? KColors.kNavBgDarkColor : themeColor,
        iconTheme: const IconThemeData(color: Colors.white),
        // shadowColor: Colors.grey, // M3 设置阴影颜色
      ),
      // 主界面tabbar,在base_tabbar页面配置
      // bottomNavigationBarTheme: BottomNavigationBarThemeData(
      //   backgroundColor: Colors.white,
      //   selectedItemColor: KColors.kTabBarSelectTextColor,
      //   unselectedItemColor: KColors.kTabBarNormalTextColor,
      // ),
      // 分割线
      dividerTheme: DividerThemeData(color: isDarkMode ? KColors.kLineDarkColor : KColors.kLineColor),
      // Tab指示器颜色
      indicatorColor: isDarkMode ? darkPrimaryThemeColor : themeColor,
      // 文字选择色(输入框选择文字等)
      textSelectionTheme: TextSelectionThemeData(
        selectionColor: isDarkMode ? darkPrimaryThemeColor.withAlpha(70) : themeColor.withAlpha(70),
        selectionHandleColor: isDarkMode ? darkPrimaryThemeColor : themeColor,
        cursorColor: isDarkMode ? darkPrimaryThemeColor : themeColor, // 光标
      ),

      // 主要用于Material背景色
      // canvasColor: isDarkMode ? KColors.kMaterialBgDarkColor : KColors.kMaterialBgColor,
      // errorColor: isDarkMode ? KColors.kErrorTextDarkColor : KColors.kErrorTextColor,
      // cupertinoOverrideTheme: CupertinoThemeData(
      //   brightness: isDarkMode ? Brightness.dark : Brightness.light,
      // ),
      // visualDensity: VisualDensity.standard,
    );
  }

Material3的ThemeData

  static _m3ThemeData(Color themeColor, {bool isDarkMode = false}) {
    // 暗黑模式高亮显示颜色
    var darkPrimaryThemeColor = KColors.kThemeColor;

    return ThemeData(
      useMaterial3: true,
      primarySwatch: JhColorUtils.materialColor(themeColor),
      primaryColor: themeColor,
      // 页面背景色
      scaffoldBackgroundColor: isDarkMode ? KColors.kBgDarkColor : KColors.kBgColor,
      // 导航条在base_appbar页面配置(没使用base_appbar的按下面配置的)
      appBarTheme: AppBarTheme(
        systemOverlayStyle: JhStatusBarUtils.getStatusBarStyle(isDark: isDarkMode),
        color: isDarkMode ? KColors.kNavBgDarkColor : themeColor,
        iconTheme: const IconThemeData(color: Colors.white),
        // shadowColor: Colors.grey, // M3 设置阴影颜色
      ),
      // 主界面tabbar,在base_tabbar页面配置
      // bottomNavigationBarTheme: BottomNavigationBarThemeData(
      //   backgroundColor: Colors.white,
      //   selectedItemColor: KColors.kTabBarSelectTextColor,
      //   unselectedItemColor: KColors.kTabBarNormalTextColor,
      // ),
      // 分割线
      dividerTheme: DividerThemeData(color: isDarkMode ? KColors.kLineDarkColor : KColors.kLineColor),
      // Tab指示器颜色
      indicatorColor: isDarkMode ? darkPrimaryThemeColor : themeColor,
      // 文字选择色(输入框选择文字等)
      textSelectionTheme: TextSelectionThemeData(
        selectionColor: isDarkMode ? darkPrimaryThemeColor.withAlpha(70) : themeColor.withAlpha(70),
        selectionHandleColor: isDarkMode ? darkPrimaryThemeColor : themeColor,
        cursorColor: isDarkMode ? darkPrimaryThemeColor : themeColor, // 光标
      ),

      // 主要用于Material背景色
      // canvasColor: isDarkMode ? KColors.kMaterialBgDarkColor : KColors.kMaterialBgColor,
      // errorColor: isDarkMode ? KColors.kErrorTextDarkColor : KColors.kErrorTextColor,
      // cupertinoOverrideTheme: CupertinoThemeData(
      //   brightness: isDarkMode ? Brightness.dark : Brightness.light,
      // ),
      // visualDensity: VisualDensity.standard,

      /// ------------------------------ Material3适配 ------------------------------
      /// https://docs.flutter.dev/release/breaking-changes/material-3-migration
      /// 一些调整适配详见 UITest3
      /// 根据需要打开并配置, 如果有基础组件也可以针对组件单独配置

      /// M3设置主题色 方式一
      colorScheme: ColorScheme.fromSeed(
        seedColor: isDarkMode ? darkPrimaryThemeColor : themeColor,
        brightness: isDarkMode ? Brightness.dark : Brightness.light,
        surfaceTint: Colors.transparent, // 影响 card 的配色,M3下是applySurfaceTint
        // outline: Colors.grey, // M3 设置OutlinedButton、TextField、Switch 边框颜色(尽量单独设置) , Color(0xff79747e)
      ),

      /// M3设置主题色 方式二
      // colorScheme: ColorScheme.fromSwatch().copyWith(
      //   brightness: isDarkMode ? Brightness.dark : Brightness.light,
      //   secondary: isDarkMode ? KColors.kThemeDarkColor : themeColor,
      //   surfaceTint: Colors.transparent, // 影响 card 的配色,M3下是applySurfaceTint
      //   // outline: Colors.grey, // M3 设置OutlinedButton、TextField 边框颜色(尽量单独设置) , Color(0xff79747e)
      // ),
      // textTheme: TextTheme(
      //   bodyMedium: TextStyle(color: isDarkMode ? KColors.kBlackTextDarkColor : KColors.kBlackTextColor),
      // ),
      // textButtonTheme: TextButtonThemeData(
      //   style: TextButton.styleFrom(
      //     // side: BorderSide(width: 1.0, color: themeColor), // 设置边框
      //     shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4.0)), // 设置圆角
      //     splashFactory: InkSplash.splashFactory, // 设置水波纹
      //   ),
      // ),
      // outlinedButtonTheme: OutlinedButtonThemeData(
      //   style: ButtonStyle(side: MaterialStateProperty.all(BorderSide(color: themeColor))),
      // ),
      // floatingActionButtonTheme: FloatingActionButtonThemeData(
      //   backgroundColor: themeColor,
      //   foregroundColor: Colors.white,
      //   shape: CircleBorder(), // 浮动按钮设成圆形
      // ),
      // progressIndicatorTheme: ProgressIndicatorThemeData(
      //   refreshBackgroundColor: isDarkMode ? KColors.kMaterialBgDarkColor : KColors.kMaterialBgColor, // 下拉刷新MaterialHeader()背景色适配
      //
      //   // color: Colors.purpleAccent, // 设置进度指示器的颜色
      //   // linearTrackColor: Colors.black, // 设置线性进度指示器的背景颜色
      //   // linearMinHeight: 4.0, // 设置线性进度指示器的最小高度
      //   // circularTrackColor: Colors.green, // 设置圆形进度指示器的背景颜色
      //   // refreshBackgroundColor: Colors.orange, // 设置刷新指示器的背景颜色
      // ),
      // tabBarTheme: TabBarTheme(
      //   dividerColor: Colors.grey[400],
      //   dividerHeight: 0.5,
      // ),
      // BottomNavigationBar()点击水波纹样式变更,通过Theme() 设置splashFactory: InkSplash.splashFactory
    );
  }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时间处理基础:Rust 的 chrono 库教程

在开发过程中,我们经常有对时间和日期处理的需求。不论是日历应用、日程安排、还是时间戳记录,准确的时间数据处理都是必不可少的。Rust 社区提供的 chrono 库以其强大的功能和灵活的接口,在 Rust 开发者中广受欢迎。本文将简单介绍 chrono 库…

堆盘子00

题目链接 堆盘子 题目描述 注意点 SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈 解答思路 将多个栈存储到一个List中,当入栈时,如果List中最后一个栈容量已经达到cap,则需要新建一个栈,将元素推到…

pytorch版本与torchvision版本不匹配问题处理

pytorch版本与torchvision版本不匹配问题处理 问题问题复现解决方法两点注意内容其一:pytorch版本与torchvision版本对应关系其二:CPU版本或GPU版本问题 问题 在新环境中,利用yolov8训练模型的时候报错,错误内容如下:…

反射...

一、反射的定义 二、获取Class对象三种方式 全类名:包名类名。 public class test {public static void main(String [] args) throws ClassNotFoundException {//第一种方式Class class1Class.forName("test02.Student");//第二种方法Class class2Stud…

Nginx配置详细解释:(4)高级配置

目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外,还有一些高级配置,如网页的状态,第三方模块需要另外安装,支持变量&#xff0c…

宽睿数字平台兼容TDengine 等多种数据库,提供行情解决方案

小T导读:最近,涛思数据与宽睿金融宣布了一项重要合作。在此之前,宽睿金融对 TDengine 进行了性能测试,并根据测试报告的结果,决定将 TDengine 接入宽睿数字平台,以提升高密度行情处理效率。本文将详细介绍此…

idea从git拉取代码需要输入token问题解决

idea使用git 推送代码时,提示token问题,这是因为你的代码仓库是gitlab, 然后打开修改代码后推送时,会默认使用gitlab插件,所以提示输入token解决方式就是把gitlab插件取消使用这样就好了。 取消之后再进行拉取代码即可…

【菜狗学前端】在原生微信小程序使用腾讯地图API接口

一直想调用一下地图API接口什么的,刚好遇到了这个实验就浅浅研究写了一下,顺便总结一下给其他没太了解的人一点便利,希望能够对你有所帮助~ 如何引入、配置、使用、显示。 PS:要是嫌麻烦想要源码/有什么问题欢迎评论/私信,问题的话…

[大模型]Gemma2b-Instruct Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架,对 Gemma2b 模型进行 Lora 微调。Lora 是一种高效微调方法,深入了解其原理可参见博客:知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件,来让大家更…

AI智能体的分级

技术的分级 人们往往通过对一个复杂的技术进行分级,明确性能、适用范围和价值,方便比较、选择和管理,提高使用效率,促进资源合理分配和技术改进和标准化。 比如,国际汽车工程师学会(SAE)定义了自…

诊所管理系统有没有免费的?

随着消费市场的不断变化,消费型医疗领域逐渐受到重视,医疗机构面临激烈的行业竞争。为了提升诊所的经营管理效率和营销能力,选择一款合适的诊所管理系统变得尤为重要。然而,面对市场上众多的系统选择,如何找到适合自己…

Linux 安装ab测试工具

yum -y install httpd-tools ab -help #10个并发连接,100个请求 ab -n 200 -c 100 http://www.baidu.com/

如何制作MapBox个性化地图

我们在《如何在QGIS中加载MapBox图源》一文中,为你分享了在QGIS中加载MapBox的方法。 现在为你分享如何制作MapBox个性化地图的方法,如果你需要最新版本的QGIS及高清图源,请在文末查看获取软件安装包的方法。 新建地图样式 进入Mapbox Stu…

智慧监狱大数据整体解决方案(51页PPT)

方案介绍: 智慧监狱大数据整体解决方案通过集成先进的信息技术和大数据技术,实现对监狱管理的全面升级和智能化改造。该方案不仅提高了监狱管理的安全性和效率,还提升了监狱的智能化水平,为监狱的可持续发展提供了有力支持。 部…

计算机组成原理之计算机的性能指标

目录 计算机的性能指标 复习提示 1.计算机的主要性能指标 1.1机器字长 1.1.1与机器字长位数相同的部件 1.2数据通路带宽 1.3主存容量 1.4运算速度 1.4.1提高系统性能的综合措施 1.4.2时钟脉冲信号和时钟周期的相关概念 1.4.3主频和时钟周期的转换计算 1.4.4IPS的相关…

任务3.8.1 利用RDD实现词频统计

实战:利用RDD实现词频统计 目标 使用Apache Spark的RDD(弹性分布式数据集)模块实现一个词频统计程序。 环境准备 选择实现方式 确定使用Spark RDD进行词频统计。 Spark版本与Scala版本匹配 选择Spark 3.1.3与Scala 2.12.15以匹配现有Spar…

使用seq2seq架构实现英译法

seq2seq介绍 模型架构: Seq2Seq(Sequence-to-Sequence)模型是一种在自然语言处理(NLP)中广泛应用的架构,其核心思想是将一个序列作为输入,并输出另一个序列。这种模型特别适用于机器翻译、聊天…

定个小目标之刷LeetCode热题(11)

这是道简单题,只想到了暴力解法,就是用集合存储起来,然后找出其中的众数,看了一下题解,发现有多种解法,我觉得Boyer-Moore 投票算法是最优解,看了官方对这个算法的解释,我是这样理解…

每天一个数据分析题(三百五十九)- 多维分析模型

图中是某公司记录销售情况相关的表建立好的多维分析模型,请根据模型回答以下问题: 2)产品表左连接品牌表的对应关系属于? A. 一对多 B. 一对一 C. 多对一 D. 多对多 数据分析认证考试介绍:点击进入 题目来源于CD…

高光谱成像光源 实现对细微色差的分类--51camera

光源在机器视觉中的重要性不容小觑,它直接影响到图像的质量,进而影响整个系统的性能。然而自然光LED光源不能完全满足实际需求,比如对细微的色差进行分类,我们就需要考虑红外高光谱光源。 所谓高光谱成像,是指使用具有…