flutter 和 Dart 中的空安全
Null safety in flutter and Dart
class CalculatorBrain {
final int height;
final int weight;
double _bmi;
CalculatorBrain({required this.height, required this.weight});
String calculateBMI() {
double _bmi = weight / pow(height / 100, 2);
return _bmi.toStringAsFixed(2);
}
String getResult() {
if (_bmi >= 25) {
return "OverWeight";
} else if (_bmi > 18.5 && _bmi < 25) {
return "Normal";
} else {
return "UnderWeight";
}
}
}
我尝试添加 late 关键字并使用了 double ? _bmi 但其中 none 有效。
从以下函数中删除双关键字:
String calculateBMI() {
double _bmi = weight / pow(height / 100, 2);
...
并将您的 class 属性 double _bmi
更改为 late double _bmi
这个有效:
class CalculatorBrain {
final int height;
final int weight;
late double _bmi;
CalculatorBrain({required this.height, required this.weight});
String calculateBMI() {
_bmi = weight / ((height / 100) * (height / 100));
return _bmi.toStringAsFixed(2);
}
String getResult() {
if (_bmi >= 25) {
return "OverWeight";
} else if (_bmi > 18.5 && _bmi <25) {
return "Normal";
}
else {
return "UnderWeight";
}
}
}
void main() {
final brain = CalculatorBrain(height: 180, weight: 80);
brain.calculateBMI();
print(brain.getResult());
}
然而,这是可怕的 class 设计。我会假设这是一个学校练习,你没有把它发展成一个专业人士。
稍微好一点的 class 设计,它不依赖 late
变量来隐藏这样一个事实,即涉及一些不为人知的秘密,其中 class 仅在程序员的情况下才有效知道必须调用函数的魔法顺序:
class BodyMassIndex {
final int height;
final int weight;
final double value;
BodyMassIndex({required this.height, required this.weight})
: value = (weight / ((height / 100) * (height / 100)));
String get meaning {
if (value >= 25) {
return "OverWeight";
} else if (value > 18.5 && value <25) {
return "Normal";
}
else {
return "UnderWeight";
}
}
}
void main() {
final bmi = BodyMassIndex(height: 180, weight: 80);
print("value: ${bmi.value}");
print("meaning: ${bmi.meaning}");
}
作为准则,null-safety 取决于您明确告诉编译器它们应该做什么。如果你的编译器不能理解你,那可能意味着你没有很好地解释它,也就是“编程”。因此,如果您遇到 null 安全性方面的问题,那实际上与 null-safety 无关,而是与您的程序逻辑以及您的编写方式有关。
class CalculatorBrain {
final int height;
final int weight;
double _bmi;
CalculatorBrain({required this.height, required this.weight});
String calculateBMI() {
double _bmi = weight / pow(height / 100, 2);
return _bmi.toStringAsFixed(2);
}
String getResult() {
if (_bmi >= 25) {
return "OverWeight";
} else if (_bmi > 18.5 && _bmi < 25) {
return "Normal";
} else {
return "UnderWeight";
}
}
}
我尝试添加 late 关键字并使用了 double ? _bmi 但其中 none 有效。
从以下函数中删除双关键字:
String calculateBMI() {
double _bmi = weight / pow(height / 100, 2);
...
并将您的 class 属性 double _bmi
更改为 late double _bmi
这个有效:
class CalculatorBrain {
final int height;
final int weight;
late double _bmi;
CalculatorBrain({required this.height, required this.weight});
String calculateBMI() {
_bmi = weight / ((height / 100) * (height / 100));
return _bmi.toStringAsFixed(2);
}
String getResult() {
if (_bmi >= 25) {
return "OverWeight";
} else if (_bmi > 18.5 && _bmi <25) {
return "Normal";
}
else {
return "UnderWeight";
}
}
}
void main() {
final brain = CalculatorBrain(height: 180, weight: 80);
brain.calculateBMI();
print(brain.getResult());
}
然而,这是可怕的 class 设计。我会假设这是一个学校练习,你没有把它发展成一个专业人士。
稍微好一点的 class 设计,它不依赖 late
变量来隐藏这样一个事实,即涉及一些不为人知的秘密,其中 class 仅在程序员的情况下才有效知道必须调用函数的魔法顺序:
class BodyMassIndex {
final int height;
final int weight;
final double value;
BodyMassIndex({required this.height, required this.weight})
: value = (weight / ((height / 100) * (height / 100)));
String get meaning {
if (value >= 25) {
return "OverWeight";
} else if (value > 18.5 && value <25) {
return "Normal";
}
else {
return "UnderWeight";
}
}
}
void main() {
final bmi = BodyMassIndex(height: 180, weight: 80);
print("value: ${bmi.value}");
print("meaning: ${bmi.meaning}");
}
作为准则,null-safety 取决于您明确告诉编译器它们应该做什么。如果你的编译器不能理解你,那可能意味着你没有很好地解释它,也就是“编程”。因此,如果您遇到 null 安全性方面的问题,那实际上与 null-safety 无关,而是与您的程序逻辑以及您的编写方式有关。