如何在app中实现超时会话

时间:2018-06-07 08:53:09

标签: javascript dart flutter

我希望在用户未与应用进行互动的特定时间后将用户注销。

我已将整个子窗口小部件包装在GestureDetector()

请建议这是否是最佳的优化方式。

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return new GestureDetector( 
    onTap: () {
      // duration reset's to a specific time 
      startTimeout([int milliseconds]) { return new Timer(duration, handleTimeout); } 
    },
    child: new HomeWidget(),); 
  }

  void handleTimeOut {
    // Log User Out
  }
}

2 个答案:

答案 0 :(得分:0)

您应该在初始化新计时器之前取消之前的计时器

static Timer _sessionTimer;

@override
Widget build(BuildContext context) {
  ...
    onTap: () {
      _sessionTimer?.cancel();
      // duration reset's to a specific time 
      _sessionTimer = new Timer(duration, handleTimeout); 
    },

答案 1 :(得分:0)

如果您需要一些用于网络目标的东西,则可以在index.html的“ body”上更好地设置按键和鼠标单击侦听器,如下所示。

...
<body id = 'myapp-main-content'>
...

然后实现侦听器,这是从任务跟踪器(https://github.com/botorabi/TaskTracker/tree/master/src/flutter-app/TaskTracker/lib)借来的示例。

import 'dart:async';
import 'dart:html';

import 'package:TaskTracker/service/authstatus.dart';
import 'package:flutter/material.dart';

import 'config.dart';
import 'navigation.links.dart';
import 'service/service.login.dart';

/// Logout user after long inactivity period.
class SessionTimeoutHandler {

  static const MAIN_CONTAINER_ID = 'myapp-main-content';

  final GlobalKey<NavigatorState> _navigator;
  Timer _sessionTimer;
  int   _timeoutInSeconds;

  static DateTime _timeLeft;

  SessionTimeoutHandler(this._navigator, this._timeoutInSeconds);

  void installLogoutHandler() {
    var body = document.getElementById(MAIN_CONTAINER_ID);
    body.addEventListener("click", (event) => resetLogoutTimer());
    body.addEventListener("keyup", (event) => resetLogoutTimer());

    resetLogoutTimer();
  }

  /// Return the time left to logout in seconds.
  /// If user is not authenticated then 0 is returned.
  static int timeLeftInSeconds() {
    if ((_timeLeft == null) || !Config.authStatus.authenticated) {
      return 0;
    }
    return ((DateTime.now().millisecondsSinceEpoch - _timeLeft.millisecondsSinceEpoch) / 1000).floor();
  }

  void resetLogoutTimer() {
    _timeLeft = DateTime.now();
    _sessionTimer?.cancel();
    _sessionTimer = Timer(Duration(seconds: _timeoutInSeconds), _logout);
  }

  void _logout() {
    if (Config.authStatus.authenticated) {
      ServiceLogin().logoutUser().then((result) {
        Config.authStatus = AuthStatus();
        _navigator.currentState.pushNamedAndRemoveUntil(
            NavigationLinks.NAV_HOME, (Route<dynamic> route) => false);
      });
    }
  }
}

然后在您的主窗口小部件设置中使用上面的SessionTimeoutHandler(请参见下面的initState)。

class AppTaskTracker extends StatefulWidget {
  @override
  _AppTaskTrackerState createState() => _AppTaskTrackerState();
}

class _AppTaskTrackerState extends State<AppTaskTracker> {

  final GlobalKey<NavigatorState> _navigator = GlobalKey<NavigatorState>();

  @override
  void initState() {
    super.initState();
    SessionTimeoutHandler(_navigator, Config.LOGOUT_TIMEOUT).installLogoutHandler();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
  ...

考虑到SessionTimeoutHandler获取导航器以便在自动注销后重定向到主页。