跳至主要内容

在 TargetPlatform 枚举中添加“linux”和“windows”

摘要

#

TargetPlatform 枚举中添加了两个新值,这可能需要在根据 TargetPlatform 进行切换且不包含 default: 情况的 switch 语句中添加额外的 case。

上下文

#

在此更改之前,TargetPlatform 枚举仅包含四个值,定义如下:

dart
enum TargetPlatform {
  android,
  fuchsia,
  iOS,
  macOS,
}

一个 switch 语句只需要处理这些情况,并且想要在 Linux 或 Windows 上运行的桌面应用程序通常在其 main() 方法中具有如下测试:

dart
// Sets a platform override for desktop to avoid exceptions. See
// https://docs.flutterdart.cn/desktop#target-platform-override for more info.
void _enablePlatformOverrideForDesktop() {
  if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) {
    debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  }
}

void main() {
  _enablePlatformOverrideForDesktop();
  runApp(MyApp());
}

更改说明

#

TargetPlatform 枚举现在定义为:

dart
enum TargetPlatform {
  android,
  fuchsia,
  iOS,
  linux, // new value
  macOS,
  windows, // new value
}

并且在 Linux 和 Windows 上不再需要 main() 中的平台测试设置 debugDefaultTargetPlatformOverride

这可能导致 Dart 分析器针对不包含 default 情况的 switch 语句发出 missing_enum_constant_in_switch 警告。编写不带 default: 情况的 switch 是处理枚举的推荐方法,因为分析器可以帮助您找到任何未处理的情况。

迁移指南

#

为了迁移到新的枚举并避免分析器的 missing_enum_constant_in_switch 错误(如下所示):

warning: Missing case clause for 'linux'. (missing_enum_constant_in_switch at [package] path/to/file.dart:111)

warning: Missing case clause for 'windows'. (missing_enum_constant_in_switch at [package] path/to/file.dart:111)

请按如下方式修改您的代码:

迁移前的代码

dart
void dance(TargetPlatform platform) {
  switch (platform) {
    case TargetPlatform.android:
      // Do Android dance.
      break;
    case TargetPlatform.fuchsia:
      // Do Fuchsia dance.
      break;
    case TargetPlatform.iOS:
      // Do iOS dance.
      break;
    case TargetPlatform.macOS:
      // Do macOS dance.
      break;
  }
}

迁移后的代码

dart
void dance(TargetPlatform platform) {
  switch (platform) {
    case TargetPlatform.android:
      // Do Android dance.
      break;
    case TargetPlatform.fuchsia:
      // Do Fuchsia dance.
      break;
    case TargetPlatform.iOS:
      // Do iOS dance.
      break;
    case TargetPlatform.linux: // new case
      // Do Linux dance.
      break;
    case TargetPlatform.macOS:
      // Do macOS dance.
      break;
    case TargetPlatform.windows: // new case
      // Do Windows dance.
      break;
  }
}

在这样的 switch 语句中使用 default: 情况是不推荐的,因为这样分析器就无法帮助您找到所有需要处理的情况。

此外,上面提到的任何设置 debugDefaultTargetPlatformOverride 的测试对于 Linux 和 Windows 应用程序来说都不再需要。

时间线

#

包含在版本中:1.15.4
稳定版本:1.17

参考

#

API 文档

相关问题

相关 PR