main_page.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import 'dart:async';
  2. import 'dart:math' as math;
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_clock/model/config.dart';
  5. import 'package:intl/intl.dart';
  6. import 'package:flutter_clock/pages/alarm_page.dart';
  7. import 'package:flutter_clock/pages/clock_page.dart';
  8. import 'package:flutter_clock/pages/stopwatch_page.dart';
  9. import 'package:flutter_clock/pages/timer_page.dart';
  10. class MainPage extends StatefulWidget {
  11. @override
  12. State<StatefulWidget> createState() {
  13. return _MainPageState();
  14. }
  15. }
  16. class _MainPageState extends State<MainPage>
  17. with SingleTickerProviderStateMixin {
  18. late TabController _tabController;
  19. final List<Widget> _tabs = [
  20. Tab(child: Text('Alarm', style: TextStyle(fontSize: 16))),
  21. Tab(child: Text('Clock', style: TextStyle(fontSize: 16))),
  22. Tab(child: Text('Stopwatch', style: TextStyle(fontSize: 16))),
  23. Tab(child: Text('Timer', style: TextStyle(fontSize: 16))),
  24. ];
  25. final _utcMidnightRadiansOffset = radiansFromDegrees(-64);
  26. static const _secondsInDay = 86400;
  27. DateTime _localTime = DateTime.now();
  28. @override
  29. void initState() {
  30. super.initState();
  31. _tabController = TabController(
  32. length: 4,
  33. vsync: this,
  34. initialIndex: 3); // Timer tab is selected by default
  35. Timer.periodic(Duration(seconds: 1),
  36. (_) => setState(() => _localTime = DateTime.now()));
  37. }
  38. @override
  39. void dispose() {
  40. _tabController.dispose();
  41. super.dispose();
  42. }
  43. @override
  44. Widget build(BuildContext context) {
  45. return Scaffold(
  46. appBar: AppBar(
  47. backgroundColor: Colors.white,
  48. elevation: 0,
  49. title: TabBar(
  50. controller: _tabController,
  51. tabs: _tabs,
  52. labelColor: Colors.blue,
  53. unselectedLabelColor: Colors.black,
  54. indicatorColor: Colors.blue,
  55. indicatorWeight: 3,
  56. ),
  57. actions: [
  58. IconButton(
  59. icon: Icon(Icons.more_vert, color: Colors.black),
  60. onPressed: () {
  61. // More options menu
  62. },
  63. ),
  64. ],
  65. ),
  66. body: TabBarView(
  67. controller: _tabController,
  68. children: [
  69. AlarmPage(),
  70. ClockPage(),
  71. StopwatchPage(),
  72. TimerPage(),
  73. ],
  74. ),
  75. );
  76. }
  77. static double radiansFromDegrees(double degrees) => degrees * math.pi / 180;
  78. static double radiansFromTime(DateTime time) {
  79. final midnightToday = DateTime(time.year, time.month, time.day);
  80. final secondsSinceMidnight = midnightToday.difference(time).inSeconds;
  81. final percent = secondsSinceMidnight / _secondsInDay;
  82. final degrees = percent * 360;
  83. return radiansFromDegrees(degrees);
  84. }
  85. }
  86. class InnerFaceClipper extends CustomClipper<Rect> {
  87. final percent = 0.85;
  88. @override
  89. Rect getClip(Size size) => Rect.fromCenter(
  90. center: size.center(Offset(0, 0)),
  91. width: size.width * percent,
  92. height: size.height * percent,
  93. );
  94. @override
  95. bool shouldReclip(CustomClipper oldClipper) => true;
  96. }