import 'package:flutter/material.dart';
class DBJRatingStar extends StatefulWidget {
final double rating;
final double maxRating;
final Color normalColor;
final Color selectColor;
final int count;
final double size;
final Widget? normalImage;
final Widget? selectImage;
const DBJRatingStar({
Key? key,
required this.rating,
required this.maxRating,
this.normalColor = const Color(0xffbbbbbb),
this.selectColor = Colors.red,
this.count = 5,
this.size = 35,
this.normalImage,
this.selectImage,
}) : super(key: key);
@override
_DBJRatingStarState createState() => _DBJRatingStarState();
}
class _DBJRatingStarState extends State<DBJRatingStar> {
@override
Widget build(BuildContext context) {
return Center(
child: Stack(
children: [
Row(
mainAxisSize: MainAxisSize.min,
children: buildNormalStar(),
),
Row(
mainAxisSize: MainAxisSize.min,
children: buildSelectStar(),
)
],
),
);
}
List<Widget> buildNormalStar() {
return List.generate(widget.count, (index) {
return Icon(
Icons.star_border,
color: widget.normalColor,
size: widget.size,
);
});
}
List<Widget> buildSelectStar() {
final star = Icon(
Icons.star,
color: widget.selectColor,
size: widget.size,
);
//一颗星得分
double oneValue = widget.maxRating / widget.count;
int entireCount = (widget.rating / oneValue).floor(); // floor()向下取整
double leftWidth = ((widget.rating / oneValue) - entireCount) * widget.size;
List<Widget> starList = [];
for (var i = 0; i < entireCount; i++) {
starList.add(star);
}
final leftStar = ClipRect(
child: star,
clipper: DBJRatingClip(leftWidth),
);
starList.add(leftStar);
if (starList.length > widget.count) {
return starList.sublist(0, widget.count);
}
return starList;
}
}
class DBJRatingClip extends CustomClipper<Rect> {
double width;
DBJRatingClip(this.width);
@override
Rect getClip(Size size) {
return Rect.fromLTWH(0, 0, width, size.height);
}
@override
bool shouldReclip(DBJRatingClip oldClipper) {
return oldClipper.width != width;
}
}
网友评论