Saltar al contenido principal

Adición de 'linux' y 'windows' al enum TargetPlatform

Se añadieron dos nuevos valores al enum TargetPlatform que podrían requerir casos adicionales en las sentencias switch que evalúan un TargetPlatform.

Resumen

#

Se añadieron dos nuevos valores al enum TargetPlatform que podrían requerir casos adicionales en las sentencias switch que evalúan un TargetPlatform y no incluyen un caso default:.

Contexto

#

Antes de este cambio, el enum TargetPlatform solo contenía cuatro valores y estaba definido de esta manera:

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

Una sentencia switch solo necesitaba manejar estos casos, y las aplicaciones de escritorio que querían ejecutarse en Linux o Windows generalmente tenían una prueba como esta en su método main():

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

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

Descripción del cambio

#

El enum TargetPlatform ahora está definido como:

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

Y la configuración de prueba de plataforma debugDefaultTargetPlatformOverride en main() ya no es necesaria en Linux y Windows.

Esto puede hacer que el analizador de Dart muestre la advertencia missing_enum_constant_in_switch para las sentencias switch que no incluyan un caso default. Escribir un switch sin un caso default: es la forma recomendada de manejar enums, ya que el analizador puede ayudarte a encontrar cualquier caso que no esté manejado.

Guía de migración

#

Para migrar al nuevo enum y evitar el error missing_enum_constant_in_switch del analizador, que se ve así:

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

o:

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

Modifica tu código de la siguiente manera:

Código antes de la migración:

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;
  }
}

Código después de la migración:

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;
  }
}

No se recomienda tener casos default: en estas sentencias switch, porque de lo contrario el analizador no podrá ayudarte a encontrar todos los casos que deben ser manejados.

Además, cualquier prueba como la mencionada anteriormente que configure debugDefaultTargetPlatformOverride ya no es necesaria para aplicaciones de Linux y Windows.

Timeline

#

Introducido en la versión: 1.15.4
En la versión estable: 1.17

Referencias

#

Documentación de la API:

Issues relevantes:

PR relevante: