【问题标题】:Detect when user is not interacting the app in Flutter检测用户何时未在 Flutter 中与应用程序交互
【发布时间】:2019-07-26 17:59:45
【问题描述】:

当用户 5 分钟未与应用交互时,我想显示一些屏幕保护程序类型的屏幕。那么有谁知道如何在颤振中实现这种功能。

import 'dart:async';

import 'package:flutter/material.dart';

const timeout = const Duration(seconds: 10);
const ms = const Duration(milliseconds: 1);
Timer timer;

void main() =>
    runApp(MyApp());


class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var home = MyHomePage(title: 'Flutter Demo Home Page');
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: home,
    );
  }


}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _goToSecondScreen() {
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (context) => SecondPage()),
    );
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(child: Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(),
      floatingActionButton: FloatingActionButton(
        onPressed: _goToSecondScreen,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    ), behavior:
    HitTestBehavior.translucent, onTapDown: (tapdown) {
      print("down");
      if (timer != null) {
        timer.cancel();
      }
      timer = startTimeout();
    },);
  }

  startTimeout([int milliseconds]) {
    var duration = milliseconds == null ? timeout : ms * milliseconds;
    return new Timer(duration, handleTimeout);
  }

  void handleTimeout() {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => ScreenSaver()),
    );
  }

}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Container();
  }
}
class ScreenSaver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new GestureDetector(child:Container(color: Colors.yellow,),
      onTap: (){
        Navigator.pop(context);
      },
    );
  }
}

这是我试图实现该功能的示例代码。当屏幕在第二个屏幕中处于活动状态时,它不工作并且GestureDetector 停止收听。

【问题讨论】:

  • 只需在每次用户交互时更新一个时间,并经常检查时间是否在一定时间后没有更新。
  • 在哪里监听触摸事件?应用中有多个屏幕。
  • @GünterZöchbauer 请检查代码,我不知道如何处理上下文问题。
  • 我看到了你的更新,只是还没来得及仔细看。
  • 没问题,有时间请查看。

标签: flutter flutter-layout


【解决方案1】:

您可以使用behavior: HitTestBehavior.translucent 将整个应用包装在GestureDetector 中以接收触摸事件,同时允许应用中的小部件也接收这些触摸事件。

您可能还想收听键盘事件External keyboard in flutter support

【讨论】:

  • 感谢您的回答。我会尝试收听onTapDown
  • 我已将应用程序包装在 GestureDetector 中,但问题是当我从事件启动屏幕时,它仅在父小部件上时才有效。如果它在另一个屏幕上,由于上​​下文,我无法启动另一个屏幕。那么我该如何处理context 问题。
  • 请创建一个 minimal 复制品作为单个文件,包括导入和 main(){...} 并将其添加到您的问题中,以便我(和其他人)可以进行调查。
  • 我已经在问题中添加了示例代码,请检查
  • 正是我的想法!我来SO看看有没有其他方法,很高兴看到你的解决方案和我的相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2023-03-12
  • 2018-10-24
  • 1970-01-01
  • 2014-11-25
  • 2015-11-11
相关资源
最近更新 更多