void 函数不打印,因为不能 return 值,但是当我创建 string 或 int 函数时,它会在末尾自动打印 null 或 return 值

void function not printing because cant return value but when i make string or int function it print null or return value at the end automatically

dart 新手,以下面的代码为例,//void 函数不起作用并且 int/string 函数要么打印 returns null 要么自动打印值 return从输出中可以看出。

class Microphones{
  String? name;
  String? color;
  int? model;
  String printEverything(){
    print(name);
    return " "; 
  }
  int? printint(){ 
    print(model); 
}
}

void main() {
  var mic1=Microphones();
  print(mic1.name);
  mic1.name="Yeti";
  mic1.color="black";
  mic1.model=26;

  print(mic1.name);
  print(mic1.color);
  print(mic1.model);
  print(mic1.printEverything());
  print(mic1.printint());
}

output:
null
Yeti
black
26
Yeti
 
26
null

我非常感谢你在这方面的 replies/help。

如果您没有 returning 任何东西(通过在指定给 return 的方法中有一个空的 return void 或在方法 returning void 或可空类型(如 int?)中根本没有任何 return)。

但是方法签名中的return-type指定了方法的调用者应该如何看到这个值。这里我们有 void,在 Dart 语言教程中被描述为:

A special type that indicates a value that’s never used.

https://dart.dev/guides/language/language-tour#a-basic-dart-program

因此我们指定 void 来向我们方法的用户发出信号,即永远不应使用 returned 值。然后 Dart 分析器和编译器将非常努力地确保您最终不会使用 returned 值类型 void.

好奇的高级部分

但这并不意味着不可能使用方法签名指定为 void 的 returned 值:

void someMethod() {
  void someVoidVariable = 'Hey, I am a String!';
  return someVoidVariable;
}

void someOtherMethod() => 'Hey, I am also a String!';

void main() {
  print(someMethod() as String); // Hey, I am a String!
  print(someOtherMethod() as String); // Hey, I am also a String!
}

在第一个示例中,我们强制 Dart 将我们的 String 视为 void。这完全没问题,因为所有类型都可以看作 void。然后我们可以 return 这个 void 值,因为 someMethod() 假设 return void.

这种强制的原因是 Dart 会抱怨(这是有道理的,因为我们正在做的事情非常愚蠢,不应该在真正的程序中):

void someMethod() {
  return 'Hey, I am a String!';
  // ERROR: A value of type 'String' can't be returned from the function 
  // 'someMethod' because it has a return type of 'void'.
}

或者这是因为我们无法使用 as 转换为 void:

void someMethod() {
  return 'Hey, I am a String!' as void; // ERROR: Expected a type name.
}

然后我们将 void 转换回 String 让 Dart 允许我们在 print() 中使用 returned 值(因为 Dart 否则会阻止我们避免尝试使用 void 键入的值)。

在第二个示例中,我展示了事情之所以如此运作的原因之一。在 Dart 中,我们可以编写这两个方法,它们将执行完全相同的操作(请注意,在本例中,我将 return 类型更改为 String):

String someOtherMethod() {
  return 'Hey, I am also a String!';
}

String someOtherMethod() => 'Hey, I am also a String!';

所以第二种方式是 shorthand 如果我们只想执行一个语句并且 return 它的值。

但是:

void someOtherMethod() => 'Hey, I am also a String!';

如果我们遵循传统规则,这是不允许的,因为我们不能 return a String 因为我们已经输入了 void。但有时,我们也想使用这种简单的语法来执行一个方法,而不想关心该方法最终会发生什么 returning.

例如这个:

final someList = <String>[];
void removeStringFromList(String string) => someList.remove(string);

List 上的 remove 方法实际上是 returning 一个 bool,它指示元素是否在列表中。

所以当我们使用 => 时 Dart 忽略了这个问题,在这种情况下只是将结果转换为 void。所以在我们最后的例子中,returned bool 实际上是 returned 到 removeStringFromList 的调用者,但是因为它的类型已经被转换为 void,所以removeStringFromList 的调用者被阻止(在很多方面)使用该值。