又一个 Flutter 评分条。但这次支持任何值,不仅仅是整数或半整数,而且是完全可定制的。点击和拖动等手势都得到了支持。
特点
- 支持任何分数
- 利用 Flutter 的 Wrap 小部件,这意味着你可以实现 Wrap 支持的任何布局。
- 可定制的评分小部件,可定制的程度非常高,每个小部件不必具有相同的大小,甚至不必使用相同的指示器颜色。
- 命中测试正确,每个子小部件的渲染对象都用于命中测试,因此命中测试结果尽可能准确。
入门
首先导入小部件
import 'package:flutter_pannable_rating_bar/flutter_pannable_rating_bar.dart';
用法
小部件本身是完全无状态的,这意味着你可以操作回调提供的任何值,并将其用作 PannableRatingBar 的值。
只需使用 onChanged 回调中提供的值调用 setState,它就会被正确地分配给每个评分小部件。
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: PannableRatingBar(
rate: value,
alignment: WrapAlignment.center,
spacing: 20,
items: List.generate(
5,
(index) =>
const RatingWidget(
selectedColor: Colors.yellow,
unSelectedColor: Colors.grey,
child: Icon(
Icons.star,
size: 48,
),
)),
runAlignment: WrapAlignment.center,
onChanged: (value) {
setState(() {
this.value = value;
});
},
),
),
),
);
}
使用您自己的小部件作为评分小部件。它们不必具有相同的大小、颜色或其他任何东西,完全可定制。
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: PannableRatingBar(
rate: value,
alignment: WrapAlignment.center,
spacing: 20,
items: const [
RatingWidget(
selectedColor: Colors.yellow,
unSelectedColor: Colors.grey,
child: Icon(
Icons.star,
size: 48,
),
),
RatingWidget(
selectedColor: Colors.blue,
unSelectedColor: Colors.red,
child: Icon(
Icons.ac_unit,
size: 48,
),
),
RatingWidget(
selectedColor: Colors.purple,
unSelectedColor: Colors.amber,
child: Icon(
Icons.access_time_filled,
size: 48,
),
),
RatingWidget(
selectedColor: Colors.cyanAccent,
unSelectedColor: Colors.grey,
child: Icon(
Icons.abc,
size: 48,
),
),
RatingWidget(
selectedColor: Colors.tealAccent,
unSelectedColor: Colors.purple,
child: Icon(
Icons.accessibility_new_sharp,
size: 48,
),
),
],
runAlignment: WrapAlignment.center,
onChanged: (value) {
setState(() {
this.value = value;
});
},
),
),
),
);
}
布局算法是 Flutter 内置的 Wrap 小部件,因此任何可以用 Wrap 实现的布局都可以用此小部件实现。
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: PannableRatingBar.builder(
rate: value,
alignment: WrapAlignment.center,
spacing: 20,
runSpacing: 10,
itemCount: 20,
direction: Axis.vertical,
itemBuilder: (context, index) {
return const RatingWidget(
selectedColor: Colors.yellow,
unSelectedColor: Colors.grey,
child: Icon(
Icons.star,
size: 48,
),
);
},
onChanged: (value) {
setState(() {
this.value = value;
});
},
),
),
),
);
}
附加信息
有任何改进想法吗?请在仓库中提出一个 issue!


