如何在 Flutter 中检测用户不活动

Posted

技术标签:

【中文标题】如何在 Flutter 中检测用户不活动【英文标题】:How to detect user inactivity in Flutter 【发布时间】:2021-05-10 09:43:34 【问题描述】:

我使用 Java 为 android 开发了我的应用,现在想迁移到 Flutter。 对于detecting user inactivity,我在我的Activity 中重写此方法:onUserInteraction 并重置Timer,如果没有用户交互,我会显示一个屏幕保护程序,如动画。

Flutter 中是否有任何干净的方法可以做到这一点?我不想使用platform channels。我想要它纯粹的 Dart 和颤振。我知道我可以设置计时器并在用户触摸时重置它,但就像在 Android 中一样,我希望系统通知我有关用户交互的信息。

【问题讨论】:

检查 pointerRouter 并调用 addGlobalRoute / addRoute 以便您能够“捕获”来自设备的任何指针事件 PointerRouter 是否捕获所有事件,包括按键、触摸或轨迹球? 不,它只用于指针事件,对于关键事件,请检查RawKeybord class 可能重复? ***.com/questions/58956814/…我正在测试链接中的解决方案,看看一年后它是否仍然有效 【参考方案1】:

您可以使用将MaterialApp 包裹在Listener 中。并重置互动计时器。与您在 android 中所做的类似。

它只监听诸如点击、拖动、释放或取消等手势。但是,它不会侦听鼠标事件,例如在不按任何按钮的情况下悬停区域。对于此类事件,请使用MouseRegion。

示例代码:

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() 
  runApp(MyApp());


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Listener(
      onPointerDown: (_) => print('down'), // best place to reset timer imo
      onPointerMove: (_) => print('move'),
      onPointerUp: (_) => print('up'),
      child: MaterialApp(
        theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
        debugShowCheckedModeBanner: false,
        home: Scaffold(
          body: Center(
            child: MyWidget(),
          ),
        ),
      ),
    );
  


class MyWidget extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return TextFormField(
      maxLength: 10,
      maxLengthEnforced: true,
      decoration: InputDecoration(
        border: OutlineInputBorder(),
        labelText: 'Details',
      ),
    );
  

【讨论】:

谢谢,但我想捕捉像onUserInteraction 这样的所有事件。 onUserInteraction() 每当按键、触摸或轨迹球事件分派到活动时调用【参考方案2】:

您需要做的就是访问应用的生命周期。一个很好的方法是在应用程序的 LandingPage 上使用 mixin WidgetsBindingObserver。

mixin 为您提供了一个枚举 AppLifecycleState,它可以有 4 个值,分离、非活动、暂停和恢复,描述了应用的当前状态。

你可以用这个创建一个函数,例如didAppLifecycleChange 获取应用程序的状态。即 didAppLifecycleChange(AppLifecycleState 状态)。然后,您可以使用这些状态对应用执行操作。

【讨论】:

然后您可以编写一个 if/else 或 switch/case 函数来根据应用程序的状态执行特定操作

以上是关于如何在 Flutter 中检测用户不活动的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖

如何在 Flutter/Dart 中处理应用程序卸载?

如何在php中检测用户是不是已注销?

如何在flutter中从其他android型号中检测华为设备型号?

如何检测flutter网站是不是在浏览器后台运行?

如何检测键盘上的用户活动