123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- import 'package:flutter/material.dart';
- typedef void RatingChangeCallback(double rating);
- class SmoothStarRating extends StatelessWidget {
- final double paddingLeft;
- final double paddingRight;
- final int starCount;
- final double rating;
- final RatingChangeCallback onRatingChanged;
- final Color color;
- final Color borderColor;
- final double size;
- final bool allowHalfRating;
- Widget iconNormal;
- Widget iconSelected;
- SmoothStarRating(
- {
- this.starCount = 5,
- this.paddingLeft = 5.0,
- this.paddingRight = 5.0,
- this.rating = 0.0,
- this.onRatingChanged,
- this.color,
- this.borderColor,
- this.size,
- this.allowHalfRating = true,
- this.iconNormal,
- this.iconSelected}) {
- assert(this.rating != null);
- }
- Widget buildStar(BuildContext context, int index) {
- Widget iconWidget;
- if (index >= rating) {
- // icon = new Icon(
- // Icons.star_border,
- // color: borderColor ?? Theme.of(context).primaryColor,
- // size: size ?? 25.0,
- // );
- iconWidget = iconNormal;
- } else if (index > rating - (allowHalfRating ? 0.5 : 1.0) &&
- index < rating) {
- // icon = new Icon(
- // Icons.star_half,
- // color: color ?? Theme.of(context).primaryColor,
- // size: size ?? 25.0,
- // );
- } else {
- // icon = new Icon(
- // Icons.star,
- // color: color ?? Theme.of(context).primaryColor,
- // size: size ?? 25.0,
- // );
- iconWidget = iconSelected;
- }
- return new GestureDetector(
- onTap: () {
- if (this.onRatingChanged != null) onRatingChanged(index + 1.0);
- },
- onHorizontalDragUpdate: (dragDetails) {
- RenderBox box = context.findRenderObject();
- var _pos = box.globalToLocal(dragDetails.globalPosition);
- var i = _pos.dx / size;
- var newRating = allowHalfRating ? i : i.round().toDouble();
- if (newRating > starCount) {
- newRating = starCount.toDouble();
- }
- if (newRating < 0) {
- newRating = 0.0;
- }
- if (this.onRatingChanged != null) onRatingChanged(newRating);
- },
- child:Container(
- padding: EdgeInsets.only(left: paddingLeft,right: paddingRight),
- child: iconWidget,
- ),
- );
- }
- @override
- Widget build(BuildContext context) {
- return new Material(
- color: Colors.transparent,
- child: new Wrap(
- alignment: WrapAlignment.start,
- children: new List.generate(
- starCount, (index) => buildStar(context, index))),
- );
- }
- }
|