Flutter PopScope onPopInvokedWithResult点击返回键未按预期触发
解决Flutter AuthView返回键先清空PIN再关闭应用的问题
核心思路是利用PopScope的onPopInvoked回调自定义返回逻辑,而非仅依赖canPop参数:
- 维护PIN输入框的控制器,用于判断内容和执行清空操作
- 设置
canPop: false阻止系统默认返回行为,在onPopInvoked中处理自定义逻辑 - 先检查PIN输入内容,有值则清空,再执行应用关闭操作
代码示例
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class AuthView extends StatefulWidget { const AuthView({super.key}); @override State<AuthView> createState() => _AuthViewState(); } class _AuthViewState extends State<AuthView> { final TextEditingController _pinController = TextEditingController(); @override Widget build(BuildContext context) { return PopScope( canPop: false, onPopInvoked: (bool didPop) async { // 检查PIN输入框是否有内容 if (_pinController.text.isNotEmpty) { // 清空PIN码 _pinController.clear(); // 可选:添加短暂延迟,让用户看到清空反馈 await Future.delayed(const Duration(milliseconds: 300)); } // 关闭应用 SystemNavigator.pop(); }, child: Scaffold( body: Center( child: SizedBox( width: 200, child: TextField( controller: _pinController, obscureText: true, keyboardType: TextInputType.number, textAlign: TextAlign.center, decoration: const InputDecoration( hintText: '输入PIN码', border: OutlineInputBorder(), ), ), ), ), ), ); } @override void dispose() { _pinController.dispose(); super.dispose(); } }
关键说明
canPop: false:禁用系统默认的返回栈弹出行为,确保所有返回逻辑由我们控制onPopInvoked:当用户触发返回操作时会调用此回调,在这里完成"清空PIN→关闭应用"的流程SystemNavigator.pop():针对应用首页的关闭操作,直接调用系统API关闭应用(避免Navigator.pop因无栈可弹导致的异常)
内容的提问来源于stack exchange,提问作者Vinaya Augusthy
相关产品推荐
相关产品推荐

