Hari 24: Animasi Dasar di Flutter
60 min
Last updated 09 Apr 2026
Animasi di Flutter
import "package:flutter/material.dart";
class AnimatedBox extends StatefulWidget {
@override _AnimatedBoxState createState() => _AnimatedBoxState();
}
class _AnimatedBoxState extends State with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation _scaleAnim;
late Animation _colorAnim;
@override void initState() {
super.initState();
_controller = AnimationController(
duration: Duration(seconds: 1),
vsync: this,
);
_scaleAnim = Tween(begin: 1.0, end: 1.5).animate(
CurvedAnimation(parent: _controller, curve: Curves.easeInOut),
);
_colorAnim = ColorTween(begin: Colors.blue, end: Colors.purple).animate(_controller);
}
@override void dispose() {
_controller.dispose();
super.dispose();
}
@override Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
if (_controller.isCompleted) {
_controller.reverse();
} else {
_controller.forward();
}
},
child: AnimatedBuilder(
animation: _controller,
builder: (ctx, _) => Transform.scale(
scale: _scaleAnim.value,
child: Container(
width: 100, height: 100,
color: _colorAnim.value,
child: Center(child: Text("Tap me!", style: TextStyle(color: Colors.white))),
),
),
),
);
}
}
AnimatedContainer — Cara Mudah
class AnimatedBox extends StatefulWidget {
@override State createState() => _State();
}
class _State extends State {
bool _expanded = false;
@override Widget build(BuildContext context) {
return GestureDetector(
onTap: () => setState(() => _expanded = !_expanded),
child: AnimatedContainer(
duration: Duration(milliseconds: 300),
curve: Curves.easeInOut,
width: _expanded ? 200 : 100,
height: _expanded ? 200 : 100,
color: _expanded ? Colors.green : Colors.blue,
child: Center(child: Text("Tap!")),
),
);
}
}
💡
Notice: Animasi di Flutter menggunakan AnimationController + Tween. Di sini kita simulasikan konsep dasar interpolation.
Assignment
Simulasikan animasi fade-in (opacity 0→1) dan scale (1→2) frame by frame.
Expected output:
Fade In Animation:
opacity: 0.2
opacity: 0.4
opacity: 0.6
opacity: 0.8
opacity: 1.0
Scale Animation:
scale: 1.25
scale: 1.5
scale: 1.75
scale: 2.0
Dart
main.dart
Solution
Output