round_clock 1.0.1
round_clock: ^1.0.1 copied to clipboard
A professional Flutter time range selector widget. A circular clock-based UI component for selecting sleep and wake times with smooth animations and theme support.
import 'package:flutter/material.dart';
import 'package:round_clock/round_clock.dart';
void main() {
runApp(const ExampleApp());
}
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Round Clock - Time Range Selector Example',
debugShowCheckedModeBanner: false,
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFFFF6B35),
primary: const Color(0xFFFF6B35),
secondary: const Color(0xFFFFC107),
brightness: Brightness.light,
),
fontFamily: 'Roboto',
),
darkTheme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFFFF6B35),
primary: const Color(0xFFFF8A65),
secondary: const Color(0xFFFFD54F),
brightness: Brightness.dark,
),
fontFamily: 'Roboto',
),
themeMode: ThemeMode.system,
home: const ExampleScreen(),
);
}
}
class ExampleScreen extends StatefulWidget {
const ExampleScreen({super.key});
@override
State<ExampleScreen> createState() => _ExampleScreenState();
}
class _ExampleScreenState extends State<ExampleScreen> {
double startHour = 20.167; // 8:10 PM
double endHour = 9.867; // 9:52 AM
String _formatTime(double hour) {
int h = hour.floor();
int m = ((hour - h) * 60).round();
String period = h >= 12 ? 'PM' : 'AM';
int displayHour = h % 12;
if (displayHour == 0) displayHour = 12;
return '$displayHour:${m.toString().padLeft(2, '0')}$period';
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final colorScheme = theme.colorScheme;
return Scaffold(
backgroundColor: colorScheme.surface,
appBar: AppBar(
title: const Text(
'Time Range Selector',
style: TextStyle(
fontWeight: FontWeight.w600,
letterSpacing: 0.3,
),
),
backgroundColor: Colors.transparent,
elevation: 0,
centerTitle: true,
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(20.0),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration(
color: colorScheme.primaryContainer.withValues(alpha: 0.3),
borderRadius: BorderRadius.circular(12),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.touch_app,
size: 18,
color: colorScheme.primary,
),
const SizedBox(width: 8),
Text(
'Drag handles to adjust your schedule',
style: TextStyle(
fontSize: 13,
color: colorScheme.onSurface.withValues(alpha: 0.8),
fontWeight: FontWeight.w500,
),
),
],
),
),
),
Expanded(
child: Center(
child: TimeRangeSelector(
startHour: startHour,
endHour: endHour,
onTimeChanged: (start, end) {
setState(() {
startHour = start;
endHour = end;
});
},
),
),
),
Container(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'Selected Times',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: colorScheme.onSurface,
),
),
const SizedBox(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(
children: [
Text(
'Sleep',
style: TextStyle(
fontSize: 12,
color: colorScheme.onSurface.withValues(alpha: 0.6),
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 4),
Text(
_formatTime(startHour),
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w700,
color: colorScheme.primary,
),
),
],
),
Column(
children: [
Text(
'Wake',
style: TextStyle(
fontSize: 12,
color: colorScheme.onSurface.withValues(alpha: 0.6),
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 4),
Text(
_formatTime(endHour),
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w700,
color: colorScheme.secondary,
),
),
],
),
],
),
],
),
),
],
),
);
}
}