Cambió la fórmula de resorte subamortiguado
La fórmula para `SpringDescription` cambió para corregir un error anterior, afectando a resortes subamortiguados (relación de amortiguamiento menor que 1).
Resumen
#La fórmula para SpringDescription cambió para corregir un error anterior,
afectando a resortes subamortiguados (relación de amortiguamiento menor que 1)
con valores de masa distintos de 1.
Los resortes creados antes de este cambio pueden mostrar
comportamientos de rebote diferentes después de la actualización.
Contexto
#La clase SpringDescription
describe el comportamiento de resortes amortiguados,
lo que permite que los widgets de Flutter se animen de manera realista según los parámetros proporcionados.
La física de los resortes amortiguados está ampliamente estudiada y documentada. Para una descripción general
del amortiguamiento, consulta Wikipedia: Damping.
Anteriormente, la fórmula de Flutter para calcular el comportamiento de un resorte subamortiguado era
incorrecta, como se reportó en el Issue 163858. Este error afectaba a todos los resortes con
una relación de amortiguamiento menor que 1 y una masa diferente de 1. En consecuencia, las animaciones
no coincidían con la física esperada del mundo real, y el comportamiento alrededor del punto de amortiguamiento crítico
(relación de amortiguamiento exactamente de 1) presentaba discontinuidades.
Específicamente, al usar SpringDescription.withDampingRatio, pequeñas
diferencias, como relaciones de amortiguamiento de 1.0001 frente a 0.9999, daban como resultado
animaciones significativamente diferentes.
El problema se corrigió en el PR Fix SpringSimulation formula for underdamping, que actualizó el cálculo subyacente. Como resultado, las animaciones previamente afectadas ahora se comportan de manera diferente, aunque el framework no reporta errores explícitos.
Guía de migración
#La migración es necesaria solo para resortes con relaciones de amortiguamiento menores que 1 y masas distintas de 1.
Para restaurar el comportamiento de animación anterior, actualiza los parámetros del resorte según corresponda. Puedes calcular los ajustes de parámetros requeridos usando el JSFiddle para migración proporcionado. En las siguientes secciones se incluyen fórmulas y explicaciones detalladas.
Constructor predeterminado
#Si la SpringDescription se construyó con el constructor predeterminado con
masa m, rigidez k y amortiguamiento c,
entonces debe cambiarse con la siguiente fórmula:
new_m = 1
new_c = c * m
new_k = (4 * (k / m) - (c / m)^2 + (c * m)^2) / 4
Código antes de la migración:
const spring = SpringDescription(
mass: 20.0,
stiffness: 10,
damping: 1,
);
Código después de la migración:
const spring = SpringDescription(
mass: 1.0,
stiffness: 100.499375,
damping: 20,
);
Constructor .withDampingRatio
#
Si la SpringDescription se construyó con el constructor .withDampingRatio
con masa m, rigidez k y relación z, primero calcula el amortiguamiento:
c = z * 2 * sqrt(m * k)
Luego aplica la fórmula anterior. Opcionalmente, puedes volver a convertir el resultado a relación de amortiguamiento con:
new_z = new_c / 2 / sqrt(new_m * new_k)
Código antes de la migración:
const spring = SpringDescription.withDampingRatio(
mass: 5.0,
stiffness: 6.0,
damping: 0.03,
);
Código después de la migración:
const spring = SpringDescription.withDampingRatio(
mass: 1,
stiffness: 1.87392,
ratio: 0.60017287468545,
);
Timeline
#Lanzado en la versión: 3.31.0-0.1.pre
En versión estable: 3.32
Referencias
#Documentación de la API:
Issues relevantes:
- Issue 163858, donde se descubrió el error y se puede encontrar más contexto.
PRs relevantes:
Herramienta:
A menos que se indique lo contrario, la documentación de este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-05-05. Ver código fuente oreportar un problema.