Flutter圆形滑块插件flutter_circular_slider的使用
Flutter圆形滑块插件flutter_circular_slider的使用
flutter_circular_slider
 
 
一个高度可定制的圆形滑块插件,适用于Flutter。
开始使用
安装
在pubspec.yaml文件中添加以下依赖:
flutter_circular_slider: ^latest_version
然后运行以下命令以安装依赖:
flutter packages get
基本用法
创建一个新的Flutter项目:
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](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}
class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blueGrey,
      body: Center(
        child: Container(
          child: DoubleCircularSlider(
            100,  // 分割数
            0,    // 初始值
            20,   // 结束值
          ),
        ),
      ),
    );
  }
}
此代码中提供了两种不同的选项:
SingleCircularSlider: 单个滑块,可以通过拖动或点击来移动。DoubleCircularSlider: 双滑块,需要通过拖动来调整两个滑块的位置。

构造函数参数
以下是DoubleCircularSlider和SingleCircularSlider的构造函数参数说明:
| 参数名称 | 默认值 | 描述 | 
|---|---|---|
divisions | 
无 | 圆形滑块被分割为多少部分。 | 
init | 
无 | (仅对DoubleCircularSlider)初始选择值,必须大于0且小于divisions。 | 
end | 
无 | (仅对DoubleCircularSlider)结束选择值,必须大于0且小于divisions。 | 
position | 
无 | (仅对SingleCircularSlider)选择值,必须大于0且小于divisions。 | 
height | 
220.0 | 滑块画布的高度。 | 
width | 
220.0 | 滑块画布的宽度。 | 
primarySectors | 
0 | 主扇区数量,绘制在selectionColor颜色上。 | 
secondarySectors | 
0 | 次要扇区数量,绘制在baseColor颜色上。 | 
child | 
null | 显示在滑块中心的小部件。 | 
onSelectionChange | 
无 | 每次用户交互时触发,返回初始值、结束值以及圈数。 | 
onSelectionEnd | 
无 | 用户完成一次交互时触发。 | 
baseColor | 
Color.fromRGBO(255, 255, 255, 0.1) | 
滑块基础颜色。 | 
selectionColor | 
Color.fromRGBO(255, 255, 255, 0.3) | 
滑块选中区域的颜色。 | 
handlerColor | 
Colors.white | 
滑块控制柄的颜色。 | 
handlerOutterRadius | 
12.0 | 控制柄外圈半径。 | 
showRoundedCapInSelection | 
false | 是否在非控制柄区域显示圆角。 | 
showHandlerOutter | 
true | 是否显示控制柄外圈。 | 
sliderStrokeWidth | 
12.0 | 滑块线条宽度(厚度)。 | 
shouldCountLaps | 
false | 如果为true,则onSelectionChange还会返回圈数。 | 
使用场景
完整选择移动

单滑块

圈数

睡眠时间选择
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](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}
class MyHomePage extends StatelessWidget {
  [@override](/user/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](/user/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](/user/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](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        Text(
          'How long did you stay in bed?',
          style: TextStyle(color: Colors.white),
        ),
        DoubleCircularSlider(
          288,
          initTime,
          endTime,
          height: 260.0,
          width: 260.0,
          primarySectors: 6,
          secondarySectors: 24,
          baseColor: Color.fromRGBO(255, 255, 255, 0.1),
          selectionColor: baseColor,
          handlerColor: Colors.white,
          handlerOutterRadius: 12.0,
          onSelectionChange: _updateLabels,
          sliderStrokeWidth: 12.0,
          child: Padding(
            padding: const EdgeInsets.all(42.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);
}
更多关于Flutter圆形滑块插件flutter_circular_slider的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter圆形滑块插件flutter_circular_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_circular_slider 是一个用于在 Flutter 应用中创建圆形滑块的插件。它允许用户通过拖动滑块来选择值,通常用于选择角度、时间、百分比等。以下是如何使用 flutter_circular_slider 插件的详细步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml 文件中添加 flutter_circular_slider 插件的依赖:
dependencies:
  flutter:
    sdk: flutter
  flutter_circular_slider: ^2.0.0
然后运行 flutter pub get 来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 flutter_circular_slider 插件:
import 'package:flutter_circular_slider/flutter_circular_slider.dart';
3. 使用 CircularSlider 组件
CircularSlider 是 flutter_circular_slider 插件中的主要组件。你可以通过配置不同的参数来自定义滑块的外观和行为。
以下是一个简单的示例,展示如何使用 CircularSlider:
import 'package:flutter/material.dart';
import 'package:flutter_circular_slider/flutter_circular_slider.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Circular Slider Example'),
        ),
        body: Center(
          child: CircularSlider(
            onSelectionChange: (double startAngle, double endAngle) {
              print('Start Angle: $startAngle, End Angle: $endAngle');
            },
            height: 200.0,
            width: 200.0,
            initialAngle: 0.0,
            endAngle: 180.0,
            baseColor: Colors.grey[300],
            selectionColor: Colors.blue,
            handlerColor: Colors.blue[700],
            handlerOutterRadius: 12.0,
            showRoundedCapInSelection: true,
            showHandlerOutter: true,
            child: Text(
              'Select Angle',
              style: TextStyle(fontSize: 16.0),
            ),
          ),
        ),
      ),
    );
  }
}
4. 参数说明
CircularSlider 组件提供了多个参数来定制滑块的外观和行为。以下是一些常用参数的说明:
onSelectionChange: 当滑块的值发生变化时触发的回调函数。它返回两个值:startAngle和endAngle,分别表示滑块的起始角度和结束角度。height和width: 滑块的高度和宽度。initialAngle: 滑块的初始角度。endAngle: 滑块的结束角度。baseColor: 滑块的背景颜色。selectionColor: 滑块选中部分的颜色。handlerColor: 滑块手柄的颜色。handlerOutterRadius: 滑块手柄的外半径。showRoundedCapInSelection: 是否在选中部分显示圆角。showHandlerOutter: 是否显示手柄的外圈。child: 滑块中心的子组件,通常用于显示文本或其他内容。
5. 运行应用
保存文件并运行应用,你将看到一个圆形滑块。你可以通过拖动滑块来改变其值,并在控制台中看到输出的角度值。
6. 进一步定制
你可以根据需要进一步定制滑块的外观和行为。例如,你可以通过调整 baseColor、selectionColor 和 handlerColor 来改变滑块的颜色,或者通过调整 height 和 width 来改变滑块的大小。
7. 处理滑块值
你可以通过 onSelectionChange 回调函数来处理滑块的值。例如,你可以将滑块的值显示在界面上,或者根据滑块的值执行某些操作。
class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  double startAngle = 0.0;
  double endAngle = 180.0;
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Circular Slider Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              CircularSlider(
                onSelectionChange: (double start, double end) {
                  setState(() {
                    startAngle = start;
                    endAngle = end;
                  });
                },
                height: 200.0,
                width: 200.0,
                initialAngle: startAngle,
                endAngle: endAngle,
                baseColor: Colors.grey[300],
                selectionColor: Colors.blue,
                handlerColor: Colors.blue[700],
                handlerOutterRadius: 12.0,
                showRoundedCapInSelection: true,
                showHandlerOutter: true,
                child: Text(
                  'Select Angle',
                  style: TextStyle(fontSize: 16.0),
                ),
              ),
              SizedBox(height: 20.0),
              Text('Start Angle: ${startAngle.toStringAsFixed(1)}'),
              Text('End Angle: ${endAngle.toStringAsFixed(1)}'),
            ],
          ),
        ),
      ),
    );
  }
}
        
      
            
            
            
