问题
在 Dart 中判断字符串是否为空,我们可以通过 isEmpty
或 isNotEmpty
来处理。
但是,在Dart中 String
默认值为 null
:
dart version < 2.12:
1 2 3 4
| void main(){ String a; print(a); // null }
|
dart version >= 2.12:
1 2 3 4
| void main(){ String? ss; print(ss); // null }
|
这个时候如果通过 isEmpty
去判断该字符串是否为空时,可能会遇到下面的报错:
The getter ‘isEmpty’ was called on null
相应的解决方法就是通过使用 ?
和 !
来处理:
if message
returns null
. You might want:
1
| if(message?.isEmpty ?? true)
|
不过有时候就会感觉这样处理起来就会很繁琐。
像在 C#
中对于字符串的处理,就有 isNullOrEmpty
的方法来判断字符串是否为 null
或 空字符串
,然而在 Dart
中却没有提供类似于 isNullOrEmpty
的方法,flutter issues 中相关的讨论表示也不会提供:
如何解决
既然官方没有提供,那我们可以自己来实现相应的处理方法来解决。
帮助类或扩展方法
我们可以通过帮助类或者扩展方法来实现。
帮助类不必多说。对于扩展方法,可以参考如下的示例:
扩展:
1 2 3 4 5 6
| extension NumberParsing on String { int parseInt() { return int.parse(this); } // ··· }
|
使用:
1 2 3
| import 'string_apis.dart'; // ··· print('42'.parseInt()); // Use an extension method.
|
完整的实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| void main() { String? ss; print(ss);
print(ss);
print('isNullOrEmpty: ${ss.isNullOrEmpty()}'); print('isNotNullAndEmpty: ${ss.isNotNullAndEmpty()}'); print('getStrValue: ${ss.getStrValue(val: "x")}');
print('-------');
print('StrUtils.isNullOrEmpty: ${StrUtils.isNullOrEmpty(ss)}'); print('StrUtils.isNotNullAndEmpty: ${StrUtils.isNotNullAndEmpty(ss)}'); print('StrUtils.getStrValue: ${StrUtils.getStrValue(ss)}'); }
extension StringExtensions on String? { bool isNullOrEmpty() => this == null || this!.trim().isEmpty;
bool isNotNullAndEmpty() => this != null && this!.trim().isNotEmpty;
String getStrValue({String val = ""}) => this.isNullOrEmpty() ? val : this!; }
class StrUtils { StrUtils._();
static bool isNullOrEmpty(String? s) => s == null || s.trim().isEmpty;
static bool isNotNullAndEmpty(String? s) => s != null && s.trim().isNotEmpty;
static String getStrValue(String? s, {String val = ""}) => isNullOrEmpty(s) ? val : s!; }
|
可以在 DartPad 中查看运行结果:Dart String add isNullOrEmpty
附:Extension methods | Dart
第三方插件
当然,除了自己实现,也可以使用 quiver
插件来解决。
具体可查看:quiver - pub.dev
相应的源码:quiver-dart/strings.dart at master · google/quiver-dart