这是我的代码,除了空字符串、null和false之外,其他都为true:
if (routeinfo["no_route"] == "" || routeinfo["no_route"] == null || routeinfo["no_route"] == false) {
// do sth ...
}
这是我的代码,除了空字符串、null、false或zero之外,其他都为true:
if (routeinfo["no_route"] == "" || routeinfo["no_route"] == null || routeinfo["no_route"] == false || routeinfo["no_route"] == 0) {
// do sth...
}
我怎样才能用 dart 把它写得更短呢?还是不可能?
9条答案
按热度按时间kkih6yb81#
如果您的要求只是空的或null(就像我在搜索结果中看到这个标题时一样),您可以使用Dart的安全导航操作符使它更简洁一些:
地点
isEmpty
检查空字符串,但如果routeinfo是null
,则不能对null调用isEmpty,因此我们使用以下语句检查null?.
safe navigation operator,它只在对象不为空时调用isEmpty,否则生成null。??
null coalescing operator的一个或多个如果你的map是一个可以为空的类型,那么你必须安全地导航:
型
ct2axkht2#
你可以
uidvcgyl3#
2020年末更新
总结
isNull
和isNotNull
之外,这个答案是正确的,当Null Safety
将来在dart/flutter中引入时,它们不再提供类型提升。isNullOrEmpty
)不提供类型提升,因为与callsite相比,它们位于不同的(子)作用域中。isNull
和isNotNull
,但保留其他助手,因为你不应该期望他们为你做类型提升。解释
Null Safety
终于在Dart/Flutter中推出了,但截至2020年10月,该功能仍然不适用于Dart/Flutter上的稳定版本,请查看Null Safety快速指南或全面的Understanding Null Safety。演示
下面演示了为什么
isNull
(== null
)和isNotNull
(!= null
)的封装/helper-getter是一个非常大的问题:当您使用的dart版本中包含“Null Safety”时,上述代码中的类型提升有效!
上面的方法不起作用,因为空校验
== null
和!= null
封装在子作用域(不同的堆栈帧)中,并且在definitelyInt
作用域中不被推断为具有这种“提升”效果。2020年初更新
下面是一个修改后的版本,它使用getters代替了示例/类方法,并覆盖了空格、isNull和isNotNull。
第二次更新
现在它也可以解释空列表和Map了!
第三次更新
为安全性和模块化/可维护性添加了私有getter。
第四次更新
更新了答案以修复
Map
的一个特定问题,当为空时无法正确处理!因为Map
不是Iterable
。通过引入_isMapObjectEmpty
U解决了此问题溶液
假设
这假定Dart 2.7或更高版本支持Extension Methods。
用法
以上是两个扩展类。一个用于
Object
,另一个用于String
。将它们分别/一起放在一个文件中,并在callsite文件中导入文件/file。描述
来自Swift,我倾向于使用像user @Benjamin Menrad的answer这样的扩展,但在适用的情况下使用getter而不是方法/函数--镜像Dart的计算属性,如
String.isEmpty
。来自C#,我喜欢他们的字符串的助手方法IsNullOrWhiteSpace。
我的版本融合了上述两个概念。
命名
你可以随意重命名扩展类,我倾向于这样命名它们:
XY延伸导线
其中:
*X是文件/作者/应用程序/唯一名称。
*Y是正在扩展的类型的名称。
名称示例:
MyAppIntExtension
DartDoubleExtension
TextUtilsStringExtension
OHProviderExtension
批评
为什么使用私有getter而不是简单的
this == null || this == '' || this == [] || this == 0 || !this
iibxawm44#
我会编写一个帮助函数,而不是内联所有内容。
这避免了重复查找(如
contains
操作),但可读性更强,而且不会为每次检查创建新的List
文本(使列表常量化可以解决这个问题)。当你在努力使某个函数简短易读时,创建一个名字恰当的helper函数通常是最好的解决方案。
(补充:既然Dart有了扩展方法,就可以将功能添加为对象上的方法或getter,这样就可以直接编写
value.isNullOrEmpty
)。nwlqm0z15#
由于来自Android和Kotlin,我更喜欢扩展方法而不是静态助手方法。现在在Dart 2.7中,你也可以使用扩展方法:
现在,您可以从代码中的任何位置调用这些方法:
您可能需要手动导入dart类,在其中放置扩展方法,例如:
wljmcqd86#
具有零安全性:
比如说,你有一个可以为空的
Map
和一个List
,其中有可以为空的值。要检查集合是否既不为
null
也不为空,可以执行以下操作:kx1ctssn7#
对于字符串,我喜欢这种方法:
感谢本软件包的作者:https://pub.dev/packages/string_ext
csga3l588#
使用这种方法
fhity93d9#
package:quiver
具有isEmpty
函数,如果参数为null
或空字符串,则该函数返回true
。自己实现这样的函数也很简单。