Se agregó la propiedad enabled y se hizo onChanged opcional para DropdownButton
DropdownButton y DropdownButtonFormField ahora admiten una propiedad enabled explícita, y sus callbacks onChanged ya no son obligatorios.
Resumen
#DropdownButton y DropdownButtonFormField ahora incluyen
una propiedad enabled para gestionar explícitamente su estado interactivo,
y el callback onChanged ya no está marcado como required.
Contexto
#Anteriormente, DropdownButton y DropdownButtonFormField no
tenían un parámetro enabled.
La única forma de deshabilitar el dropdown
(atenuándolo y haciéndolo no interactivo) era
pasar null al callback required onChanged.
Esto generaba un código poco intuitivo al intentar
habilitar o deshabilitar dinámicamente el botón,
obligando a los desarrolladores a escribir expresiones condicionales para el propio callback,
como onChanged: condition ? (value) { ... } : null.
Para mejorar esta API, se introdujo una propiedad enabled dedicada,
y se hizo opcional onChanged.
La propiedad enabled es opcional.
Hacerla obligatoria introduciría un cambio disruptivo masivo que
rompería casi todas las implementaciones existentes de DropdownButton en
el ecosistema de Flutter.
En su lugar, para preservar la compatibilidad con versiones anteriores,
si el argumento enabled no se proporciona explícitamente,
el botón determina su estado recurriendo a si se proporciona
onChanged (es decir, está habilitado si onChanged != null,
y deshabilitado si onChanged == null).
El cambio disruptivo menor aquí es estructural:
aunque el antiguo patrón condicional de onChanged técnicamente
sigue funcionando debido a la lógica de respaldo,
se anima a los desarrolladores a migrar a la API más clara
utilizando explícitamente la propiedad enabled.
Guía de migración
#Si anteriormente deshabilitabas tu DropdownButton
pasando condicionalmente null a onChanged,
migra a la nueva propiedad enabled.
Esto separa limpiamente el estado del widget (habilitado/deshabilitado) de
su comportamiento (el callback).
Para migrar automáticamente tu código en casos sencillos
(como pasar null de forma estática), ejecuta el siguiente comando:
dart fix --apply
Caso 1: Dropdown deshabilitado estáticamente
#Para casos sencillos en los que un dropdown está permanentemente deshabilitado,
ahora puedes simplemente omitir onChanged y usar enabled: false.
Código antes de la migración:
final disabledDropdown = DropdownButton<String>(
value: 'Option 1',
items: const [
DropdownMenuItem(value: 'Option 1', child: Text('Option 1')),
],
onChanged: null, // This was the only way to disable it
);
Código después de la migración:
final disabledDropdown = DropdownButton<String>(
value: 'Option 1',
items: const [
DropdownMenuItem(value: 'Option 1', child: Text('Option 1')),
],
onChanged: null, // This was the only way to disable it
enabled: false,
);
Caso 2: Dropdown deshabilitado condicionalmente
#La mejor práctica recomendada es separar el callback del
estado interactivo utilizando directamente la propiedad enabled.
Código antes de la migración:
final conditionalDropdown = DropdownButton<String>(
value: 'Option 1',
items: const [
DropdownMenuItem(value: 'Option 1', child: Text('Option 1')),
],
onChanged: condition ? (value) { ... } : null,
);
Código después de la migración:
final conditionalDropdown = DropdownButton<String>(
value: 'Option 1',
items: const [
DropdownMenuItem(value: 'Option 1', child: Text('Option 1')),
],
onChanged: condition ? (value) { ... } : null,
onChanged: (value) { ... },
enabled: condition,
);
Timeline
#Lanzado en la versión: 3.44.0-1.0.pre-629
En versión estable: Aún no
Referencias
#Documentación de la API:
Issues relevantes:
PRs relevantes:
A menos que se indique lo contrario, la documentación en este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-06-02. Ver código fuente oreportar un problema.