如何在 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
.
然后它会查看值并尝试找到所有值都通用的类型。因为我们有 double
和 String
作为值,类型必须是 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 知道每个 属性 的类型并获得类型安全。
"${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
.
然后它会查看值并尝试找到所有值都通用的类型。因为我们有 double
和 String
作为值,类型必须是 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 知道每个 属性 的类型并获得类型安全。