Flutter Web超时如果没有活动

lymnna71  于 2023-06-24  发布在  Flutter
关注(0)|答案(1)|浏览(161)

我试图检测用户的活动,如鼠标移动或键入文本字段或点击屏幕上的任何地方。使用计时器功能,我可以实现从门户注销,如果有15分钟没有活动,但此功能仅在用户设置空闲窗口窗格时工作。例如:在浏览器用户打开两个选项卡和在第一个选项卡用户使用门户和突然工作在同一窗口窗格的另一个选项卡,然后这个功能是不工作(它的暂停时间),但如果用户使用两个不同的应用程序,那么这个功能是工作。
所以需要帮助如何使这个功能更好。
仅Flutter Web...
我尝试了Flutter的简单定时器功能。如果一段时间后没有活动,我将尝试从门户注销用户。

rqcrx0a6

rqcrx0a61#

我确信我开发了这个代码从一些其他问题在这里SO,但我找不到它。
在我的一个webapp中,我有一个类似的功能:它检测鼠标点击和类似的东西(而不是鼠标移动!),并在计时器超时时注销用户。据我所知,它没有任何问题与不同的标签。
这是作为计时器的类:

class SessionTimer {
  late Timer timer;
  BuildContext context;
  Function onLogout;
  int minutes;
  SessionTimer({required this.context, required this.onLogout, required this.minutes});

  void startTimer() {
    timer = Timer.periodic(Duration(minutes: minutes), (_) {
      timedOut();
    });
  }

  void userActivityDetected([_]) {
    //print('detected');
    if (timer.isActive) {
      timer.cancel();
      //print('restarted');
      startTimer();
    }
    return;
  }

  Future<void> timedOut() async {
    timer.cancel();
    await showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) => WillPopScope(
          onWillPop: () async {
            return false;
          },
          child: PointerInterceptor(
              child: AlertDialog(
            title: Text('settingsAutoLogout'.tr()),
            content: Text('logoutForced'.tr()),
            actions: <Widget>[
              TextButton(onPressed: () => onLogout(), child: const Icon(Icons.check)),
            ],
          ))),
    );
  }
}

这是具有会话计时器的HomePage状态:

class HomePageState extends State<HomePage> {
  SessionTimer? _sessionTimer;

  @override
  void initState() {
    super.initState();
    var cfg = Config();
    cfg.init(MyApp.database).then((success) {
      _sessionTimer = SessionTimer(context: context, onLogout: () => _logout(false), minutes: cfg.autoLogout);
      _sessionTimer!.startTimer();
    });
  }
  //rest of the State class...

这是widget树顶部的GestureDetector(当然是在用户登录之后):

return GestureDetector(
        onTap: _sessionTimer?.userActivityDetected,
        onPanDown: _sessionTimer?.userActivityDetected,
        onScaleStart: _sessionTimer?.userActivityDetected,
        child: //rest of the widget tree...

希望这能帮上忙。

相关问题