import 'package:flutter/material.dart';
import 'dart:async';
/// A wrapper widget that tracks user idle time
/// Prints "hello" after 15 minutes of continuous inactivity
class IdleTimeTracker extends StatefulWidget {
final Widget child;
final Duration idleDuration;
final VoidCallback? onIdleTimeout;
const IdleTimeTracker({
Key? key,
required this.child,
this.idleDuration = const Duration(minutes: 15),
this.onIdleTimeout,
}) : super(key: key);
@override
State<IdleTimeTracker> createState() => _IdleTimeTrackerState();
}
class _IdleTimeTrackerState extends State<IdleTimeTracker> {
Timer? _idleTimer;
DateTime _lastInteractionTime = DateTime.now();
@override
void initState() {
super.initState();
\_startIdleTimer();
}
@override
void dispose() {
\_idleTimer?.cancel();
super.dispose();
}
void _startIdleTimer() {
\_idleTimer?.cancel();
\_idleTimer = Timer(widget.idleDuration, \_onIdleTimeout);
}
void _onIdleTimeout() {
print('hello');
if (widget.onIdleTimeout != null) {
widget.onIdleTimeout!();
}
}
void _resetIdleTimer() {
setState(() {
\_lastInteractionTime = DateTime.now();
});
\_startIdleTimer();
}
@override
Widget build(BuildContext context) {
return Listener(
onPointerDown: (\_) =\> \_resetIdleTimer(),
onPointerMove: (\_) =\> \_resetIdleTimer(),
onPointerUp: (\_) =\> \_resetIdleTimer(),
child: GestureDetector(
onTap: \_resetIdleTimer,
onPanStart: (\_) =\> \_resetIdleTimer(),
onScaleStart: (\_) =\> \_resetIdleTimer(),
behavior: HitTestBehavior.translucent,
child: widget.child,
),
);
}
}
// Example usage:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: IdleTimeTracker(
idleDuration: const Duration(minutes: 15),
onIdleTimeout: () {
// Optional: Additional callback when idle timeout occurs
print('User has been idle for 15 minutes!');
},
child: Scaffold(
appBar: AppBar(
title: const Text('Idle Time Tracker Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: \[
const Text(
'Interact with the screen',
style: TextStyle(fontSize: 24),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
print('Button pressed - timer reset');
},
child: const Text('Press Me'),
),
const SizedBox(height: 20),
const Text(
'If you don\\'t interact for 15 minutes,\\n"hello" will be printed',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.grey),
),
\],
),
),
),
),
);
}
}