local_session_timeout
如果應用程式在「x」持續時間內未收到任何使用者互動,或在背景中運行,則將使用者重導向至驗證頁面。
如果應用程式在指定時段內未收到任何使用者互動,或於背景運行超過「x」時間,則將使用者重新導向至驗證頁面。
{"sdk":"flutter"}^1.0.0{"sdk":"flutter"}^1.0.1以下為英文專案原文快照,最新內容請造訪 GitHub。
import 'package:local_session_timeout/local_session_timeout.dart';
An object responsible for specifying durations for different types of timeouts.
It exposes a stream which can be listened for timeout events
final sessionConfig = SessionConfig(
invalidateSessionForAppLostFocus: const Duration(seconds: 15),
invalidateSessionForUserInactivity: const Duration(seconds: 30));
// If you don't have access to Navigator via context, you can access it like this
final navigatorKey = GlobalKey<NavigatorState>();
NavigatorState get _navigator => navigatorKey.currentState!;
sessionConfig.stream.listen((SessionTimeoutState timeoutEvent) {
if (timeout == SessionTimeoutState.userInactivityTimeout) {
// handle user inactive timeout
_navigator.pushNamed("/auth");
} else if (imeout == SessionTimeoutState.appFocusTimeout) {
// handle user app lost focus timeout
_navigator.pushNamed("/auth");
}
});
invalidateSessionForAppLostFocus (Duration? duration): appFocusTimeout event will be emitted through the stream, if the app loses focus and running in background for specified duration. If duration passed is null, app will not emit timeout events for losing focus / pushed into background.
invalidateSessionForUserInactivity (Duration? duration): userInactivityTimeout event will be emitted through the stream, if the app doesn't recieve any user activity for specified duration. If duration passed is null, app will not emit timeout events for user inactivity.
StreamController<SessionState> sessionStateStream:
SessionTimeoutManager(
sessionConfig: sessionConfig,
sessionStateStream: sessionStream,
userActivityDebounceDuration: const Duration(seconds: 10),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
)
);
sessionConfig (SessionConfig sessionConfig): sessionConfig object that was created previously.
child (Widget widget): child widget in widget tree.
userActivityDebounceDuration (Duration duration) (optional): Since creating a timer object for each user interaction can be CPU intensive, a new timer will be started only in the intervals of userActivityDebounceDuration duration, has default value of 10 seconds.
sessionStateStream<SessionState> (StreamController<SessionState>) (optional):
All of the above usecases are covered in example app
Note: Make sure to keep SessionTimeoutManager as top level widget of your widget tree, so that it records user activity in all screens
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
final sessionConfig = SessionConfig(
invalidateSessionForAppLostFocus: const Duration(seconds: 15),
invalidateSessionForUserInactivity: const Duration(seconds: 30));
sessionConfig.stream.listen((SessionTimeoutState timeoutEvent) {
if (timeoutEvent == SessionTimeoutState.userInactivityTimeout) {
// handle user inactive timeout
// Navigator.of(context).pushNamed("/auth");
} else if (timeoutEvent == SessionTimeoutState.appFocusTimeout) {
// handle user app lost focus timeout
// Navigator.of(context).pushNamed("/auth");
}
});
return SessionTimeoutManager(
sessionConfig: sessionConfig,
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
),
);
}
}
All OS's will support userInactivityTimeout, but appLostFocusTImeout is supported only on mobile devices (Android and IOS) as Flutter doesn't support widget lifecycle methods on desktop and Web.
This package can be used for both online and offline applications. Even if the application has session / token based auth with webserver, invalidating the session may require require communication with web server, which is not possibe if the user turns off internet connection and pushes the app to the background.