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:有两个处理器,并且两者都必须通过拖动来移动。

basic-slider

构造函数

参数 默认值 描述
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);
}

sleep-slider

single-slider

GitHub

https://github.com/davidanaya/flutter-circular-slider