Migration
Fluvie used to spread motion, effects, and layout across many widgets. The v1
surface consolidates them. There is now one motion type (Animation), one
attachment (.animate([...])), and plain Flutter layout. This page maps each
old name to its replacement.
Most renames are mechanical. Here is the most common one, an animated text line, before and after:
// oldAnimatedText('Hello', animation: EntryAnimation.slideFade());const Text('Hello', style: _line).animate([Animation.slideFade()]);The deprecated_member lint flags the old names in your code and offers a
quick-fix for each rename below. The rest of this page is one section per row of
the consolidation map.
Animations become one type
Section titled “Animations become one type”The old motion widgets (PropAnimation, EntryAnimation, AmbientAnimation,
SlideIn, and a scene transition used as an animation) are now Animation.*
presets, or Animation.from / Animation.to / Animation.keyframes for custom
motion.
AnimatedProp becomes the .animate([...]) extension on any widget:
// oldAnimatedProp(animation: PropAnimation.fade(), child: Text('Hi'));const Text('Hello', style: _line).animate([Animation.slideFade()]);See Animating elements for the full preset menu.
Stagger moves onto the animation
Section titled “Stagger moves onto the animation”The Stagger widget and StaggerConfig are gone. Pass a stagger: on the
animation that plays across the group:
// oldStagger(config: StaggerConfig(each: 0.1.seconds), children: [...]);const Column(children: [Text('A'), Text('B')]).animate([ Animation.fadeIn(stagger: const Stagger.each(Time.frames(6))),]);Effects join the animate list
Section titled “Effects join the animate list”EffectOverlay, ParticleEffect, MaskedClip, and ParallaxLayer are gone.
The pixel post-effects (grain, vignette, particles, shader, maskWipe,
and the rest) sit in the same .animate([...]) list as everything else:
// oldEffectOverlay(effects: [ParticleEffect.confetti()], child: card);const ColoredBox(color: Color(0xFF13131F)).animate([ Animation.grain(0.12), Animation.vignette(0.4),]);See Shaders and effects.
Layout is plain Flutter
Section titled “Layout is plain Flutter”The V-prefixed wrappers (VStack, VColumn, VRow, VCenter, VPadding,
VPositioned, VSizedBox) are gone. Use the real Flutter widgets:
// oldVColumn(children: [VCenter(child: text)]);const Column( children: [ Text('Plain Flutter', style: _line), Text('Row, Column, Stack, Center', style: _line), ],);LayerStack, Layer, and VideoTimingMixin had no public replacement; their
job is now the internal TimeScope. See Layouts.
Images, clips, and frames
Section titled “Images, clips, and frames”Raw image use, KenBurnsImage, PhotoCard, and PolaroidFrame collapse into
one Image plus Animation.kenBurns and the Frame.* styles:
// oldPolaroidFrame(child: KenBurnsImage.network(url));Frame.polaroid( child: Image.network(url, fit: BoxFit.cover).animate([Animation.kenBurns()]),);EmbeddedVideo and VideoSequence become one Clip:
// oldEmbeddedVideo.network(url, muted: true);Clip.network(url, audio: const ClipAudio.muted(), fit: BoxFit.cover);Text and counters
Section titled “Text and counters”AnimatedText, FadeText, Fade, and FadeContainer become a plain Text
plus .animate(). TypewriterText becomes Typewriter. CounterText and
DataDrivenText become Counter. FloatingElement becomes Animation.float.
See Text and typography.
Charts, cards, and the camera
Section titled “Charts, cards, and the camera”AnimatedChart becomes Chart. StatCard and Collage are no longer core
widgets; they are recipes you compose from the public API (the built-in
templates show how). CameraFocus moves onto the scene as
Scene(camera: Camera.*). See Charts and data.
Repeat, audio, and export
Section titled “Repeat, audio, and export”Loop becomes a repeat: on the animation:
// oldLoop(child: spinner);const Text('Spinning', style: _line).animate([ Animation.spin(repeat: const Repeat.forever()),]);AudioTrack, AudioSource, and BackgroundAudio become Audio.music and
Audio.sfx:
// oldBackgroundAudio(AudioTrack.asset(path));Audio.music(path, fadeOut: const Time.seconds(0.5)),AudioReactive, BpmDetector, and FrequencyAnalyzer become Trigger.beat()
plus the reactive presets (Animation.pulse(on: AudioBand.bass) and
Animation.scaleY). EncodingConfig becomes Export.*:
// oldEncodingConfig(crf: 14);const Export.mp4(quality: Quality.max);See Audio and captions and Exporting your video.
Anchors are internal now
Section titled “Anchors are internal now”SyncAnchor and SyncAnchorRegistry are gone from the public surface. They
power Trigger and Anchor from the inside. Name a moment with an Anchor and
react to it with a Trigger. See Timing and triggers.
Where to next
Section titled “Where to next”- Animating elements: the one motion list that most renames lead to.
- Cheatsheet: the full v1 surface on one page.
- FAQ: the questions a new user asks first.