Overview
Today we look at the amazing Shimmer library for Flutter and use it to create a simple list view.
Source Code
import 'package:flutter/material.dart';
import 'package:shimmer/shimmer.dart';
class ShimmerList extends StatefulWidget {
const ShimmerList({Key? key}) : super(key: key);
@override
State<ShimmerList> createState() => _ShimmerListState();
}
class _ShimmerListState extends State<ShimmerList> {
bool _isLoading = true;
@override
void initState() {
super.initState();
showNormalWidget();
}
showNormalWidget() {
Future.delayed(const Duration(seconds: 3), () {
setState(() {
_isLoading = false;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
shadowColor: Colors.transparent,
title: const Text(
"Shimmer",
style: TextStyle(
color: Colors.black, fontWeight: FontWeight.bold, fontSize: 25),
),
),
body: Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 16.0),
child: _isLoading
? Shimmer.fromColors(
baseColor: Colors.grey,
highlightColor: Colors.black,
child: ListView.builder(
itemBuilder: (context, index) => const Padding(
padding: EdgeInsets.only(bottom: 10),
child: ShimmerWidget(),
),
itemCount: posts.length,
),
)
: ListView.builder(
itemBuilder: (context, index) => Padding(
padding: const EdgeInsets.only(bottom: 10),
child: NormalWidget(
post: posts[index],
),
),
itemCount: posts.length,
),
),
);
}
}
class ShimmerWidget extends StatelessWidget {
const ShimmerWidget({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListTile(
leading: const CircleAvatar(
radius: 30,
backgroundColor: Colors.white,
),
title: Container(
height: 15,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
),
),
subtitle: Container(
height: 15,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
),
),
);
}
}
class NormalWidget extends StatelessWidget {
const NormalWidget({
Key? key,
required this.post,
}) : super(key: key);
final Post post;
@override
Widget build(BuildContext context) {
return ListTile(
leading: CircleAvatar(
radius: 30,
backgroundColor: Colors.white,
backgroundImage: NetworkImage(post.imageUrl),
),
title: Text(
post.title,
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18),
),
subtitle: Text(
post.id,
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
),
);
}
}
class Post {
final String id;
final String imageUrl;
final String title;
Post(
this.id,
this.imageUrl,
this.title,
);
}
final List<Post> posts = [
Post(
'id0',
'https://images.unsplash.com/photo-1568890686150-64af65720e69?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=987&q=80',
'Spiderman wall art',
),
Post(
'id1',
'https://images.unsplash.com/photo-1634828221818-503587f33d02?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1665&q=80',
'Comic book collection',
),
Post(
'id2',
'https://images.unsplash.com/photo-1596727147705-61a532a659bd?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTJ8fGNvbWljfGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=900&q=60',
'Powerful Baby Groot',
),
Post(
'id3',
'https://images.unsplash.com/photo-1611604548018-d56bbd85d681?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2070&q=80',
'DC best friends',
),
Post(
'id4',
'https://images.unsplash.com/photo-1624562563808-170065db4fcc?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1770&q=80',
'Spiderman in action',
),
Post(
'id5',
'https://images.unsplash.com/photo-1534809027769-b00d750a6bac?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=987&q=80',
'Will he save Gwen?',
),
Post(
'id6',
'https://images.unsplash.com/photo-1601645191163-3fc0d5d64e35?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1035&q=80',
'Collector Edition',
),
Post(
'id7',
'https://images.unsplash.com/photo-1569003339405-ea396a5a8a90?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8N3x8Y29taWN8ZW58MHx8MHx8&auto=format&fit=crop&w=900&q=60',
'Captain America strikes',
),
];