Flutter占位符骨架屏插件main_skeletons的使用
Flutter占位符骨架屏插件main_skeletons的使用
简介
main_skeletons
是一个用于在加载数据时显示占位符骨架屏的 Flutter 包。它可以帮助开发者轻松创建自定义的骨架屏小部件,从而提升用户体验。
示例代码
以下是一个完整的示例,展示如何使用 main_skeletons
插件来实现骨架屏效果。
// 导入必要的包
import 'package:flutter/material.dart';
import 'package:main_skeletons/main_skeletons.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Skeletons Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SkeletonExamplePage(),
);
}
}
class SkeletonExamplePage extends StatefulWidget {
@override
_SkeletonExamplePageState createState() => _SkeletonExamplePageState();
}
class _SkeletonExamplePageState extends State<SkeletonExamplePage> {
bool _isLoading = true;
@override
void initState() {
super.initState();
// 模拟加载数据
Future.delayed(Duration(seconds: 3), () {
setState(() {
_isLoading = false;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Skeletons Example'),
),
body: Center(
child: _isLoading
? Skeleton(
isLoading: true,
skeleton: SkeletonListView(),
child: Container(
child: Center(
child: Text("Content"),
),
),
)
: Text("Data Loaded!"),
),
);
}
}
骨架屏的更多定制化
除了基本用法,main_skeletons
还支持丰富的定制化选项。例如,可以通过 SkeletonTheme
设置全局的骨架屏样式。
// 使用 SkeletonTheme 自定义骨架屏主题
Scaffold(
body: SkeletonTheme(
shimmerGradient: LinearGradient(
colors: [
Color(0xFFD8E3E7),
Color(0xFFC8D5DA),
Color(0xFFD8E3E7),
],
stops: [0.1, 0.5, 0.9],
),
darkShimmerGradient: LinearGradient(
colors: [
Color(0xFF222222),
Color(0xFF242424),
Color(0xFF2B2B2B),
Color(0xFF242424),
Color(0xFF222222),
],
stops: [0.0, 0.2, 0.5, 0.8, 1],
begin: Alignment(-2.4, -0.2),
end: Alignment(2.4, 0.2),
tileMode: TileMode.clamp,
),
child: Scaffold(
body: Center(
child: Text("Custom Skeleton Theme"),
),
),
),
)
更复杂的骨架屏示例
对于更复杂的内容布局(如卡片),可以使用 SkeletonItem
来构建自定义的骨架屏组件。
ListView.builder(
physics: NeverScrollableScrollPhysics(),
itemCount: 5,
itemBuilder: (context, index) => Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(color: Colors.white),
child: SkeletonItem(
child: Column(
children: [
Row(
children: [
SkeletonAvatar(
style: SkeletonAvatarStyle(
shape: BoxShape.circle, width: 50, height: 50),
),
SizedBox(width: 8),
Expanded(
child: SkeletonParagraph(
style: SkeletonParagraphStyle(
lines: 3,
spacing: 6,
lineStyle: SkeletonLineStyle(
randomLength: true,
height: 10,
borderRadius: BorderRadius.circular(8),
minLength: MediaQuery.of(context).size.width / 6,
maxLength: MediaQuery.of(context).size.width / 3,
)),
),
)
],
),
SizedBox(height: 12),
SkeletonParagraph(
style: SkeletonParagraphStyle(
lines: 3,
spacing: 6,
lineStyle: SkeletonLineStyle(
randomLength: true,
height: 10,
borderRadius: BorderRadius.circular(8),
minLength: MediaQuery.of(context).size.width / 2,
)),
),
SizedBox(height: 12),
SkeletonAvatar(
style: SkeletonAvatarStyle(
width: double.infinity,
minHeight: MediaQuery.of(context).size.height / 8,
maxHeight: MediaQuery.of(context).size.height / 3,
),
),
SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
SkeletonAvatar(style: SkeletonAvatarStyle(width: 20, height: 20)),
SizedBox(width: 8),
SkeletonAvatar(style: SkeletonAvatarStyle(width: 20, height: 20)),
SizedBox(width: 8),
SkeletonAvatar(style: SkeletonAvatarStyle(width: 20, height: 20)),
],
),
SkeletonLine(
style: SkeletonLineStyle(
height: 16,
width: 64,
borderRadius: BorderRadius.circular(8)),
)
],
)
],
),
),
),
),
);
更多关于Flutter占位符骨架屏插件main_skeletons的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter占位符骨架屏插件main_skeletons的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
main_skeletons
是一个用于 Flutter 应用的占位符骨架屏插件,它可以帮助你在数据加载时展示一个占位符骨架屏,提升用户体验。以下是如何使用 main_skeletons
插件的详细步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 main_skeletons
插件的依赖:
dependencies:
flutter:
sdk: flutter
main_skeletons: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 main_skeletons
插件:
import 'package:main_skeletons/main_skeletons.dart';
3. 使用骨架屏
main_skeletons
提供了多种预定义的骨架屏组件,你可以根据需要使用它们。
3.1 基本骨架屏
你可以使用 SkeletonContainer
来创建一个简单的骨架屏:
SkeletonContainer(
width: 200,
height: 100,
borderRadius: BorderRadius.circular(8),
)
3.2 列表骨架屏
如果你需要在列表中展示骨架屏,可以使用 SkeletonList
:
SkeletonList(
length: 5, // 列表项的数量
builder: (context, index) => ListTile(
leading: SkeletonContainer(
width: 40,
height: 40,
borderRadius: BorderRadius.circular(20),
),
title: SkeletonContainer(
width: double.infinity,
height: 16,
),
subtitle: SkeletonContainer(
width: double.infinity,
height: 12,
),
),
)
3.3 网格骨架屏
对于网格布局,可以使用 SkeletonGrid
:
SkeletonGrid(
crossAxisCount: 2, // 每行的列数
itemCount: 6, // 网格项的数量
builder: (context, index) => SkeletonContainer(
width: double.infinity,
height: 100,
borderRadius: BorderRadius.circular(8),
),
)
4. 控制骨架屏的显示
通常,骨架屏会在数据加载时显示,数据加载完成后隐藏。你可以通过条件渲染来控制骨架屏的显示:
bool isLoading = true; // 假设这是你的加载状态
[@override](/user/override)
Widget build(BuildContext context) {
return isLoading
? SkeletonList(
length: 5,
builder: (context, index) => ListTile(
leading: SkeletonContainer(
width: 40,
height: 40,
borderRadius: BorderRadius.circular(20),
),
title: SkeletonContainer(
width: double.infinity,
height: 16,
),
subtitle: SkeletonContainer(
width: double.infinity,
height: 12,
),
),
)
: ListView.builder(
itemCount: 5,
itemBuilder: (context, index) => ListTile(
leading: CircleAvatar(
child: Text('$index'),
),
title: Text('Item $index'),
subtitle: Text('Subtitle $index'),
),
);
}
5. 自定义骨架屏
main_skeletons
允许你自定义骨架屏的样式。你可以通过 SkeletonContainer
的 color
和 shimmerColor
属性来调整颜色:
SkeletonContainer(
width: 200,
height: 100,
borderRadius: BorderRadius.circular(8),
color: Colors.grey[300],
shimmerColor: Colors.grey[100],
)
6. 动画效果
main_skeletons
默认提供了闪烁动画效果,你可以通过 shimmer
属性来控制是否启用动画:
SkeletonContainer(
width: 200,
height: 100,
borderRadius: BorderRadius.circular(8),
shimmer: false, // 禁用闪烁动画
)
7. 其他功能
main_skeletons
还提供了其他一些功能,如 SkeletonAvatar
、SkeletonText
等,你可以根据需要使用它们。
8. 示例代码
以下是一个完整的示例代码,展示了如何使用 main_skeletons
插件:
import 'package:flutter/material.dart';
import 'package:main_skeletons/main_skeletons.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Skeleton Screen Example'),
),
body: SkeletonExample(),
),
);
}
}
class SkeletonExample extends StatefulWidget {
[@override](/user/override)
_SkeletonExampleState createState() => _SkeletonExampleState();
}
class _SkeletonExampleState extends State<SkeletonExample> {
bool isLoading = true;
[@override](/user/override)
void initState() {
super.initState();
// 模拟数据加载
Future.delayed(Duration(seconds: 3), () {
setState(() {
isLoading = false;
});
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return isLoading
? SkeletonList(
length: 5,
builder: (context, index) => ListTile(
leading: SkeletonContainer(
width: 40,
height: 40,
borderRadius: BorderRadius.circular(20),
),
title: SkeletonContainer(
width: double.infinity,
height: 16,
),
subtitle: SkeletonContainer(
width: double.infinity,
height: 12,
),
),
)
: ListView.builder(
itemCount: 5,
itemBuilder: (context, index) => ListTile(
leading: CircleAvatar(
child: Text('$index'),
),
title: Text('Item $index'),
subtitle: Text('Subtitle $index'),
),
);
}
}