我正在观看 The Boring Flutter Development Show,其中其中一集展示了 Bloc 的实现。
现在有这样一段代码,我认为用 Switch 语句替换会更好,你知道,以防将来出现更多情况:
_storiesTypeController.stream.listen((storiesType) {
if (storiesType == StoriesType.newStories) {
_getArticlesAndUpdate(_newIds);
} else {
_getArticlesAndUpdate(_topIds);
}
});
...所以我尝试实现它,但它给了我一些错误,说
switch 表达式的类型“Type”不可分配给 case 表达式的类型“Stories Type”。
所以我想出了这个解决方法:
final storyType = StoriesType.newStories;
_storiesTypeController.stream.listen((storyType) {
switch (storyType) {
case StoriesType.newStories: {
_getArticlesAndUpdate(_newIds);
}
break;
case StoriesType.topStories: {
_getArticlesAndUpdate(_topIds);
}
break;
default: {
print('default');
}
}
});
...一切正常,但我想知道是否有另一种方法可以切换 Enum 以及为什么它说当我在这一行中使用它时,未使用局部变量 StoryType 的值:
_storiesTypeController.stream.listen((storyType)
然后我切换它?
您有一个位于外部作用域中的冗余变量:
final storyType = StoriesType.newStories;
由于
_storiesTypeController.stream.listen
的回调定义了一个名为 storyType
的新变量,因此不使用外部作用域中的变量。final storyType = StoriesType.newStories;
删除后,应该不会有任何警告。
此外,在
switch
语句中不需要花括号。调整后的代码如下所示:
_storiesTypeController.stream.listen((storyType) {
switch (storyType) {
case StoriesType.newStories:
_getArticlesAndUpdate(_newIds);
break;
case StoriesType.topStories:
_getArticlesAndUpdate(_topIds);
break;
default:
print('default');
}
});
您可以在
Dart 语言之旅中找到更多关于
switch
和 case
的信息。
打开枚举很容易,例如:
enum ActivityType {
running,
climbing,
hiking,
cycling,
ski
}
extension ActivityTypeNumber on ActivityType {
int get number {
switch (this) {
case ActivityType.running:
return 1;
case ActivityType.climbing:
return 2;
case ActivityType.hiking:
return 5;
case ActivityType.cycling:
return 7;
case ActivityType.ski:
return 10;
}
}
}
有关枚举以及如何使用其增强版本的更多信息
使用枚举和 switch case 很容易。
enum PaymentStatus { accepted, declined, unauthorized }
这是下面的开关正在工作的枚举
switch (paymentStatus) {
case PaymentStatus.accepted:
postPaymentHandler.handleSuccesFlow();
case PaymentStatus.declined:
postPaymentHandler.handleDeclinedError();
case PaymentStatus.unauthorized:
postPaymentHandler.handleUnauthorizedError();
default:
globalErrorHandler.handleError()
}