FlutterMotion
Build videos with Flutter — use any widget as motion graphics.
Role · Solo
Authoring
Flutter widgets
Preview
Instant
FlutterMotion lets you use any Flutter widget as a motion graphic, preview it instantly, and render it anywhere.
class ProductPromo extends StatelessWidget {
@override
Widget build(BuildContext context) {
final frame = Video.frame(context);
return Stack(children: [
ProductCard(product: product), // your app's own widget
// ...
]);
}
}
Why the widget matters
The line that matters in that snippet is the comment: your app's own widget.
Every promo video for a mobile app is a re-creation of the app's UI inside a video tool — rebuilt by hand in After Effects, and wrong the moment the real UI changes. If the video composes the actual widgets from the actual codebase, the promo is correct by construction and updates when the app does.
The frame is read from context, so a widget renders as a function of time without knowing anything about video. An existing widget usually needs no modification to appear in a composition — including the ones that animate on their own clock.
This is not a screen recorder. A composition is a deterministic function of frame number: data to widgets to frames to MP4. Wall-clock time is consulted in exactly one place, to decide which frame the playhead is parked on. The composition never sees it.
Preview parity is structural, not agreed
Most video tools maintain two code paths — one that draws the preview and one that renders the export — and then spend their lives fighting the drift between them.
FlutterMotion's preview does not build the composition at all. It runs the exporter and shows the frame that comes back, at the composition's true size. There is nothing for the two paths to disagree about because there is one path. A test byte-compares what the canvas is holding against a fresh render of the same frame.
Hot reload still works, because a composition is ordinary Flutter code: edit a widget, save, and the frame you are parked on redraws.
Where it renders
End to end, in pre-alpha: assets decoded up front, video clips composited into the widget tree, declared audio mixed in, MP4 out. The same composition also exports from inside a running app, on device — no ffmpeg, no render server.