import 'dart:async'; import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:flutter_clock/pages/alarm_page.dart'; import 'package:flutter_clock/pages/clock_page.dart'; import 'package:flutter_clock/pages/stopwatch_page.dart'; import 'package:flutter_clock/pages/timer_page.dart'; /// Description: main page /// Time : 04/06/2025 Sunday /// Author : liuyuqi.gov@msn.cn class IndexPage extends StatefulWidget { @override State createState() { return _IndexPageState(); } } class _IndexPageState extends State with SingleTickerProviderStateMixin { late TabController _tabController; final List _tabs = [ Tab(child: Text('Alarm', style: TextStyle(fontSize: 16))), Tab(child: Text('Clock', style: TextStyle(fontSize: 16))), Tab(child: Text('Stopwatch', style: TextStyle(fontSize: 16))), Tab(child: Text('Timer', style: TextStyle(fontSize: 16))), ]; final _utcMidnightRadiansOffset = radiansFromDegrees(-64); static const _secondsInDay = 86400; DateTime _localTime = DateTime.now(); @override void initState() { super.initState(); _tabController = TabController( length: 4, vsync: this, initialIndex: 3); // Timer tab is selected by default Timer.periodic(Duration(seconds: 1), (_) => setState(() => _localTime = DateTime.now())); } @override void dispose() { _tabController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.white, elevation: 0, title: TabBar( controller: _tabController, tabs: _tabs, labelColor: Colors.blue, unselectedLabelColor: Colors.black, indicatorColor: Colors.blue, indicatorWeight: 3, ), actions: [ IconButton( icon: Icon(Icons.more_vert, color: Colors.black), onPressed: () { // More options menu }, ), ], ), body: TabBarView( controller: _tabController, children: [ AlarmPage(), ClockPage(), StopwatchPage(), TimerPage(), ], ), ); } static double radiansFromDegrees(double degrees) => degrees * math.pi / 180; static double radiansFromTime(DateTime time) { final midnightToday = DateTime(time.year, time.month, time.day); final secondsSinceMidnight = midnightToday.difference(time).inSeconds; final percent = secondsSinceMidnight / _secondsInDay; final degrees = percent * 360; return radiansFromDegrees(degrees); } } class InnerFaceClipper extends CustomClipper { final percent = 0.85; @override Rect getClip(Size size) => Rect.fromCenter( center: size.center(Offset(0, 0)), width: size.width * percent, height: size.height * percent, ); @override bool shouldReclip(CustomClipper oldClipper) => true; }