sleep_stage_chart 1.0.0 copy "sleep_stage_chart: ^1.0.0" to clipboard
sleep_stage_chart: ^1.0.0 copied to clipboard

A Flutter plugin for displaying visualized charts of sleep phases and sleep quality data, supporting both Android and iOS platforms.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:sleep_stage_chart/sleep_stage_chart.dart';

/// 示例应用的主函数
void main() {
  runApp(const MyApp());
}

/// 应用程序的根组件
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sleep Stage Chart',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Sleep Stage Chart'),
    );
  }
}

/// 主页面组件,展示睡眠阶段图表
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  /// 页面标题
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  /// 生成示例睡眠数据
  List<SleepStageDetails> _generateSampleData() {
    final now = DateTime.now();
    // 晚上10:30开始睡觉
    final sleepStart = DateTime(now.year, now.month, now.day, 22, 30);

    return [
      SleepStageDetails(
        model: SleepStageEnum.awake,
        startTime: sleepStart,
        endTime: sleepStart.add(const Duration(minutes: 15)),
        duration: 15,
      ),
      SleepStageDetails(
        model: SleepStageEnum.light,
        startTime: sleepStart.add(const Duration(minutes: 15)),
        endTime: sleepStart.add(const Duration(minutes: 75)),
        duration: 60,
      ),
      SleepStageDetails(
        model: SleepStageEnum.deep,
        startTime: sleepStart.add(const Duration(minutes: 75)),
        endTime: sleepStart.add(const Duration(minutes: 165)),
        duration: 90,
      ),
      SleepStageDetails(
        model: SleepStageEnum.rem,
        startTime: sleepStart.add(const Duration(minutes: 165)),
        endTime: sleepStart.add(const Duration(minutes: 225)),
        duration: 60,
      ),
      SleepStageDetails(
        model: SleepStageEnum.light,
        startTime: sleepStart.add(const Duration(minutes: 225)),
        endTime: sleepStart.add(const Duration(minutes: 285)),
        duration: 60,
      ),
      SleepStageDetails(
        model: SleepStageEnum.deep,
        startTime: sleepStart.add(const Duration(minutes: 285)),
        endTime: sleepStart.add(const Duration(minutes: 375)),
        duration: 90,
      ),
      SleepStageDetails(
        model: SleepStageEnum.rem,
        startTime: sleepStart.add(const Duration(minutes: 375)),
        endTime: sleepStart.add(const Duration(minutes: 435)),
        duration: 60,
      ),
      SleepStageDetails(
        model: SleepStageEnum.light,
        startTime: sleepStart.add(const Duration(minutes: 435)),
        endTime: sleepStart.add(const Duration(minutes: 480)),
        duration: 45,
      ),
      SleepStageDetails(
        model: SleepStageEnum.awake,
        startTime: sleepStart.add(const Duration(minutes: 480)),
        endTime: sleepStart.add(const Duration(minutes: 510)),
        duration: 30,
      ),
    ];
  }

  @override
  Widget build(BuildContext context) {
    final sampleData = _generateSampleData();
    final startTime = sampleData.first.startTime;
    final endTime = sampleData.last.endTime;

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            /// 标题
            const Padding(
              padding: EdgeInsets.only(bottom: 24),
              child: Text(
                '睡眠阶段图表示例',
                style: TextStyle(
                  fontSize: 24,
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),

            /// 睡眠阶段图表
            Container(
              alignment: Alignment.center,
              height: 300,
              child: SleepStageChart(
                startTime: startTime,
                endTime: endTime,
                details: sampleData,
                // Y轴上每个单位的高度比例,这里设置为总高度的 1/8
                heightUnit: 1 / 8.0,
                // X轴标签的垂直偏移量
                xAxisTitleOffset: 8.0,
                // 为X轴标签预留的高度
                xAxisTitleHeight: 15.0,
                // 图表的背景颜色
                backgroundColor: Colors.transparent,
                // 几个间隔
                horizontalLineCount: 4,
                // 水平线样式
                horizontalLineStyle: const SleepStageChartLineStyle(
                  width: 3,
                  space: 3,
                ),
                // 网格线样式
                dividerPaintStyle: const SleepStageChartPaintStyle(
                  color: Color(0xFFB6BAD9),
                  strokeWidth: 0.5,
                  style: PaintingStyle.stroke,
                  strokeCap: StrokeCap.round,
                ),
                // 不绘制垂直线
                showVerticalLine: false,
                onIndicatorMoved: (stage) {
                  // 可以在这里处理指示器移动事件
                  print('当前阶段: ${stage.model}');
                },
              ),
            ),

            /// 提示
            Padding(
              padding: const EdgeInsets.only(top: 24),
              child: Wrap(
                spacing: 16,
                runSpacing: 8,
                children: [
                  _buildLegendItem('浅睡', stageColors[SleepStageEnum.light]!),
                  _buildLegendItem('深睡', stageColors[SleepStageEnum.deep]!),
                  _buildLegendItem('快速眼动', stageColors[SleepStageEnum.rem]!),
                  _buildLegendItem('清醒', stageColors[SleepStageEnum.awake]!),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

  /// 构建图例项
  Widget _buildLegendItem(String label, Color color) {
    return Row(
      mainAxisSize: MainAxisSize.min,
      children: [
        Container(
          width: 16,
          height: 16,
          decoration: BoxDecoration(
            color: color,
            borderRadius: BorderRadius.circular(2),
          ),
        ),
        const SizedBox(width: 4),
        Text(label),
      ],
    );
  }
}
3
likes
0
points
259
downloads

Publisher

unverified uploader

Weekly Downloads

A Flutter plugin for displaying visualized charts of sleep phases and sleep quality data, supporting both Android and iOS platforms.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter

More

Packages that depend on sleep_stage_chart