flutter如何生成骨架屏
在Flutter中如何实现骨架屏效果?最近在开发一个需要加载数据的页面,想添加骨架屏提升用户体验。有没有推荐的第三方库或实现方案?最好能支持动态调整占位区域和动画效果,求大神分享具体实现方法或代码示例!
2 回复
Flutter中生成骨架屏可使用shimmer库。步骤如下:
- 添加shimmer依赖;
- 用Shimmer包裹组件;
- 设置渐变效果和基础布局。
示例代码:
Shimmer.fromColors(
baseColor: Colors.grey[300],
highlightColor: Colors.grey[100],
child: Container(...),
)
更多关于flutter如何生成骨架屏的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中生成骨架屏(Skeleton Screen)可以通过多种方式实现,以下是常见的方法和示例代码:
1. 使用 shimmer 库(推荐)
安装依赖:
dependencies:
shimmer: ^2.0.0
示例代码:
import 'package:flutter/material.dart';
import 'package:shimmer/shimmer.dart';
class SkeletonScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Shimmer.fromColors(
baseColor: Colors.grey[300]!,
highlightColor: Colors.grey[100]!,
child: ListView.builder(
itemCount: 5,
itemBuilder: (_, __) => Padding(
padding: EdgeInsets.all(8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 48.0,
height: 48.0,
color: Colors.white,
),
SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
height: 8.0,
color: Colors.white,
),
SizedBox(height: 8),
Container(
width: double.infinity,
height: 8.0,
color: Colors.white,
),
],
),
)
],
),
),
),
),
);
}
}
2. 自定义骨架屏组件
class SkeletonItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.symmetric(vertical: 8),
child: Row(
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(8),
),
),
SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
height: 12,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(4),
),
),
SizedBox(height: 8),
Container(
width: MediaQuery.of(context).size.width * 0.5,
height: 10,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(4),
),
),
],
),
),
],
),
);
}
}
使用建议:
- 在数据加载前显示骨架屏
- 使用
Visibility或条件渲染控制显示/隐藏 - 骨架屏布局应与实际内容布局保持一致
- 可配合
AnimatedOpacity实现平滑过渡
切换示例:
bool isLoading = true;
// 在build方法中
isLoading
? SkeletonScreen()
: YourActualContent();
这种方法能有效提升用户体验,让用户感知内容正在加载中。

