flutter_circular_slider
一个可定制的Flutter圆形滑块。
安装
添加
flutter_circular_slider : ^lastest_version
到您的 pubspec.yaml 文件中,然后运行
flutter packages get
在您项目的根目录。
基本用法
使用命令创建一个新项目
flutter create myapp
编辑 lib/main.dart 文件,如下所示
import 'package:flutter/material.dart';
import 'package:flutter_circular_slider/flutter_circular_slider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blueGrey,
body: Center(
child: Container(child: DoubleCircularSlider(100, 0, 20)),
));
}
}
有两种不同的选项
- SingleCircularSlider:只有一个处理器,可以通过拖动处理器或仅通过单击滑块的不同部分来移动。
- DoubleCircularSlider:有两个处理器,并且两者都必须通过拖动来移动。

构造函数
| 参数 | 默认值 | 描述 |
|---|---|---|
| divisions | 将圆分成若干部分的数量,用于选择。 | |
| init | (仅适用于 DoubleCircularSlider) 选择的初始值。必须大于 0 且小于 divisions。 | |
| end | (仅适用于 DoubleCircularSlider) 选择的结束值。必须大于 0 且小于 divisions。 | |
| position | (仅适用于 SingleCircularSlider) 选择的值。必须大于 0 且小于 divisions。 | |
| 高度 | 220.0 | 渲染滑块的画布高度。 |
| width | 220.0 | 渲染滑块的画布宽度。 |
| primarySectors | 0 | 在基础圆上绘制的扇形数量。以 selectionColor 绘制。 |
| secondarySectors | 0 | 在基础圆上绘制的次级扇形数量。以 baseColor 绘制。 |
| child | 空 | 将在圆形滑块中央插入的小部件。 |
| onSelectionChange | void onSelectionChange(int init, int end) | 当用户与滑块交互并更改 init 和 end 值时触发。 |
| baseColor | Color.fromRGBO(255, 255, 255, 0.1) | 用于圆的基础的颜色。 |
| selectionColor | Color.fromRGBO(255, 255, 255, 0.3) | 用于圆中选取的颜色。 |
| handlerColor | Colors.white | 用于处理程序的颜色。 |
| handlerOutterRadius | 12.0 | 处理器周围外圆的半径。 |
用例
休眠时间选择
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_circular_slider/flutter_circular_slider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('images/background_morning.png'),
fit: BoxFit.cover,
),
),
child: SleepPage()),
));
}
}
class SleepPage extends StatefulWidget {
@override
_SleepPageState createState() => _SleepPageState();
}
class _SleepPageState extends State<SleepPage> {
final baseColor = Color.fromRGBO(255, 255, 255, 0.3);
int initTime;
int endTime;
int inBedTime;
int outBedTime;
@override
void initState() {
super.initState();
_shuffle();
}
void _shuffle() {
setState(() {
initTime = _generateRandomTime();
endTime = _generateRandomTime();
inBedTime = initTime;
outBedTime = endTime;
});
}
void _updateLabels(int init, int end) {
setState(() {
inBedTime = init;
outBedTime = end;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text(
'How long did you stay in bed?',
style: TextStyle(color: Colors.white),
),
CircularSlider(
288,
initTime,
endTime,
height: 220.0,
width: 220.0,
baseColor: Color.fromRGBO(255, 255, 255, 0.1),
selectionColor: baseColor,
handlerColor: Colors.white,
handlerOutterRadius: 12.0,
onSelectionChange: _updateLabels,
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Center(
child: Text('${_formatIntervalTime(inBedTime, outBedTime)}',
style: TextStyle(fontSize: 36.0, color: Colors.white))),
),
),
Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
_formatBedTime('IN THE', inBedTime),
_formatBedTime('OUT OF', outBedTime),
]),
FlatButton(
child: Text('S H U F F L E'),
color: baseColor,
textColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50.0),
),
onPressed: _shuffle,
),
],
);
}
Widget _formatBedTime(String pre, int time) {
return Column(
children: [
Text(pre, style: TextStyle(color: baseColor)),
Text('BED AT', style: TextStyle(color: baseColor)),
Text(
'${_formatTime(time)}',
style: TextStyle(color: Colors.white),
)
],
);
}
String _formatTime(int time) {
if (time == 0 || time == null) {
return '00:00';
}
var hours = time ~/ 12;
var minutes = (time % 12) * 5;
return '$hours:$minutes';
}
String _formatIntervalTime(int init, int end) {
var sleepTime = end > init ? end - init : 288 - init + end;
var hours = sleepTime ~/ 12;
var minutes = (sleepTime % 12) * 5;
return '${hours}h${minutes}m';
}
int _generateRandomTime() => Random().nextInt(288);
}

