当前位置: 首页 > article >正文

flutter开发实战-当前界面无操作60s返回主页实现

flutter开发实战-当前界面无操作60s返回主页实现

当前界面无操作60s返回主页实现,主要是通过Timer来控制,当监听界面是否有pointerDown时候,如果超过60s仍没有操作,则返回主页。

一、Listener

Listener是用来用于调用回调以响应常见的指针事件
Listener的属性如下

const Listener({
    super.key,
    this.onPointerDown,
    this.onPointerMove,
    this.onPointerUp,
    this.onPointerHover,
    this.onPointerCancel,
    this.onPointerPanZoomStart,
    this.onPointerPanZoomUpdate,
    this.onPointerPanZoomEnd,
    this.onPointerSignal,
    this.behavior = HitTestBehavior.deferToChild,
    super.child,
  }) : assert(behavior != null);
    

可以看出,我们可以通过onPointerDown来判断用户是否触摸到屏幕。

二、新增ListenerTouchTimerWrapper

为Widget添加Timer控制,当触摸了屏幕,取消Timer,重新倒计时。倒计时结束之后,可以执行callback。

void updateTouch() {
    _timer?.cancel();

    if (timeoutCallback != null) {
      _timer = Timer(Duration(milliseconds: milliseconds), timeoutCallback!);
    }
  }
    

完整代码如下

class ListenerTouchTimer {
  final int milliseconds;
  Timer? _timer;
  VoidCallback? timeoutCallback;

  ListenerTouchTimer({
    required this.milliseconds,
  });

  void startListener({required VoidCallback timeoutCallback}) {
    this.timeoutCallback = timeoutCallback;
    updateTouch();
  }

  void updateTouch() {
    _timer?.cancel();

    if (timeoutCallback != null) {
      _timer = Timer(Duration(milliseconds: milliseconds), timeoutCallback!);
    }
  }

  void dispose() {
    _timer?.cancel();
  }
}
    

为widget创建Wrapper

/// 无操作回主页
class ListenerTouchTimerWrapper extends StatelessWidget {
  const ListenerTouchTimerWrapper({
    super.key,
    required this.child,
    this.listenerTouchTimer,
  });

  final Widget child;
  final ListenerTouchTimer? listenerTouchTimer;

  @override
  Widget build(BuildContext context) {
    return Listener(
      onPointerDown: (event) {
        if (listenerTouchTimer != null) {
          listenerTouchTimer!.updateTouch();
        }
      },
      child: child,
    );
  }
}
    

三、使用ListenerTouchTimerWrapper

在界面的外层使用ListenerTouchTimerWrapper进行包裹一下。

class DemoPage extends StatefulWidget {
  const DemoPage({
    Key? key,
    required this.arguments,
  }) : super(key: key);

  final Map<String, dynamic> arguments;

  @override
  State<DemoPage> createState() => _DemoPageState();
}

class _DemoPageState extends State<DemoPage> {
  /// 超出60秒自动返回首页
  ListenerTouchTimer? listenerTouchTimer;
  @override
  void initState() {
    // TODO: implement initState
    getAppConfigFromNative();
    
    listenerTouchTimer = ListenerTouchTimer(milliseconds: 6000);
    super.initState();
    loggerInfo("ChangeClothe initState");
    if (listenerTouchTimer != null) {
      listenerTouchTimer!.startListener(timeoutCallback: () {
        print("_ChangeClotheWaitPageState 超出60秒自动返回首页");
        if (mounted ) {
          navigatorBack();
        }
      });
    }
  }

  @override
  void dispose() {
    // TODO: implement dispose
    loggerInfo("ChangeClothe dispose");
    listenerTouchTimer?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return ListenerTouchTimerWrapper(
      listenerTouchTimer: listenerTouchTimer,
      child: Scaffold(
        body: Container(),
      ),
    );
  }

  void navigatorBack() {
    NavigatorPageRouter.pop();
  }
}

    

四、小结

flutter开发实战-当前界面无操作60s返回主页实现

学习记录,每天不停进步。


http://www.kler.cn/a/155904.html

相关文章:

  • 【mysql】使用宝塔面板在云服务器上安装MySQL数据库并实现远程连接
  • C++中的栈(Stack)和堆(Heap)
  • 如何从头开始构建神经网络?(附教程)
  • 十三、注解配置SpringMVC
  • Blender进阶:图像纹理节点和映射节点
  • P8680 [蓝桥杯 2019 省 B] 特别数的和
  • 力扣572:另一棵树的子树
  • 29 kafka动态配置
  • 华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)
  • windows 你的电脑不能投影到其他屏幕,请尝试重新安装驱动程序
  • C++-内联函数
  • 03-IDEA集成Git,初始化本地库,添加远程仓库,提交,拉取,推送,分支的快捷操作
  • ❀My学习Linux命令小记录(6)❀
  • Java 基础之数据类型
  • 什么是跨站脚本攻击
  • Clickhouse在货品标签场景的应用
  • 模型量化相关知识汇总
  • 程序的未定义行为(Undefined Behavior)
  • 含光伏发电的变电站供电系统设计
  • PMP考试解析
  • 目标检测YOLO系列从入门到精通技术详解100篇-【图像处理】图像识别
  • xxl-job(分布式调度任务)
  • 分享一下docker的使用心得
  • Jupyter Markdown 插入图片
  • Blender学习笔记:小车狂奔动画
  • Vue3 Router跳转传参