在Flutter中,实现加载中动画有多种方式,以下是几种常见的方法:
1. 使用内置组件
最简单的方式是使用Flutter内置的加载指示器:
Center(
child: CircularProgressIndicator(),
)
2. 自定义加载动画
使用AnimatedContainer实现自定义动画:
AnimatedContainer(
duration: Duration(seconds: 1),
width: _isLoading ? 100 : 200,
height: _isLoading ? 100 : 200,
color: _isLoading ? Colors.blue : Colors.red,
child: _isLoading ? CircularProgressIndicator() : Text('完成'),
)
3. 使用Lottie动画
首先添加依赖:lottie: ^2.7.0
import 'package:lottie/lottie.dart';
Lottie.asset(
'assets/loading_animation.json',
width: 200,
height: 200,
)
4. 旋转动画
使用RotationTransition:
RotationTransition(
turns: AlwaysStoppedAnimation(45 / 360),
child: Icon(Icons.refresh, size: 50),
)
5. 完整的加载状态管理示例
class LoadingWidget extends StatefulWidget {
@override
_LoadingWidgetState createState() => _LoadingWidgetState();
}
class _LoadingWidgetState extends State<LoadingWidget>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
bool _isLoading = true;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: Duration(seconds: 2),
vsync: this,
)..repeat();
// 模拟加载完成
Future.delayed(Duration(seconds: 3), () {
setState(() {
_isLoading = false;
});
});
}
@override
Widget build(BuildContext context) {
return Center(
child: _isLoading
? RotationTransition(
turns: _controller,
child: Icon(Icons.autorenew, size: 50),
)
: Text('加载完成'),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}
选择哪种方式取决于你的具体需求:简单场景用内置组件,需要品牌化用Lottie,需要完全自定义则使用动画控制器。