如何在 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 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖