【发布时间】:2021-12-22 14:25:41
【问题描述】:
采用以下非空安全 Dart 代码:
static String appBarShiftTitleString(int fromEpochSeconds) {
String monthWord;
String dayWord;
DateTime dt = DateTime.fromMillisecondsSinceEpoch(fromEpochSeconds * 1000);
switch (dt.month) {
case 1:
monthWord = "Jan";
break;
case 2:
monthWord = "Feb";
break;
case 3:
monthWord = "Mar";
break;
case 4:
monthWord = "Apr";
break;
case 5:
monthWord = "May";
break;
case 6:
monthWord = "Jun";
break;
case 7:
monthWord = "Jul";
break;
case 8:
monthWord = "Aug";
break;
case 9:
monthWord = "Sep";
break;
case 10:
monthWord = "Oct";
break;
case 11:
monthWord = "Nov";
break;
case 12:
monthWord = "Dec";
break;
}
switch (dt.weekday) {
case 1:
dayWord = "Mon";
break;
case 2:
dayWord = "Tue";
break;
case 3:
dayWord = "Wed";
break;
case 4:
dayWord = "Thu";
break;
case 5:
dayWord = "Fri";
break;
case 6:
dayWord = "Sat";
break;
case 7:
dayWord = "Sun";
break;
}
return dayWord + ' ' + monthWord + ' ' + dt.day.toString();
}
Android Studio 说,“必须先分配不可为空的局部变量 'dayWord',然后才能使用它。”
我理解错误并发现我可以像这样简单地修改方法的前两行:
String monthWord = "error!";
String dayWord = "error!";
这样,我满足了语言规则,如果我们达到了变量未被分配的不可能的情况,那将是显而易见的。
虽然这看起来很棘手......所以在这些类型的场景中,将这段代码转换为空安全的优雅和正确的方法是什么,如果有多种方法,那么优缺点是什么?
谢谢!
【问题讨论】:
-
您是如何获得该代码的?你是在一个工作项目中使用 Dart 迁移,还是这是手工制作的?因为如果那是遗留代码,它应该可以正常运行,除非您手动将 pubspec.yaml minsdk 更改为 2.12。
-
这是我自己的旧项目代码。是的,我通过使用最新的 Android Studio+Flutter+Dart 版本创建一个新的样板 Flutter 项目,有效地将 min 更改为 2.12。然后我开始从旧项目中剪切和粘贴。这是故意的——我宁愿遇到错误并修复它们并在此过程中学习,而不是使用迁移工具。
标签: dart dart-null-safety null-safety