【问题标题】:How to convert Flutter color to string and back to a color如何将 Flutter 颜色转换为字符串并返回颜色
【发布时间】:2018-04-14 19:05:58
【问题描述】:

我正在将颜色转换为字符串。然后我将颜色转换为字符串。不幸的是,当我想将其转换回颜色时,操作失败:

   Color pickerColor = new Color(0xff443a49);
    String testingColorString = pickerColor.toString();

   Color newColor;

   newColor = testingColorString as Color;

类型“字符串”不是类型转换中“颜色”类型的子类型,其中 字符串来自 dart:core 颜色来自 dart:ui

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    在 Dart 中,as 运算符不允许您更改对象的实际结构,它只允许您提供对象可能具有更具体类型的提示。例如,如果你有一只狗和一个动物类,你可以使用 as 来指定你的动物实际上是一只狗(只要对象 is 实际上是一只狗)。

    class Animal {}
    class Dog extends Animal {}
    
    Animal animal = new Dog();
    Dog bob = animal as Dog; // works, since animal is actually a dog
    Animal animal2 = new Animal();
    Dog bob2 = animal2 as Dog; // fails, since animal2 is actually an Animal
    

    现在,在您提供的示例中,toString 实际上只是创建了当前Color 值的字符串表示形式。由于这个对象是一个字符串,你不能用as把它改回Color。相反,您可以将 String 解析为一个值并构造一个新的 Color 对象。

    Color color = new Color(0x12345678);
    String colorString = color.toString(); // Color(0x12345678)
    String valueString = colorString.split('(0x')[1].split(')')[0]; // kind of hacky..
    int value = int.parse(valueString, radix: 16);
    Color otherColor = new Color(value);
    

    【讨论】:

      【解决方案2】:

      你实际上不能这样做。 Color 没有接受 String 作为颜色表示的构造函数。

      为此,您可以使用颜色属性value。它是一个 32 位 int 值,代表您的颜色。您可以保存它,然后用于创建新的 Color 对象。

      代码可能如下所示

      Color pickerColor = new Color(0xff443a49);
      int testingColorValue = pickerColor.value;
      String testingColorString = pickerColor.toString();
      
      Color newColor = new Color(testingColorValue);
      

      或者像这样

      Color pickerColor = new Color(0xff443a49);
      String testingColorString = pickerColor.toString();
      
      Color newColor = new Color(pickerColor.value);
      

      【讨论】:

      • 这应该是一个可接受的答案,即使解决方案不使用 String 作为过渡类型
      • 它还为我提供了一种使用 json_serializable 保存 Material.color 的方法。所以谢谢你!
      【解决方案3】:

      利用 Dart 扩展的强大功能,我们可以通过一个返回 Color 的函数来扩充 String

      extension ColorExtension on String {
        toColor() {
          var hexColor = this.replaceAll("#", "");
          if (hexColor.length == 6) {
            hexColor = "FF" + hexColor;
          }
          if (hexColor.length == 8) {
            return Color(int.parse("0x$hexColor"));
          }
        }
      }
      

      在颜色属性中设置一个字符串颜色代码值。

       child: Text("Text Color",
                   style: TextStyle(
                   color: '#55B9F4'.toColor(),
                    ),
                   )
      

      【讨论】:

        【解决方案4】:

        使用以下代码获取颜色的十六进制值。

        Color color = Colors.red;
        var hexCode = '#${color.value.toRadixString(16).substring(2, 8)}';
        

        【讨论】:

          【解决方案5】:

          另一种在firebase中保存颜色并检索的简单方法是首先将颜色的值保存为字符串,然后像这样将该值存储在firebase中。

          Color black = Colors.black; // example black color
          
          String _storeColorValue = black.value.toString() ;
          

          这将给出 4278190080 作为黑色值。您将此值作为字符串存储到 firebase。
          您可以像这样检索颜色值并将其更改回颜色:

          int value = int.parse(_storeColorValue);
          
          Color color = Color(value).withOpacity(1); 
          

          这将在颜色值和 withOpacity(1) 的帮助下返回颜色,返回与我们传入的值匹配的新颜色。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-02
            • 1970-01-01
            • 1970-01-01
            • 2016-08-11
            • 2022-12-19
            • 2012-11-01
            • 2019-01-01
            • 1970-01-01
            相关资源
            最近更新 更多