diff --git a/src/timemanagerapp/assets/images/image1.jpg b/src/timemanagerapp/assets/images/image1.jpg new file mode 100644 index 0000000..10b6f7c Binary files /dev/null and b/src/timemanagerapp/assets/images/image1.jpg differ diff --git a/src/timemanagerapp/assets/images/image2.jpg b/src/timemanagerapp/assets/images/image2.jpg new file mode 100644 index 0000000..f4b6d53 Binary files /dev/null and b/src/timemanagerapp/assets/images/image2.jpg differ diff --git a/src/timemanagerapp/assets/images/image3.jpg b/src/timemanagerapp/assets/images/image3.jpg new file mode 100644 index 0000000..e341840 Binary files /dev/null and b/src/timemanagerapp/assets/images/image3.jpg differ diff --git a/src/timemanagerapp/assets/musics/music.mp3 b/src/timemanagerapp/assets/musics/music.mp3 new file mode 100644 index 0000000..44ac6ad Binary files /dev/null and b/src/timemanagerapp/assets/musics/music.mp3 differ diff --git a/src/timemanagerapp/lib/ruters/TomatoClockRoute.dart b/src/timemanagerapp/lib/ruters/TomatoClockRoute.dart new file mode 100644 index 0000000..ad710b9 --- /dev/null +++ b/src/timemanagerapp/lib/ruters/TomatoClockRoute.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:timemanagerapp/widgets/TomatoClockWidget.dart'; + +class TomatoClockRoute extends StatelessWidget { + + @override + Widget build(BuildContext context) { + + return Scaffold( + body: TomatoClockWidget() + ); + } +} diff --git a/src/timemanagerapp/lib/widgets/HomeWidget.dart b/src/timemanagerapp/lib/widgets/HomeWidget.dart index 3454163..c65c8da 100644 --- a/src/timemanagerapp/lib/widgets/HomeWidget.dart +++ b/src/timemanagerapp/lib/widgets/HomeWidget.dart @@ -5,6 +5,7 @@ import 'package:timemanagerapp/database/MyDatebase.dart'; import 'package:timemanagerapp/ruters/AddScheduleRoute.dart'; import 'package:timemanagerapp/ruters/TeamRoute.dart'; import 'package:timemanagerapp/ruters/TestRoute.dart'; +import 'package:timemanagerapp/ruters/TomatoClockRoute.dart'; import 'package:timemanagerapp/widgets/RegisterWidget.dart'; import 'package:timemanagerapp/widgets/TimetableWidget.dart'; @@ -126,7 +127,18 @@ class _HomeWidgetState extends State { IconButton( //todo 使用番茄时钟 icon: const Icon(Icons.more), - onPressed: () {}, + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + //todo + return TomatoClockRoute(); + }, + ), + ); + + }, ), IconButton( icon: const Icon(Icons.group_add), @@ -141,6 +153,7 @@ class _HomeWidgetState extends State { }, ), ); + }, ), Builder( diff --git a/src/timemanagerapp/lib/widgets/TomatoClockWidget.dart b/src/timemanagerapp/lib/widgets/TomatoClockWidget.dart new file mode 100644 index 0000000..44ce6ac --- /dev/null +++ b/src/timemanagerapp/lib/widgets/TomatoClockWidget.dart @@ -0,0 +1,177 @@ +import 'dart:async'; + +import 'package:audioplayers/audioplayers.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:timemanagerapp/setting/Setting.dart'; + +class TomatoClockWidget extends StatefulWidget { + @override + _TomatoClockWidgetState createState() => _TomatoClockWidgetState(); +} + +class _TomatoClockWidgetState extends State { + AudioCache audioCache = AudioCache(); + + bool isMusicPlaying = false; + int currentTextIndex = 0; + List texts = [ + "趁此时风华正茂埋头苦干,免他年两鬓苍苍仰面奉承。", + "我的肩上是风,风上是闪烁的星群。", + "使人疲惫的不是远方的高山,而是鞋里的一粒沙子。", + ]; + List backgroundImages = [ + "assets/images/image1.jpg", + "assets/images/image2.jpg", + "assets/images/image3.jpg", + ]; + String currentBackgroundImage = "assets/images/image1.jpg"; + + int totalTime = 40 * 60; // 总时间,单位为秒 + int remainingTime = 40 * 60; // 剩余时间,初始为总时间 + double progress = 1.0; // 进度,初始为1.0 + late Timer timer; // 定时器 + + void toggleBackgroundImage() { + int currentIndex = backgroundImages.indexOf(currentBackgroundImage); + int nextIndex = (currentIndex + 1) % backgroundImages.length; + setState(() { + currentBackgroundImage = backgroundImages[nextIndex]; + }); + } + +void startTimer() { + timer = Timer.periodic(Duration(seconds: 1), (Timer timer) { + setState(() { + if (remainingTime > 0) { + remainingTime--; + progress = remainingTime / totalTime; + } else { + timer.cancel(); + Navigator.pop(context); + // 定时器结束后的操作 + } + }); + }); +} + + void toggleText() { + int nextIndex = (currentTextIndex + 1) % texts.length; + setState(() { + currentTextIndex = nextIndex; + }); + } + + void playPauseMusic() { + setState(() { + isMusicPlaying = !isMusicPlaying; + if (isMusicPlaying) { + audioCache.load('musics/music.mp3'); + } else { + audioCache.clear('musics/music.mp3'); + } + }); +} + + @override + void initState() { + super.initState(); + startTimer(); + } + + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + toggleBackgroundImage(); + }, + child: Container( + width: Setting.deviceWidth, + decoration: BoxDecoration( + + image: DecorationImage( + image: AssetImage(currentBackgroundImage), + fit: BoxFit.cover, + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + GestureDetector( + onTap: () { + toggleText(); + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Text( + texts[currentTextIndex], + style: TextStyle( + fontSize: 24, + color: Colors.white, + ), + ), + ) + + ), + + Stack( + alignment: Alignment.center, + children: [ + Container( + width: 200, + height: 200, + child: CircularProgressIndicator( + value: progress, + strokeWidth: 10, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation(Colors.blue), + ), + ), + + Text( + '${(remainingTime ~/ 60).toString().padLeft(2, '0')}:${(remainingTime % 60).toString().padLeft(2, '0')}', + style: TextStyle( + fontSize: 24, + color: Colors.white, + ), + ), + ], + ), + + SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children:[ + + IconButton( + icon: Icon( + isMusicPlaying ? Icons.pause : Icons.play_arrow, + color: Colors.white, + size:48 + ), + onPressed: () { + playPauseMusic(); + }, + ), + + IconButton( + icon: Icon( + Icons.stop, + color: Colors.white, + size:48 + ), + onPressed: () { + Navigator.pop(context); + }, + ), + ] + + ) + + ], + ), + ), + ); + } +} diff --git a/src/timemanagerapp/linux/flutter/generated_plugin_registrant.cc b/src/timemanagerapp/linux/flutter/generated_plugin_registrant.cc index e71a16d..1830e5c 100644 --- a/src/timemanagerapp/linux/flutter/generated_plugin_registrant.cc +++ b/src/timemanagerapp/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); } diff --git a/src/timemanagerapp/linux/flutter/generated_plugins.cmake b/src/timemanagerapp/linux/flutter/generated_plugins.cmake index 2e1de87..e9abb91 100644 --- a/src/timemanagerapp/linux/flutter/generated_plugins.cmake +++ b/src/timemanagerapp/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/src/timemanagerapp/macos/Flutter/GeneratedPluginRegistrant.swift b/src/timemanagerapp/macos/Flutter/GeneratedPluginRegistrant.swift index eefcc6d..f7f5c28 100644 --- a/src/timemanagerapp/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/src/timemanagerapp/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,11 +5,13 @@ import FlutterMacOS import Foundation +import audioplayers_darwin import path_provider_foundation import shared_preferences_foundation import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) diff --git a/src/timemanagerapp/pubspec.lock b/src/timemanagerapp/pubspec.lock index 85ca9a2..0a7c6f9 100644 --- a/src/timemanagerapp/pubspec.lock +++ b/src/timemanagerapp/pubspec.lock @@ -9,6 +9,62 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.11.0" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: d9f6ca8e9b3e5af5e73d4c814404566f72698ee7ba35487bdf2baa6749e7503f + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.2.0" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: fb01b9481f431fe04ac60f1f97ce8158383f2dc754558820592f795d81ca9d53 + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.0.2" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.0.2" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.0" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.1.0" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62" + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.1.0" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.0" boolean_selector: dependency: transitive description: @@ -41,6 +97,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.17.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -85,10 +149,10 @@ packages: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.flutter-io.cn" source: hosted - version: "6.1.4" + version: "7.0.0" flutter: dependency: "direct main" description: flutter @@ -128,6 +192,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.6.7" lints: dependency: transitive description: @@ -236,10 +308,10 @@ packages: dependency: transitive description: name: platform - sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.2" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: @@ -260,10 +332,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_android: dependency: transitive description: @@ -284,10 +356,10 @@ packages: dependency: transitive description: name: shared_preferences_linux - sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.1" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: @@ -308,10 +380,10 @@ packages: dependency: transitive description: name: shared_preferences_windows - sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.1" + version: "2.3.2" sky_engine: dependency: transitive description: flutter @@ -397,6 +469,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.3.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.7" vector_math: dependency: transitive description: @@ -417,10 +497,10 @@ packages: dependency: transitive description: name: win32 - sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067 + sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" url: "https://pub.flutter-io.cn" source: hosted - version: "5.0.8" + version: "5.0.9" xdg_directories: dependency: transitive description: @@ -431,4 +511,4 @@ packages: version: "1.0.3" sdks: dart: ">=3.1.0 <4.0.0" - flutter: ">=3.7.0" + flutter: ">=3.10.0" diff --git a/src/timemanagerapp/pubspec.yaml b/src/timemanagerapp/pubspec.yaml index 43f7566..3f726db 100644 --- a/src/timemanagerapp/pubspec.yaml +++ b/src/timemanagerapp/pubspec.yaml @@ -31,6 +31,9 @@ dependencies: flutter: sdk: flutter shared_preferences: ^2.2.1 + audioplayers: 5.2.0 + + # The following adds the Cupertino Icons font to your application. @@ -71,6 +74,10 @@ flutter: - assets/pythoncode/zfn_api.py - assets/pythoncode/getschedule.py - assets/images/userphoto.jpg + - assets/images/image1.jpg + - assets/images/image2.jpg + - assets/images/image3.jpg + - assets/musics/music.mp3 # To add assets to your application, add an assets section, like this: # assets: