Skip to content

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:

// old
AnimatedText('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.

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:

// old
AnimatedProp(animation: PropAnimation.fade(), child: Text('Hi'));
const Text('Hello', style: _line).animate([Animation.slideFade()]);

See Animating elements for the full preset menu.

The Stagger widget and StaggerConfig are gone. Pass a stagger: on the animation that plays across the group:

// old
Stagger(config: StaggerConfig(each: 0.1.seconds), children: [...]);
const Column(children: [Text('A'), Text('B')]).animate([
Animation.fadeIn(stagger: const Stagger.each(Time.frames(6))),
]);

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:

// old
EffectOverlay(effects: [ParticleEffect.confetti()], child: card);
const ColoredBox(color: Color(0xFF13131F)).animate([
Animation.grain(0.12),
Animation.vignette(0.4),
]);

See Shaders and effects.

The V-prefixed wrappers (VStack, VColumn, VRow, VCenter, VPadding, VPositioned, VSizedBox) are gone. Use the real Flutter widgets:

// old
VColumn(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.

Raw image use, KenBurnsImage, PhotoCard, and PolaroidFrame collapse into one Image plus Animation.kenBurns and the Frame.* styles:

// old
PolaroidFrame(child: KenBurnsImage.network(url));
Frame.polaroid(
child: Image.network(url, fit: BoxFit.cover).animate([Animation.kenBurns()]),
);

EmbeddedVideo and VideoSequence become one Clip:

// old
EmbeddedVideo.network(url, muted: true);
Clip.network(url, audio: const ClipAudio.muted(), fit: BoxFit.cover);

See Images and video clips.

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.

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.

Loop becomes a repeat: on the animation:

// old
Loop(child: spinner);
const Text('Spinning', style: _line).animate([
Animation.spin(repeat: const Repeat.forever()),
]);

AudioTrack, AudioSource, and BackgroundAudio become Audio.music and Audio.sfx:

// old
BackgroundAudio(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.*:

// old
EncodingConfig(crf: 14);
const Export.mp4(quality: Quality.max);

See Audio and captions and Exporting your video.

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.

  • 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.