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
相关产品推荐
相关产品推荐

