zeba_academy_study_timer 1.0.0
zeba_academy_study_timer: ^1.0.0 copied to clipboard
Pomodoro study timer with streak tracking, XP rewards and analytics.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:zeba_academy_study_timer/zeba_academy_study_timer.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Study Timer",
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.indigo,
),
home: const StudyPage(),
);
}
}
class StudyPage extends StatefulWidget {
const StudyPage({super.key});
@override
State<StudyPage> createState() => _StudyPageState();
}
class _StudyPageState extends State<StudyPage> {
final PomodoroTimer timer = PomodoroTimer();
int seconds = 0;
@override
void initState() {
super.initState();
timer.onTick = (s) {
setState(() {
seconds = s;
});
};
timer.onFinish = () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Study session completed 🎉")),
);
};
}
String formatTime(int seconds) {
final minutes = (seconds ~/ 60).toString().padLeft(2, '0');
final secs = (seconds % 60).toString().padLeft(2, '0');
return "$minutes:$secs";
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [
Color(0xff4A6CF7),
Color(0xff7F53FF),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
child: SafeArea(
child: Column(
children: [
const SizedBox(height: 30),
const Text(
"Pomodoro Study Timer",
style: TextStyle(
fontSize: 26,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
const SizedBox(height: 40),
/// TIMER CIRCLE
Container(
width: 220,
height: 220,
decoration: BoxDecoration(
color: Colors.white,
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.2), blurRadius: 20,
spreadRadius: 2,
)
],
),
child: Center(
child: Text(
formatTime(seconds),
style: const TextStyle(
fontSize: 48,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
),
),
const SizedBox(height: 50),
/// BUTTONS
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton.icon(
onPressed: timer.start,
icon: const Icon(Icons.play_arrow),
label: const Text("Start"),
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(
horizontal: 30, vertical: 14),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
),
const SizedBox(width: 20),
ElevatedButton.icon(
onPressed: timer.stop,
icon: const Icon(Icons.stop),
label: const Text("Stop"),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.redAccent,
padding: const EdgeInsets.symmetric(
horizontal: 30, vertical: 14),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
),
],
),
const SizedBox(height: 40),
/// INFO CARD
Container(
margin: const EdgeInsets.symmetric(horizontal: 30),
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.9), borderRadius: BorderRadius.circular(16),
),
child: const Column(
children: [
Text(
"Study Tip",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18,
),
),
SizedBox(height: 10),
Text(
"Focus for 25 minutes, then take a 5 minute break. "
"Repeat the cycle to maximize productivity.",
textAlign: TextAlign.center,
),
],
),
)
],
),
),
),
);
}
}