From 26cebd2aebee527964fa06e5dcd955cca07a5c7b Mon Sep 17 00:00:00 2001 From: 21pages Date: Sun, 24 Dec 2023 16:16:47 +0800 Subject: [PATCH] request focus again when android account password obtain focus (#6744) Signed-off-by: 21pages --- flutter/lib/common/widgets/dialog.dart | 16 ++++++++++++++++ flutter/lib/common/widgets/login.dart | 1 + 2 files changed, 17 insertions(+) diff --git a/flutter/lib/common/widgets/dialog.dart b/flutter/lib/common/widgets/dialog.dart index cd1ad83c8..6a72cb9d5 100644 --- a/flutter/lib/common/widgets/dialog.dart +++ b/flutter/lib/common/widgets/dialog.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -411,12 +412,14 @@ class PasswordWidget extends StatefulWidget { Key? key, required this.controller, this.autoFocus = true, + this.reRequestFocus = false, this.hintText, this.errorText, }) : super(key: key); final TextEditingController controller; final bool autoFocus; + final bool reRequestFocus; final String? hintText; final String? errorText; @@ -428,6 +431,7 @@ class _PasswordWidgetState extends State { bool _passwordVisible = false; final _focusNode = FocusNode(); Timer? _timer; + Timer? _timerReRequestFocus; @override void initState() { @@ -436,11 +440,23 @@ class _PasswordWidgetState extends State { _timer = Timer(Duration(milliseconds: 50), () => _focusNode.requestFocus()); } + // software secure keyboard will take the focus since flutter 3.13 + // request focus again when android account password obtain focus + if (Platform.isAndroid && widget.reRequestFocus) { + _focusNode.addListener(() { + if (_focusNode.hasFocus) { + _timerReRequestFocus?.cancel(); + _timerReRequestFocus = Timer( + Duration(milliseconds: 100), () => _focusNode.requestFocus()); + } + }); + } } @override void dispose() { _timer?.cancel(); + _timerReRequestFocus?.cancel(); _focusNode.unfocus(); _focusNode.dispose(); super.dispose(); diff --git a/flutter/lib/common/widgets/login.dart b/flutter/lib/common/widgets/login.dart index b26397b94..f45299f80 100644 --- a/flutter/lib/common/widgets/login.dart +++ b/flutter/lib/common/widgets/login.dart @@ -357,6 +357,7 @@ class LoginWidgetUserPass extends StatelessWidget { PasswordWidget( controller: pass, autoFocus: false, + reRequestFocus: true, errorText: passMsg, ), // NOT use Offstage to wrap LinearProgressIndicator