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 无关,而是与您的程序逻辑以及您的编写方式有关。