我试图使一个功能,检查如果人的用户名是正确的,以什么保存在文件中。
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中是否有什么东西可以让我在输入为字符串的情况下实现这一点?
1条答案
按热度按时间bq3bfh9z1#
有很多错误:
1.你有全局变量
CheckUser
和CheckPass
,但是你的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
,它将自动被类型提升为不可空类型。通常你会这样做:在您的情况下,您可以执行以下操作:
请注意,这并没有解决变量隐藏问题,但我将把它留给读者作为练习。