如何 运行 函数中的 while 循环正确

how to run a while loop in a function correctly

所以,我正在收集输入并在条件下使用 while 循环(如果用户省略输入说......)我正在使用这个 while 循环在同一代码中收集多个输入所以我决定写一个它带有几个参数的功能,但是在用户跳过输入并稍后输入它之后,它不会注册,输出应该打印 "how are you $input" 但是它只打印 "how are you" 并将输入留空

main() {
  // First name
  print('First name:');
  var name1 = stdin.readLineSync();
  void conds(name, shitbe) {
    while (name.isEmpty) {
      print('Field cannot be empty');
      print(shitbe);
      name = stdin.readLineSync();
    }
  }

  conds(name1, 'First name:');

  print('How are you $name1');

输出应该像

PS C:\tools\Projects> dart playground.dart
First name:

Field cannot be empty 
First name:
John    
How are you John 
PS C:\tools\Projects>

但这是我在第一次遗漏后得到的结果

PS C:\tools\Projects> dart test.dart      
First name:

Field cannot be empty
First name:
John
How are you 
PS C:\tools\Projects> 

Dart 中的所有变量都是对对象的引用。当您将变量作为方法的参数时,变量会被复制,因此我们得到了该引用的副本。

在方法内部,您可以使用此引用做任何您想做的事情,但是如果您更改 reference/variable 指向的对象,调用您的方法的代码将看不到此更改。

因此在 conds() 中,您正在更改 name,这是一个参数,以指向您从用户那里获得的新 String 对象。但是 conds() 的调用者将看不到 name1 变量的变化,因为引用被复制到方法中。

我会亲自将代码重写为这样的方法,其中该方法处理与用户的所有交互,然后 returns String

import 'dart:io';

void main() {
  // First name
  final name = getInput('First name:');
  print('How are you $name');
}

String getInput(String message) {
  print(message);
  var input = stdin.readLineSync();

  while (input == null || input.isEmpty) {
    print('Field cannot be empty');
    print(message);
    input = stdin.readLineSync();
  }

  return input;
}