You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter手机电源键紧急呼叫开发:按键计数问题求助

实现连续按3次电源键触发紧急呼叫

不需要额外的统计按键次数的包,你可以在现有代码基础上通过本地变量计数+超时重置的方式实现需求,具体修改如下:

核心思路

  • 定义变量记录电源键按下次数,以及计时器用于超时重置计数
  • 每次检测到电源键按下时,计数加1
  • 若计数达到3次,触发拨号并重置计数
  • 若超过设定时间(比如2秒)没有再次按下电源键,重置计数,避免误触

修改后的完整代码

import 'package:flutter/material.dart';
import 'package:android_physical_buttons/android_physical_buttons.dart';
import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';
import 'dart:async';

void main() {
  runApp(const App());
}

class App extends StatefulWidget {
  const App({super.key});

  @override
  State<App> createState() => _State();
}

class _State extends State<App> {
  int _powerPressCount = 0;
  Timer? _resetTimer;

  @override
  void initState() {
    super.initState();

    AndroidPhysicalButtons.listen((key) {
      if (key == Key.power) {
        _handlePowerPress();
      }
    });
  }

  void _handlePowerPress() {
    setState(() {
      _powerPressCount++;
    });

    // 重置之前的计时器
    _resetTimer?.cancel();

    // 如果按下次数达到3次,触发拨号
    if (_powerPressCount == 3) {
      _callNumber();
      _resetCount();
      return;
    }

    // 2秒内没有再次按下则重置计数
    _resetTimer = Timer(const Duration(seconds: 2), _resetCount);
  }

  void _resetCount() {
    setState(() {
      _powerPressCount = 0;
    });
    _resetTimer?.cancel();
  }

  @override
  void dispose() {
    _resetTimer?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('紧急呼叫按钮'),
        ),
        body: Center(
          child: Text('连续按3次电源键触发呼叫,当前计数:$_powerPressCount'),
        ),
      ),
    );
  }

  _callNumber() async {
    const number = '002665365878899'; // 设置目标号码
    bool? res = await FlutterPhoneDirectCaller.callNumber(number);
    print('呼叫结果:$res');
  }
}

关键修改说明

  • 添加了_powerPressCount变量记录电源键按下次数
  • 添加_resetTimer计时器,用于在用户停止按键2秒后重置计数,防止误触发
  • 在按键监听回调中判断是否是电源键,再执行计数逻辑
  • 当计数达到3时,立即触发拨号并重置计数
  • 在dispose方法中销毁计时器,避免内存泄漏

内容的提问来源于stack exchange,提问作者thabang nthunya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:17:15