【转载】自定义Flutter MaterialApp主题色(primarySwatch)

本文介绍了在Flutter中自定义MaterialColor的方法。通过官方注释可知,自定义需传入颜色初始值及十个级别的颜色映射。给出了三种解决办法,包括函数生成自定义色板、改变透明值生成不同亮度级别(不推荐)、手动选择不同亮度级别颜色,并给出了使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文由WPBKJ原创

通过官方给MaterialColor类的注释发现,要自定义MaterialColor我们需要传入一个颜色初始值primary及从亮到暗共十个级别的Map<int, Color>

这里有一张来自Flutter官方给出的Colors.blue的颜色卡

在这里插入图片描述

解决办法

目前公认的解决办法有如下几种

1、函数生成自定义色板

MaterialColor createMaterialColor(Color color) {
    List strengths = <double>[.05];
    Map<int, Color> swatch = {};
    final int r = color.red, g = color.green, b = color.blue;

    for (int i = 1; i < 10; i++) {
      strengths.add(0.1 * i);
    }
    strengths.forEach((strength) {
      final double ds = 0.5 - strength;
      swatch[(strength * 1000).round()] = Color.fromRGBO(
        r + ((ds < 0 ? r : (255 - r)) * ds).round(),
        g + ((ds < 0 ? g : (255 - g)) * ds).round(),
        b + ((ds < 0 ? b : (255 - b)) * ds).round(),
        1,
      );
    });
    return MaterialColor(color.value, swatch);
  }

使用时仅需要在设置primarySwatch时调用该函数即可
示例

primarySwatch: createMaterialColor(Colors.blueAccent) // 第一种
primarySwatch: createMaterialColor(Color(0xFF448AFF)) // 第二种,注意为8为16进制,首两位FF代表不透明

2、改变透明值以生成不同亮度级别(不推荐)

注意:并不推荐该种方法,该方法会导致组件变透明而不是颜色深浅
示例

MaterialColor myColor = MaterialColor(0xFF880E4F, color);

Map<int, Color> color =
{
50:Color.fromRGBO(4,131,184, .1),
100:Color.fromRGBO(4,131,184, .2),
200:Color.fromRGBO(4,131,184, .3),
300:Color.fromRGBO(4,131,184, .4),
400:Color.fromRGBO(4,131,184, .5),
500:Color.fromRGBO(4,131,184, .6),
600:Color.fromRGBO(4,131,184, .7),
700:Color.fromRGBO(4,131,184, .8),
800:Color.fromRGBO(4,131,184, .9),
900:Color.fromRGBO(4,131,184, 1),
};

使用时赋myColor给primarySwatch即可

3、手动选择不同亮度级别颜色

<think>好的,用户想了解FlutterprimarySwatch属性的作用和应用位置。首先我需要回忆一下Flutter主题配置相关知识。根据提供的引用,特别是引用[1]和[2],primarySwatch用于定义主题的主板,MaterialApp的ThemeData中使用它来自定义主题。主板不仅仅是单一颜,而是一个颜集合,包含不同深浅的颜值。 接下来要考虑primarySwatch的应用位置。引用[4]中的代码示例显示,MaterialApp的theme参数里设置了primarySwatch为Colors.yellow,这说明它是在整个应用的顶层主题配置中定义的。主板会影响多个组件的默认颜,比如AppBar、FloatingActionButton等,这些组件会默认使用主板中的颜。 另外,用户可能想知道primarySwatch和primaryColor的区别。根据引用[1],primaryColor是主要颜,而primarySwatch提供了更多颜梯度。例如,如果primarySwatch设置为蓝,那么按钮、滑块等组件的不同状态(如按下、高亮)会自动使用板中的不同深浅颜,而不需要单独设置。 还需要注意,primarySwatch接受的是MaterialColor类型,而primaryColor是Color类型。因此,使用板可以更方便地保持应用的颜一致性。例如,AppBar的背景默认使用primarySwatch的500值,而FloatingActionButton使用primarySwatch的600值。 最后,应该提醒用户,当同时设置primarySwatch和primaryColor时,primaryColor可能会覆盖primarySwatch中的某些颜,需要根据实际情况调整。同时,给出示例代码帮助用户理解如何正确使用这个属性,并生成相关问题来扩展他们的学习。</think>在Flutter中,`primarySwatch` 是主题配置中定义**主板**的核心属性,其作用与应用位置如下: ### 一、作用解析 1. **颜梯度定义** `primarySwatch` 不是单一颜值,而是接受一个`MaterialColor`类型的板。该板包含10个阶的渐变颜,如: $$Colors.blue = { 50: Color(0xFFE3F2FD), 100: Color(0xFFBBDEFB), ..., 900: Color(0xFF0D47A1) }$$ 2. **组件默认颜来源** 当未单独设置组件颜时,AppBar、按钮、进度指示器等Material组件的默认颜会从`primarySwatch[500]`取值[^2]。例如`AppBar`背景默认使用`primarySwatch[500]` ### 二、应用位置 1. **全局主题配置** 主要在`MaterialApp`的`theme`参数中声明: ```dart MaterialApp( theme: ThemeData( primarySwatch: Colors.blue, // 定义主), ) ``` [^4] 2. **组件级颜联动** 通过`Theme.of(context).primaryColor`可获取当前主题的`primarySwatch[500]`颜值,用于自定义组件颜时保持一致性[^1] ### 三、实际效果示例 | 组件类型 | 使用的阶 | 说明 | |------------------|------------------|---------------------------| | AppBar背景 | primarySwatch[500] | 应用栏主 | | FloatingActionButton | primarySwatch[600] | 悬浮按钮强调 | | ProgressIndicator | primarySwatch[500] | 进度条默认颜 | ### 四、注意事项 - 当同时设置`primaryColor`和`primarySwatch`时,`primaryColor`会覆盖`primarySwatch[500]`的颜值[^1] - 板选择建议使用Material Design预定义的`Colors.blue`等常量,或通过`MaterialColor`自定义板 ```dart // 自定义板示例 MaterialColor mySwatch = MaterialColor( 0xFF42A5F5, // 基准值 {50: Color(0xFFE1F5FE), ..., 900: Color(0xFF01579B)} ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值