flutter 评分星星组件的简单封装

import 'dart:math';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('评分组件'),
),
body: HomeContent(),
);
}
}
class HomeContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StartRating(count: 10,);
}
}
class StartRating extends StatefulWidget {
final double rating;
final double maxRating;
final int count;
final double size;
final Color unselectedColor;
final Color selectColor;
final Widget unselectedImage;
final Widget selectedImage;
StartRating({
@required this.rating,
this.maxRating = 10,
this.count = 5,
this.size = 30,
this.unselectedColor = const Color(0xffbbbbbb),
this.selectColor = Colors.red,
Widget unselectedImage,
Widget selectedImage
}): unselectedImage = unselectedImage ?? Icon(Icons.star_border, color: unselectedColor, size: size,),
selectedImage = selectedImage ?? Icon(Icons.star, color: unselectedColor, size: size,);
@override
_StartRatingState createState() => _StartRatingState();
}
class _StartRatingState extends State<StartRating> {
@override
Widget build(BuildContext context) {
return Stack(
children: [
Row(children: buildUnselectedStar(), mainAxisSize: MainAxisSize.min,),
Row(children: buildSelectedStar(),mainAxisSize: MainAxisSize.min,),
],
);
}
List<Widget> buildUnselectedStar() {
return List.generate(widget.count, (index) {
return widget.unselectedImage;
});
}
List<Widget> buildSelectedStar(){
List<Widget> stars = [];
final star = Icon(Icons.star, color: widget.unselectedColor, size: widget.size,);
double oneValue = widget.maxRating / widget.count;
int entireCount = (widget.rating / oneValue).floor();
for(var i = 0; i < entireCount; i++){
stars.add(star);
}
double leftWidth = ((widget.rating / oneValue) - entireCount) * widget.size;
final section = ClipRect(
clipper: StarClipper(leftWidth),
child: star,
);
stars.add(section);
if(stars.length > widget.count){
return stars.sublist(0,widget.count);
}
return stars;
}
}
class StarClipper extends CustomClipper<Rect>{
double width;
StarClipper(this.width);
@override
Rect getClip(Size size) {
return Rect.fromLTRB(0, 0, width, size.height);
}
@override
bool shouldReclip(StarClipper oldClipper) {
return oldClipper.width != this.width;
}
}
复制代码