flutter 相当于Dart中Swift的if let和guard let

8oomwypt  于 2023-04-22  发布在  Flutter
关注(0)|答案(5)|浏览(155)

刚刚开始Flutter与原生iOS背景,所以我只是有一个关于Dart beta null安全的快速问题。
所以在Swift中,因为他们从一开始就有null安全的想法,就像Kotlin一样,有两个我非常喜欢的语言特性是if letguard let。这两个特性使得使用可选值变得更加容易。我不确定Dart的beta版本是否有类似的东西。
谢谢

2sbarzqh

2sbarzqh1#

我不是Swift的Maven,但Dart会使用null检查来自动提升类型,我认为这主要是做if letguard let的工作。
例如:

String? x = possiblyReturnsNull();
if (x != null) {
  // All code within this block treats `x` as non-nullable.
}
// All code outside the block continues to treat `x` as nullable.

注意that promotion won't be performed on non-local variables,所以对于那些你需要显式引入一个本地引用的对象(There is a language proposal提供了一个机制,允许一个更好的机制来添加一个本地引用,而不会污染外部作用域)。

pprl5pva

pprl5pva2#

我也要加入进来,因为我也来自Swift,并且喜欢使用很多守卫。加上@jamesdlin所说的,相反的情况也是如此。
所以你可以使用Swift的guard语句:

String? x = possiblyReturnsNull();
if (x == null) return whatever; // This works like Swift's guard
// All code outside the block now treats `x` as NON-nullable.
d4so4syb

d4so4syb3#

对公认答案的一个小扩展是Flutter还允许强制解包Optional。因此,如果您访问的是非nil值,而不是保存在变量中,如字典中,则需要在if语句中解包它:

if (someDict[someKey] != null) {
  print(someDict[someKey]!)
}
//
vxbzzdmp

vxbzzdmp4#

Flutter 3.x
一种快速的处理方法是在String?上扩展一个检查null和空

extension NullEmptyCheck on String? {
  bool notNullOrEmpty() => (this != null && this!.isNotEmpty);
}

由于null检查是第一个发生的,所以强制打开第二个this是安全的
使用方法:

if (myOptionalStr.notNullOrEmpty()) {
  // value is safe to force unwrap
  print(myOptionalStr!);
}

如果您只是想用值或空String来展开可选的,那么您可以这样做

extension Unwrapped on String? {
  String unwrapped() => this != null ? this! : '';
}

这将返回未 Package 的值或空的String
两者都可以设置为泛型,不过需要为后者传递一个默认值,以确保在所有情况下都能正常工作

ffx8fchx

ffx8fchx5#

检查Dart中的null安全性:

value ?? 0

相关问题