【问题标题】:How to pass variable content to a parameter value in dart/flutter?如何将变量内容传递给 dart/flutter 中的参数值?
【发布时间】:2020-09-11 15:41:27
【问题描述】:

我可能遗漏了一些明显的东西,但是我在将变量传递给颤振/飞镖中的参数或小部件时遇到了麻烦。例如,假设我有一些变量:

String col = 'red';

我想将它传递给一个颜色参数以获得相当于

color: Colors.red

困难的是,我尝试传递值的任何方式最终都会传递一个字符串(这是不被接受的),包括尝试直接传递 col 的值或尝试构建一个返回 @ 的函数987654324@。

我认为我需要的是类似函数的东西

setColor(String str) {
    return Colors.str;
  }

但是,正如您所料,这会返回“没有为类型 'Colors' 定义 getter 'str'。” (同样适用于:

setColor(String str) {
    return Colors.$str;
}

我知道一个选择是使用一堆 if 来创建一个函数,比如

setColor(String str) {
 if (str==red) return Colors.red;
 if (str==blue) return Colors.blue;
 if (str==green) return Colors.green;
etc.
}

但如果有的话,我更喜欢更优雅的选择。

编辑:看起来这并不像我希望的那么简单(请参阅下面的答案和答案)。

【问题讨论】:

    标签: oop flutter dart


    【解决方案1】:

    Supercharged 是您的最佳解决方案。您可以这样尝试(十六进制文本或 HTML 颜色):

    "#ff00ff".toColor();  // pink
    "ff0000".toColor();   // red
    "00f".toColor();      // blue
    "red".toColor();      // red (HTML color name)
    "deeppink".toColor(); // deep pink (HTML color name)
    

    当然,这个功能依赖于扩展。 Dart 2.7 中引入的扩展方法。

    编辑:

    extension MainAxisAlignmentExtension on String {
      MainAxisAlignment get mainAxis {
        switch (this.toUpperCase()) {
          case "BETWEEN":
            return MainAxisAlignment.spaceBetween;
          case "AROUND":
            return MainAxisAlignment.spaceAround;
          case "EVENLY":
            return MainAxisAlignment.spaceEvenly;
          case "CENTER":
            return MainAxisAlignment.center;
          case "START":
            return MainAxisAlignment.start;
          case "END":
            return MainAxisAlignment.end;
          default:
            return MainAxisAlignment.start;
        }
      }
    }
    
    print("Between".mainAxis);
    print("AROUND".mainAxis);
    

    【讨论】:

    • 这看起来很有希望,我得试试看。但总的来说,没有办法将字符串的值传递给参数吗?例如,假设我想定义一个由一行组成的小部件 MyRow,以便 mainAxisAlignment 值由 MyRow 的参数确定。与此处的示例类似,我想通过“around”或“Between”之类的内容来获取 MainAxisAlignment.spaceAround 或 .spaceBetween。
    • 好吧,按照相同的扩展方法,我编辑我的答案来实现这一点,尽管你必须对它做自己的 sn-ps。请检查一下。
    • 感谢您的回复。我只是在玩 SuperCharged 并意识到你在这里指的是,这仍然需要一个包含每个案例的 if 子句的函数。我希望避免这种情况,但似乎这是要走的路。
    【解决方案2】:

    您可以使用颜色类型,而不是将颜色作为字符串传递

    Color col = Colors.red;
    

    如果你想继续使用字符串存储颜色,你可以使用十六进制值

    String col = "#FF5733";
    

    并使用函数将其转换为颜色

    Color hexToColor(String code) {
      return new Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000); 
    }
    

    例子:

    Color newColor = hexToColor(col);
    

    希望这就是你要找的东西!

    【讨论】:

    • 我不太了解这里。如果变量 col 可以取多个值(“red”、“blue”等),我看不出它如何在不知道它是什么的情况下传递这个值。
    • 你实际上需要一种机制来转换颜色,因为颤振不知道什么是“红色”。所以我的意思是,你可以传递颜色的十六进制代码并使用函数,而不是传递红色将其转换为颜色。如果你想继续使用“红色”、“绿色”,你可以做一个Map<String, Color>,比如{"red":Colors.red},你会很高兴的。
    【解决方案3】:

    您可以通过将颜色声明为变量来将颜色从一个小部件传递到另一个小部件。

    final Color redColor=Colors.red;
    

    然后您可以将它作为参数传递给小部件(将颜色传递给小部件):

    Widget something(Color redColor){
     Text("It Works!",style: TextStyle(color: redColor))
    }
    

    如果您想将它从一个无状态或有状态小部件传递到另一个:

    class DetailScreen extends StatelessWidget {
      // Declare a field that holds the color.
      final Color redColor;
    
      // In the constructor, require a Color.
      DetailScreen({Key key, @required this.redColor}) : super(key: key);
    
      // Your widget build and other things here
    }
    

    然后通过调用获取值:

    Text("It Works!",style: TextStyle(color: widget.redColor))
    

    【讨论】:

    • 这并不完全符合我的需要,我不认为。一般来说,我希望能够定义一个(无状态)小部件,它需要一些参数,然后使用这些参数来构建自己。例如,我希望能够调用 Widget(col: 'red') 然后让它自己构建一个红色版本,其中包含依赖于输入的组件。 (因此我可以让它包含具有相同颜色的不同数值的小部件 - red[800]、red[600] 等。)我希望这可以澄清。
    • @Mik 它也在上面得到了回答然后你可以将它作为参数传递给一个小部件:希望这会有所帮助:)
    • 对,但在这种情况下,我需要为颜色字符串的每个可能值定义单独的变量,对吗?因此我需要“如果 col==red 那么 Color redColor=Colors.red; if col==blue 那么 Color redColor=Colors.blue; 等等”,不是吗? (在这种情况下,我可以创建一个函数来满足我的需要,但我希望避免这种情况。)谢谢
    • @Mik 据我所知,没有办法避免你试图避免的事情。在这种情况下,您可以使用 switch 语句来使您的代码更清晰、更易于阅读。对此感到抱歉。
    • @Mik 不客气。请将此标记为答案,以便它可以帮助遇到类似问题的人。谢谢。您也可以通过对此答案投票来帮助我。
    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多