Tengo un problema en este código, este código no se puede ejecutar. Aquí está el código:

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");

}

Este es mi problema:

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());

Solo quiero que si ingreso un número, el resultado será así:

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

¿Puedo obtener información como la de arriba?

-1
Kisah Tegar 20 ene. 2021 a las 17:28

1 respuesta

La mejor respuesta

Su "problema" es que está utilizando una versión beta de Dart 2.12 que habilita la función no anulable. Esta función le ayudará a asegurarse de conocer todas las situaciones en las que puede producirse un valor nulo. En su caso, es la llamada a stdin.readLineSync():

Devuelve nulo si ningún byte precedió al final de la entrada.

Recibes un error porque double.parse toma un String como argumento pero stdin.readLineSync() están devolviendo String? que son un tipo que puede ser String o {{X5 }} (donde String solo permite String y nunca puede ser null).

La solución fácil es hacer lo siguiente e insertar ! después de 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");
}

Al hacer !, le está diciendo a Dart que está seguro de que el valor no es nulo y que el analizador debería aceptar el valor como si nunca fuera null.

En tiempo de ejecución, Dart agregará una verificación de tiempo de ejecución para null y bloqueará el programa (con una NullPointerException) si el valor devuelto de stdin.readLineSync() es null. Pero como estamos trabajando en un pequeño programa de ejemplo, esto está bien.

Puede leer más sobre no nulo por defecto (NNBD) aquí: https://dart.dev/null-safety

0
julemand101 20 ene. 2021 a las 17:21