Flutter占位符管理插件skeleton_marker的使用
Flutter占位符管理插件skeleton_marker的使用
skeleton_marker
是一个方便的标记小部件,可以将任何小部件转换为带有动画变换的骨架小部件。
特性
- 支持自定义切换动画
使用方法
在 pubspec.yaml
文件中添加依赖项:
dependencies:
skeleton_marker:
然后在你的 Dart 代码中导入 skeleton_marker
库并使用它:
import 'package:skeleton_marker/skeleton_marker.dart'; // 导入 skeleton_marker 库
你可以通过调用 .markSkeleton
方法将任意小部件转换为骨架小部件。以下是一个完整的示例:
import 'package:flutter/material.dart';
import 'package:skeleton_marker/skeleton_marker.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// 这个小部件是你的应用的根节点
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo1',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool isLoading = true;
final GlobalKey skeletonKey = GlobalKey();
String name = '';
String title = '';
String desc = 'A skeleton is the structural frame that supports the body of most animals. There are several types of skeletons,';
String imgUrl = '';
[@override](/user/override)
void initState() {
super.initState();
Future.delayed(const Duration(milliseconds: 15000), () {
setState(() {
imgUrl = "https://avatars2.githubusercontent.com/u/20411648?s=460&v=4";
name = 'yellow';
title = 'title content';
desc = 'A skeleton is the structural frame that supports the body of most animals. There are several types of skeletons, including the exoskeleton, which is the stable outer shell of an organism, the endoskeleton';
isLoading = !isLoading;
});
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('SkeletonsDemoPage'),
),
body: SafeArea(
child: Column(
children: [
_buildHeaderWidget(),
],
)
),
),
);
}
_buildHeaderWidget() {
return Container(
height: 120,
width: double.infinity,
margin: const EdgeInsets.all(15),
color: Colors.grey,
child: Row(
children: [
Padding(
padding: const EdgeInsets.only(left: 10),
child: imgUrl == ''
? SizedBox(
width: 100,
height: 100,
).markSkeleton(isLoading: isLoading, shapeType: SkeletionShapeEnum.circle, fillColor: Colors.black)
: Container(
height: 100,
width: 100,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(imgUrl)
)
),
).markSkeleton(isLoading: isLoading, shapeType: SkeletionShapeEnum.circle),
),
const SizedBox(width: 20,),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Container(
margin: EdgeInsets.only(right: 10),
child: Text(name, textAlign: TextAlign.left).markSkeleton(isLoading: isLoading)
)
)
],
),
SizedBox(height: 10,),
Row(
children: [
Expanded(
child: Container(
margin: EdgeInsets.only(right: 10),
child: Text(title, textAlign: TextAlign.left).markSkeleton(isLoading: isLoading)
)
)
],
),
SizedBox(height: 10,),
Row(
children: [
Expanded(
child: Container(
margin: EdgeInsets.only(right: 10),
child: Text(
desc,
style: TextStyle(
overflow: TextOverflow.ellipsis
),
textAlign: TextAlign.left,
maxLines: 2,
).markSkeleton(isLoading: isLoading, shapeType: SkeletionShapeEnum.roundedRectangle)
)
)
],
),
],
),
),
],
),
);
}
}
更多关于Flutter占位符管理插件skeleton_marker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter占位符管理插件skeleton_marker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
SkeletonMarker
是一个用于在 Flutter 应用中实现占位符(骨架屏)效果的插件。它可以帮助你在数据加载时展示一个占位符骨架,提升用户体验。以下是如何在 Flutter 项目中使用 SkeletonMarker
的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 skeleton_marker
依赖:
dependencies:
flutter:
sdk: flutter
skeleton_marker: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 skeleton_marker
包:
import 'package:skeleton_marker/skeleton_marker.dart';
3. 使用 SkeletonMarker
在你的 UI 中使用 SkeletonMarker
来包裹需要展示骨架屏的部件。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:skeleton_marker/skeleton_marker.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SkeletonMarker Example'),
),
body: Center(
child: SkeletonMarker(
child: Container(
width: 200,
height: 100,
color: Colors.blue,
child: Center(
child: Text('Content'),
),
),
),
),
),
);
}
}
在上面的示例中,SkeletonMarker
包裹了一个 Container
,当数据加载时,SkeletonMarker
会显示一个占位符骨架。
4. 自定义骨架样式
你可以通过 SkeletonMarker
的构造函数来自定义骨架的样式。以下是一些常用的参数:
color
: 骨架的颜色,默认是Colors.grey[300]
。highlightColor
: 高亮颜色,默认是Colors.grey[100]
。duration
: 动画的持续时间,默认是Duration(milliseconds: 1500)
。curve
: 动画曲线,默认是Curves.easeInOut
。
示例:
SkeletonMarker(
color: Colors.grey[200],
highlightColor: Colors.grey[100],
duration: Duration(seconds: 2),
curve: Curves.easeIn,
child: Container(
width: 200,
height: 100,
color: Colors.blue,
child: Center(
child: Text('Content'),
),
),
);
5. 控制骨架的显示与隐藏
你可以通过 SkeletonMarker
的 showSkeleton
参数来控制是否显示骨架。例如,你可以根据数据加载状态来决定是否显示骨架:
bool isLoading = true;
SkeletonMarker(
showSkeleton: isLoading,
child: Container(
width: 200,
height: 100,
color: Colors.blue,
child: Center(
child: Text('Content'),
),
),
);
在上面的示例中,当 isLoading
为 true
时,骨架会显示;当 isLoading
为 false
时,骨架会隐藏,显示实际内容。
6. 完整示例
以下是一个完整的示例,展示了如何在数据加载时使用 SkeletonMarker
:
import 'package:flutter/material.dart';
import 'package:skeleton_marker/skeleton_marker.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SkeletonMarker Example'),
),
body: DataLoadingScreen(),
),
);
}
}
class DataLoadingScreen extends StatefulWidget {
[@override](/user/override)
_DataLoadingScreenState createState() => _DataLoadingScreenState();
}
class _DataLoadingScreenState extends State<DataLoadingScreen> {
bool _isLoading = true;
String _data = '';
[@override](/user/override)
void initState() {
super.initState();
_loadData();
}
void _loadData() async {
// 模拟数据加载
await Future.delayed(Duration(seconds: 3));
setState(() {
_isLoading = false;
_data = 'Loaded Data';
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Center(
child: SkeletonMarker(
showSkeleton: _isLoading,
child: Container(
width: 200,
height: 100,
color: Colors.blue,
child: Center(
child: Text(_data),
),
),
),
);
}
}