如何在 dart 中将字符串内的两个变量相乘?

How can I multiply two variables inside the string in dart?

"${element['price'] * element['step']} c"

总是显示错误

The operator '*' isn't defined for the type 'Object'.

结果必须乘以两个变量并转换为字符串。

怎么了?我找不到任何答案。按照文档说明制作。

element

var element = {
  'title': 'Apple and more more thing',
  'category': 'Fruit',
  'description': 'Some data to describe',
  'price': 24.67,
  'bonus': '1% bonus',
  'group': 'Picnik',
  'step': 1.0
};

您可能需要将它们转换为特定类型。例如,如果它们的类型为 double:

"${(element['price'] as double) * (element['step'] as int)} c"

在您将对象添加到您的问题后进行了编辑。将 'step' 更改为整数。

Dart 是一种静态类型安全语言,因此在您的代码 运行 之前,已经对代码进行了分析,以确保不存在静态类型问题。

在您的示例中,您定义了以下变量:

var element = {
  'title': 'Apple and more more thing',
  'category': 'Fruit',
  'description': 'Some data to describe',
  'price': 24.67,
  'bonus': '1% bonus',
  'group': 'Picnik',
  'step': 1.0
};

通过使用 var 你告诉 Dart 它应该自动确定类型。在这种情况下也可以这样做。 Dart 会看到映射中的所有键都是 String 所以我们可以安全地假设键类型是 String.

然后它会查看值并尝试找到所有值都通用的类型。因为我们有 doubleString 作为值,类型必须是 Object 因为如果我们想要一个包含所有值的类型,我们不能更具体。

所以地图的类型会被确定为:Map<String, Object>.

当您在地图上使用 [] 运算符时,它将从此地图定义为 return Object,因为这是我们唯一可以确定的。

但是当你尝试这样做时,这是一个问题:

"${element['price'] * element['step']} c"

由于我们在分析器阶段可以看到我们将在 Object 上调用 * 运算符,因此分析器将停止您的程序并出现类型错误,因为您正在尝试做的是不被视为类型安全。

有多种修复方法,您也可以在其他答案中看到:

类型转换

您可以告诉 Dart“嘿,我知道我在做什么”并强制 Dart 使用特定类型:

"${(element['price'] as double) * (element['step'] as double)} c"

动态

您可以声明您的地图以包含 dynamic 作为值:

var element = <String, dynamic>{
  'title': 'Apple and more more thing',
  'category': 'Fruit',
  'description': 'Some data to describe',
  'price': 24.67,
  'bonus': '1% bonus',
  'group': 'Picnik',
  'step': 1.0
};

这将删除地图中值的所有类型安全性,然后您可以使用来自地图的值做任何您想做的事情,而不必担心分析器的类型问题。但是类型将在运行时进行检查,如果类型错误(如类型转换),可能会使您的应用程序崩溃。

Class解决方案

你真的不应该像现在这样使用 Map。相反,创建一个 class:

void main() {
  var element = Element(
      title: 'Apple and more more thing',
      category: 'Fruit',
      description: 'Some data to describe',
      price: 24.67,
      bonus: '1% bonus',
      group: 'Picnik',
      step: 1.0);

  print("${element.price * element.step} c"); // 24.67 c
}

class Element {
  String title;
  String category;
  String description;
  double price;
  String bonus;
  String group;
  double step;

  Element(
      {this.title,
      this.category,
      this.description,
      this.price,
      this.bonus,
      this.group,
      this.step});
}

通过这样做,您可以确保 Dart 知道每个 属性 的类型并获得类型安全。