我如何转换为双 .dart

问题描述

这段代码有问题,这段代码无法执行。代码如下:

import 'dart:io';

main() {
  print("CALculaTOR");

  stdout.write("Number a: ");
  double a = double.parse(stdin.readLinesync());
  stdout.write("Number b: ");
  double b = double.parse(stdin.readLinesync());

  double result;

  // operator +
  result = a + b;
  print("$a + $b = $result");

  // operator -
  result = a - b;
  print("$a - $b = $result");

  // operator *
  result = a * b;
  print("$a * $b = $hasil");

  // operator /
  result = a / b;
  print("$a / $b = $result");

  // operator %
  result = a % b;
  print("$a % $b = $result");

}

这是我的问题:

myLearning/myNote/test.dart:7:33: Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
double a = double.parse(stdin.readLinesync());
                            ^
myLearning/myNote/test.dart:9:33: Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
double b = double.parse(stdin.readLinesync());

我只想输入一个数字,结果是这样的:

CALculaTOR
Number a : 9
Number b : 2
9.0 + 2.0 = 11.0
9.0 - 2.0 = 7.0
9.0 * 2.0 = 18.0
9.0 / 2.0 = 4.5
9.0 % 2.0 = 1.0

我可以像上面那样输入吗?

解决方法

您的“问题”是您使用的是 Dart 2.12 的测试版,它启用了不可为空的功能。此功能将帮助您确保您了解可能发生空值的所有情况。在您的情况下,它是对 stdin.readLineSync() 的调用:

如果输入结束之前没有字节,则返回 null。

您收到错误,因为 double.parseString 作为参数,但 stdin.readLineSync() 返回 String?,它是一种可以是 Stringnull(其中 String 只允许 String,永远不能是 null)。

简单的解决方法是执行以下操作并在 ! 之后插入 readLineSync()

import 'dart:io';

void main() {
  print("CALCULATOR");

  stdout.write("Number a: ");
  double a = double.parse(stdin.readLineSync()!);
  stdout.write("Number b: ");
  double b = double.parse(stdin.readLineSync()!);

  double result;

  // operator +
  result = a + b;
  print("$a + $b = $result");

  // operator -
  result = a - b;
  print("$a - $b = $result");

  // operator *
  result = a * b;
  print("$a * $b = $result");

  // operator /
  result = a / b;
  print("$a / $b = $result");

  // operator %
  result = a % b;
  print("$a % $b = $result");
}

通过执行 !,您告诉 Dart 您确定该值不为 null,并且分析器应该只接受该值,就好像它永远不会是 null 一样。

在运行时,如果 null 的返回值为 stdin.readLineSync(),Dart 将添加对 null 的运行时检查并导致程序崩溃(带有 NullPointerException)。但是由于我们正在开发一个小示例程序,所以这完全没问题。

您可以在此处阅读有关默认非空值 (NNBD) 的更多信息:https://dart.dev/null-safety