Flutter中primaryColor和primarySwatch有什么区别?

Ton*_*Joe 31 flutter

在Flutter中,可以使用ThemeData类将主题应用于应用程序.但是这个课程有两个让我困惑的事情:primaryColorprimarySwatch.这两个属性之间的区别是什么,何时使用其中一个?谢谢.

Rém*_*let 48

primarySwatch不是一个Color.是的MaterialColor.这意味着它是材质应用程序将使用的颜色的不同色调.

primaryColor是那些阴影之一.确切地说,primaryColor通常等于primarySwatch[500].

通常最好定义一个primarySwatch而不是primaryColor.因为一些材料成分可能会使用不同的阴影,primaryColor如阴影,边框,......

  • 更多信息在这里https://material.io/guidelines/style/color.html#color-color-palette (4认同)
  • @jaumard 你不能。`primarySwatch` 只是设置其他属性的快捷方式。如果您需要自定义属性,则必须向主题添加字段。 (2认同)
  • 是的。如果您仅设置“PrimaryColor”,您可能会陷入奇怪的情况,其中某些小部件不使用该颜色,因为它们使用不同的“Theme”字段。 (2认同)

Ald*_*ith 12

以下内容来自我对 theme_data.dart 的细读:

primarySwatch默认为Colors.blue并将以下字段(包括primaryColor)设置为MaterialColor输入的各种阴影,具体取决于主题brightness是浅色还是深色(默认为浅色):

轻主题

// The default shade for the color is used
primaryColor = primarySwatch; // [500] for normal colors and [200] for accent colors
Run Code Online (Sandbox Code Playgroud)
primaryColorLight = primarySwatch[100];
Run Code Online (Sandbox Code Playgroud)
primaryColorDark = primarySwatch[700];
Run Code Online (Sandbox Code Playgroud)
// This can be overridden by setting accentColor (below) manually
toggleableActiveColor = primarySwatch[600];
Run Code Online (Sandbox Code Playgroud)
accentColor = primarySwatch[500];
Run Code Online (Sandbox Code Playgroud)
secondaryHeaderColor = primarySwatch[50];
Run Code Online (Sandbox Code Playgroud)
textSelectionColor = primarySwatch[200];
Run Code Online (Sandbox Code Playgroud)
textSelectionHandleColor = primarySwatch[300]
Run Code Online (Sandbox Code Playgroud)
backgroundColor = primarySwatch[200];
Run Code Online (Sandbox Code Playgroud)

*buttonColor 设置为其默认值(灰色 [300])

黑暗主题

buttonColor = primarySwatch[600];
Run Code Online (Sandbox Code Playgroud)

*上面列出的浅色主题的其余字段设置为它们的深色默认值(各种深浅的青色、灰色或黑色)

所有主题(浅色或深色)

// Brightness.dark/light is estimated based on the default shade for the color
// This also sets the bool primaryIsDark
primaryColorBrightness = estimateBrightnessForColor(primarySwatch);
Run Code Online (Sandbox Code Playgroud)
// This generates the modern simplified set of theme colors flutter recommends
// using when theming Widgets based on the theme. Set it manually if you need
// more control over individual colors
colorScheme = ColorScheme.fromSwatch(
      primarySwatch: primarySwatch, // as above
      primaryColorDark: primaryColorDark, // as above
      accentColor: accentColor, // as above
      cardColor: cardColor, // default based on theme brightness, can be set manually
      backgroundColor: backgroundColor, // as above
      errorColor: errorColor, // default (Colors.red[700]), can be set manually
      brightness: brightness, // default (Brightness.light), can be set manually
    );
Run Code Online (Sandbox Code Playgroud)

如已接受的答案中所述,如果没有单独设置,则只有设置primaryColor可以让小部件打开以根据上述其他字段之一选择其他一些默认颜色(各种蓝色阴影),因此primarySwatch是简单主题的便捷简写。

但是,总的来说,根据您应该使用的现代约定, colorScheme 字段是最重要的Theme.of(context).colorScheme.<Color>(尽管它可能无法在任何地方使用,具体取决于您何时阅读本文)。

因此,如果您需要对单个主题颜色进行更多控制,您可以通过设置 中使用的字段ColorScheme.fromSwatch,或者只是设置primarySwatch(为了尚未迁移的 Flutter 小部件的向后兼容性),然后colorScheme手动设置额外的控制。另请参阅此文档以获取更多信息……


aWe*_*per 6

Swatch是一个类别。颜色是该类别中的一个范围,但不限于此。根据您指定的色板颜色,flutter 可以选择适合组件的背景和前景色。

tldr ;

了解 b/wa 色板和颜色的区别很重要。色板是一种颜色。它的MaterialColor 材料类型具有下面列出的色板和白色。(忽略 50)

各种色板

.

每个色板都有不同的范围。色板/范围中的个体是一种颜色,尽管您不受它的限制。您可以指定任何有效的颜色代码,即使它不在样本范围内。

在此处输入图片说明

.

根据您指定的色板颜色,flutter 可以选择适合组件的背景和前景色。

.

这是所有色板及其颜色的列表。截图来自https://material.io/design/color/the-color-system.html#tools-for-picking-colors

各种色板

  • 感谢所有的可视化。 (2认同)

Tom*_*ang 5

PrimarySwatch 是MaterialColor

/// Defines a single color as well a color swatch with ten shades of the color.
///
/// The color's shades are referred to by index. The greater the index, the
/// darker the color. There are 10 valid indices: 50, 100, 200, ..., 900.
/// The value of this color should the same the value of index 500 and [shade500].     
/// hex_value1 = 0xFFAAD401; hex_value2 = 0xFFAAD403; ...
MaterialColor myGreen = const MaterialColor(0xFFAAD400,
      const {
        50 : const Color(hex_value1),
        100 : const Color(hex_value2),
        200 : const Color(hex_value3),
        300 : const Color(hex_value4),
        400 : const Color(hex_value5),
        500 : const Color(hex_value6),
        600 : const Color(hex_value7),
        700 : const Color(hex_value8),
        800 : const Color(hex_value9),
        900 : const Color(hex_value10)});
// use MaterialColor: myGreen.shade100,myGreen.shade500 ...
myGreen.shade50 // Color === 0xFFAAD401
Run Code Online (Sandbox Code Playgroud)