如何在dart CheckUser = stdin.readLineSync()中更新String用户输入;在while循环期间

lpwwtiir  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(153)

我试图使一个功能,检查如果人的用户名是正确的,以什么保存在文件中。

import 'dart:io';

 var Username = "Marcus";
 var Password = "Fenix";

 String CheckUser = "";
 String CheckPass = "";

void main() {

 print("Hello! please enter your username:\n");
 String? CheckUser = stdin.readLineSync();

 print("Please enter your password:\n");
 String? CheckPass = stdin.readLineSync();

 UserCheck();
 PassCheck();


}

void UserCheck() {
while (CheckUser != Username){

print("The username you provided is incorrect. Please type the username again.\n");
CheckUser = stdin.readLineSync();
  }

}

错误是当程序要求正确的用户名时,它会卡在循环中,并且不会将CheckUser更新为正确的用户名以退出循环。我把绳子拿出来了?' for the while循环,以便它会更新变量,但现在有一个错误,说“A value of type 'String?“”不能分配给“String”类型的变量。尝试更改变量的类型,或将右侧类型强制转换为“String”。
我已经用另一个程序做了类似的事情,但用户输入要求一个整数:

int? Variable = int.parse(stdin.readLineSync()!);

通过移除'int?'在while循环中,变量能够正确更新并退出循环。
dart中是否有什么东西可以让我在输入为字符串的情况下实现这一点?

bq3bfh9z

bq3bfh9z1#

有很多错误:
1.你有全局变量CheckUserCheckPass,但是你的main函数有同名的局部变量。局部变量shadow全局变量。因此,main设置局部变量,而不是全局变量,最终什么也不做,因为UserCheck函数(可能还有PassCheck函数,没有显示)检查全局版本的值。
1.在UserCheck函数中,CheckUser = stdin.readLineSync();不能工作,因为stdin.readLineSync()返回String?,但全局CheckUser被声明为不可空的String
1.基本上正确使用stdin.readLineSync()的方法是检查它是否返回null。这就是为什么它返回一个可空类型!stdin.readLineSync()返回null,如果它达到EOF(没有其他输入)。如果你检查一个局部变量是否是null,如果它不是null,它将自动被类型提升为不可空类型。通常你会这样做:

var line = stdin.readLineSync();
if (line != null) {
  // Do something with the `line` value.
}

在您的情况下,您可以执行以下操作:

void UserCheck() {
  while (CheckUser != Username){
    print("The username you provided is incorrect. Please type the username again.\n");
    var line = stdin.readLineSync();
    if (line == null) {
      exit(1);
    }
    CheckUser = line;
  }
}

请注意,这并没有解决变量隐藏问题,但我将把它留给读者作为练习。

相关问题