【问题标题】:Flutter - Color name string to material colorFlutter - 颜色名称字符串到材质颜色
【发布时间】:2019-07-28 10:22:15
【问题描述】:

在 Flutter 中有一种方法可以根据其名称生成材质颜色,而无需创建完整的贴图 Map<String,MaterialColor>

理论上是这样的:

String colorName = "deepOrange";
MaterialColor color = Colors(colorName);

【问题讨论】:

    标签: flutter


    【解决方案1】:

    这是一个简单的方法。 假设您想获取 Colors.blue

    的材质颜色

    你可以用这个来获取它:-

    MaterialStateProperty.all(Colors.blue)

    例如,要设置提升按钮的背景颜色,应提供材质颜色。您可以提供命名颜色,例如:-

    ElevatedButton(
        style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(Colors.blue),
        ),
        onPressed: (){},
        child: Text('Press me'),
    ),
    

    希望有所帮助。

    【讨论】:

      【解决方案2】:

      我设法使用 Colors.primaries 列表(在colors.dart file 中找到):

          //colors.dart
      
          /// The material design primary color swatches, excluding grey.
          static const List<MaterialColor> primaries = <MaterialColor>[
            red,
            pink,
            purple,
            deepPurple,
            indigo,
            blue,
            lightBlue,
            cyan,
            teal,
            green,
            lightGreen,
            lime,
            yellow,
            amber,
            orange,
            deepOrange,
            brown,
            // The grey swatch is intentionally omitted because when picking a color
            // randomly from this list to colorize an application, picking grey suddenly
            // makes the app look disabled.
            blueGrey,
          ];
      

      所以为了保存颜色:

          Color colorToSave = Colors.indigo;
          prefs.setInt("colorIndex", Colors.primaries.indexOf(colorToSave));
      

      检索:

          MaterialColor colorSaved = Colors.primaries(getInt('colorIndex') ?? 0);
      

      希望对你有所帮助。

      【讨论】:

        【解决方案3】:

        根据评论,目的是从shared_preferences中保存和读回。在这种情况下,最好通过 int 值而不是字符串名称来保存和检索颜色,以确保我们始终能够获取颜色。

        • 保存:prefs.setInt("prefered_color", Color.value)
        • 检索:Color c = const Color(prefs.getInt('prefered_color') ?? 0xFF42A5F5);

        根据官方doc,目前没有API 可以执行您描述的功能。尽管实施您的方法很容易,但我怀疑它在一般情况下的用处。我们还必须处理拼写错误或noSuchColor 错误。但是使用const / enum 将提供编译时错误检查的优势。

        【讨论】:

        • 我需要保存用户的材质颜色偏好,它需要是flutter创建的材质颜色,而不是使用十六进制代码现场创建的材质颜色。所以我会创建一个const / enum 地图。
        • 是的,在您的情况下创建一个地图 是最好的,尽管在从偏好中获取颜色时您可能希望进行适当的错误处理。有时,偏好会保存在不同版本的应用程序中,一个版本可能有 5 种颜色,而另一个版本只有 4 种可用颜色。另一方面,使用Color.value 保存颜色并使用Color c = const Color(0xFF42A5F5); 重新创建颜色永远不会失败。
        猜你喜欢
        • 2015-07-07
        • 1970-01-01
        • 2019-02-14
        • 2018-10-12
        • 1970-01-01
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多