如何在dart中安全地展开可选变量?

如何在dart中安全地展开可选变量?,dart,Dart,我找不到一种方法可以像在swift中那样安全地打开可选变量 var myString: String? if let myString = myString { print(myString) // myString is a string } 还是在科特林 var myString: String? if (myString != null) { print(myString) // myString is not null } // or myString?.let {

我找不到一种方法可以像在swift中那样安全地打开可选变量

var myString: String?
if let myString = myString {
  print(myString) // myString is a string
}
还是在科特林

var myString: String?
if (myString != null) {
   print(myString) // myString is not null
}

// or
myString?.let {
   print(it) // myString is not null
}
在Dart中,我必须执行以下操作,这看起来不太好:

String? myString;
if (myString != null) {
   print(myString); // myString still an optional
   print(myString!); // myString is now a String! (because of the force unwrap)
}

是否有一种方法可以像其他空安全语言一样以干净的方式安全地展开?或者我们必须总是在空检查后强制展开变量?

您的Dart示例似乎不完整,但如果没有更多上下文,很难说出什么是错误的。如果
myString
是一个本地变量,它将被提升。您可以看到以下示例:

void main(){
  myMethod(null); // NULL VALUE
  myMethod('Some text'); // Non-null value: Some text
}

void myMethod(String? string) {
  if (string != null) {
    printWithoutNull(string);
  } else {
    print('NULL VALUE');
  }
}

// Method which does not allow null as input
void printWithoutNull(String string) => print('Non-null value: $string');
如果我们讨论的是类变量,则情况就不同了。您可以在此处看到有关该问题的更多信息:

该问题的解决方案是将类变量复制到方法中的局部变量中,然后使用空检查提升局部变量


一般来说,我建议您阅读Dart官方网站上有关空安全性的文章:

您确定您制作的Dart示例吗?您是如何确定Dart在您的
if
之后仍然将
myString
视为可为空的?@julemand101我的意思是,即使我们知道它不是可选字符串,分析器仍然将其视为可选字符串。谢谢!是的,我真正的问题是类变量,我将查看该帖子!