【问题标题】:How do I use the different shades of a color swatch in Flutter?如何在 Flutter 中使用不同色调的色板?
【发布时间】:2018-08-25 10:30:06
【问题描述】:

在默认的 Flutter 应用程序代码中,我尝试更改以下代码

来自:

primarySwatch: Colors.blueGrey

到:

primarySwatch: Colors.blueGrey[500]

但这会引发错误:

 ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 4512): The following assertion was thrown building MyApp(dirty):
I/flutter ( 4512): type 'Color' is not a subtype of type 'MaterialColor' of 'primarySwatch' where
I/flutter ( 4512):   Color is from dart:ui
I/flutter ( 4512):   MaterialColor is from package:flutter/src/material/colors.dart
I/flutter ( 4512):   int is from dart:core
I/flutter ( 4512): 
I/flutter ( 4512): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter ( 4512): more information in this error message to help you determine and fix the underlying cause.
I/flutter ( 4512): In either case, please report this assertion by filing a bug on GitHub:
I/flutter ( 4512):   https://github.com/flutter/flutter/issues/new
I/flutter ( 4512): 
I/flutter ( 4512): When the exception was thrown, this was the stack:
I/flutter ( 4512): #0      new ThemeData (package:flutter/src/material/theme_data.dart:78:19)
I/flutter ( 4512): #1      MyApp.build (/data/user/0/com.hackathon.gunbanana/cache/gun_bananaEMVSSI/gun_banana/lib/main.dart:11:18)
I/flutter ( 4512): #2      StatelessElement.build (package:flutter/src/widgets/framework.dart:3678:28)
I/flutter ( 4512): #3      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3625:15)
I/flutter ( 4512): #4      Element.rebuild (package:flutter/src/widgets/framework.dart:3478:5)
I/flutter ( 4512): #5      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3605:5)
I/flutter ( 4512): #6      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3600:5)
I/flutter ( 4512): #7      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890:14)
I/flutter ( 4512): #8      Element.updateChild (package:flutter/src/widgets/framework.dart:2693:12)
I/flutter ( 4512): #9      RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:852:16)
I/flutter ( 4512): #10     RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:823:5)
I/flutter ( 4512): #11     RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:769:17)
I/flutter ( 4512): #12     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2205:19)
I/flutter ( 4512): #13     RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:768:13)
I/flutter ( 4512): #14     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:657:7)
I/flutter ( 4512): #15     runApp (package:flutter/src/widgets/binding.dart:699:7)
I/flutter ( 4512): #16     main (/data/user/0/com.hackathon.gunbanana/cache/gun_bananaEMVSSI/gun_banana/lib/main.dart:3:16)
I/flutter ( 4512): #17     _startIsolate.<anonymous closure> (dart:isolate-patch/dart:isolate/isolate_patch.dart:279)
I/flutter ( 4512): #18     _RawReceivePortImpl._handleMessage (dart:isolate-patch/dart:isolate/isolate_patch.dart:165)
I/flutter ( 4512): ════════════════════════════════════════════════════════════════════════════════════════════════════

如何使用阴影?

【问题讨论】:

  • 我发生了类似的错误。我使用Colors.black 作为样本颜色。但是,一旦我将其更改为Colors.blue,它就起作用了。它也适用于其他一些颜色,但不适用于Colors.black。而且,swatch 必须是基色而不是它的变体,因为这就是 swatches 的用途;生成基础颜色的所有变体。因此,无论您为swatch 提供什么基色,它都必须是MaterialColor 的有效值之一,否则它会崩溃。

标签: android dart material-design flutter


【解决方案1】:

在 main.dart 文件中,在 MyApp 类之外创建您的自定义颜色,如下所示:

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

MaterialColor colorCustom = MaterialColor(0xFFFF5C57, color);

然后只需将其设置为 ThemeData 中的 primarySwatch 属性,如下所示

primarySwatch: colorCustom,

【讨论】:

  • 我们应该如何处理强调色图 (A100-A700)?
【解决方案2】:

TLDR

ThemeData(primarySwatch: Colors.lime),

不要

ThemeData(primarySwatch: Colors.lime.shade700),

primarySwatch 不是 一种 颜色。这是所有可能的材质色调。

如果您查看ThemeData 的文档,它会说:

主调色板([primarySwatch]),选自 由材料设计规范定义的样本之一。这 应该是 [Colors] 类中不 他们的名字中有“口音”。

这意味着在需要时材质组件将使用主要[500],但也可能使用其他色调!

其实primarySwatch是设置一堆不同颜色的快捷方式:

  • 原色
  • primaryColorLight/Dark
  • accentColor
  • ...

但您可以根据需要单独覆盖它们,使用 Color(而不是 primarySwatch 需要的 MaterialColor

【讨论】:

  • 我对这个答案不太满意。在我的代码中,我尝试过主题:新主题数据(primarySwatch:Colors.lime.shade700,主题:新主题数据(primarySwatch:Colors.lime [700],并收到与OP相同的错误消息。你能更具体并提供一个例子?
  • 你需要做primarySwatch: Colors.lime而不是Colors.line.whatever
  • 我发现primarySwatch 需要不同于backgroundColor 的格式。所以混乱是我的一部分。感谢您的想法。
  • 很好的答案。我使用我自己的十六进制颜色包装到一个颜色对象中,用于各种原色,但仍然打开了色板属性。现在我将其注释掉,该应用程序可以运行... yippee!!!
  • 我认为您应该包括有关如何使用不同色调的示例。例如,一个样本中应该定义多少种颜色,以及如何在代码中实际定义它。
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2022-01-19
  • 1970-01-01
  • 2015-09-16
  • 2015-06-19
相关资源
最近更新 更多