美文网首页
DBJRatingStar评星Widget封装

DBJRatingStar评星Widget封装

作者: Jean_Lina | 来源:发表于2021-09-01 14:54 被阅读0次
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;
  }
}

相关文章

网友评论

      本文标题:DBJRatingStar评星Widget封装

      本文链接:https://www.haomeiwen.com/subject/uaixwltx.html