Flutter에서 키보드를 접을 때 자동으로 TextField의 초점을 잃음

2769 단어 AndroidFlutter
앞에서 말한 바와 같이 최근 회사 flutter 프로젝트를 할 때 키보드를 접을 때 TextField 구성 요소가 초점을 잃는 기능을 실현하는 수요가 생겼다.
이 수요는 언뜻 보면 잘 해결될 것 같아서, 마음속으로는 바로 이것이다.여기!여기!so easy!
하지만!하지만!하지만!생각지도 못했어. 이루어질 때 나는 원래 희박한 머리카락에 설상가상이었어. 왜냐하면 안드로이드 핸드폰의 제3자 입력법이 매우 아픈 곳이 하나 있는데 바로 그가 키보드를 거두는 버튼이 있기 때문이야. 아래 그림과 같다. 이미지
문제는 바로 여기에 있다!개!누르다버튼!그는 원본 키보드 단추에 속하지 않아서 키보드 이벤트를 감지할 수 없습니다!그리고 차단 불가!진짜 멘붕이야.다음은 제 마지막 문제풀이 아이디어를 형제애에게 알려드릴게요. 도움이 되었으면 좋겠어요!
문제풀이 사고방식에서 키보드 사건은 감청할 수 없기 때문에 나는 다른 방법을 생각할 수밖에 없다.키보드 끄는 거 감청 안 돼요?한 번의 검색을 통해 얻은 답은 괜찮다. 그러면 한번 해 보자!
keyboard_visibility 주소:https://pub.dev/packages/keyb이 라이브러리는 키보드의 팝업을 감청하고 거두는 데 사용할 수 있습니다. 라이브러리의 예를 참조하십시오.
import ‘package:keyboard_visibility/keyboard_visibility.dart’;
@protected void initState() { super.initState();
KeyboardVisibilityNotification().addNewListener( onChange: (bool visible) { print(visible); }, ); } 통상적으로 말하면, 이것은 우리의 수요를 완전히 해결할 수 있지만, 그러나!일은 결코 이렇게 간단하지 않다!우리는 flutter 버전을 업그레이드한 후에 apk를 포장할 수 없다는 것을 발견했다. 마지막 힌트는 키보드visibility 아니!겸!용!자료를 조사해 보니 이 라이브러리는 작가가 정경한 것 같아서 시간과 함께 나아가지 못했으니 어떻게 하겠는가!
image
인터넷 관련 자료가 극히 적기 때문에 과학적으로 인터넷에 접속해도 나의 문제를 즉각 해결할 수 없기 때문에 어쩔 수 없이 사고방식을 바꿀 수밖에 없다.그러면 인터페이스의 고도 변화를 감청할 수 있습니까?자료를 찾아보니 이렇게 할 수 있다는 결론이 나왔다.
Widgets Binding Observer & didChange Metrics 이 구성 요소는 페이지의 일부 생명 주기를 감청할 수 있으며, 그 중 하나는didChange Metrics로 인터페이스의 높이 변화를 감청할 수 있습니다.그 중에서 키보드의 팝업과 접기는 사실 고도의 변화에 속하기 때문에 자연히 감청할 수 있다.
Nice!여기를 보면 우리의 해결 방안도 있다. 바로 flag을 설정하여 언제 키보드가 튀어나오고 언제 키보드가 꺼질지 구분하는 것이다.
class _InputState extends State with Widgets Binding Observer {//입력 상자의 포커스 인스턴스FocusNode focusNode;//현재 키보드가 활성화 상태인지 bool isKeyboard Actived = false
@override void initState() {super.initState(), focusNode = FocusNode();//입력박스 초점 변화 감청 focusNode.addListener(onFocus);/인터페이스 변화의 관찰자 WidgetsBinding.instance.addObserver(this)를 만듭니다.}
@override void didChangeMetrics() { super.didChangeMetrics(); WidgetsBinding.instance.addPostFrameCallback((_) {//현재 안드로이드 시스템이고 초점이 초점을 맞춘 상태에서if(Platform.isAndroid & focusNode.hasFocus) {if(isKeyboardActived) {isKeyboardActived =false;//입력 상자에 초점을 잃게 하는 focusNode.unfocus(), return;isKeyboardActived = true; } }); }
//감청이 있는 이상 메모리 유출을 방지하기 위해 마운트 해제도 당연히 있어야 합니까 @override void dispose () {super.dispose () focus Node.dispose ();Widgets Binding.instance.remove Observer (this);
//초점 변화 시 촉발하는 함수onFocus() {if(focusNode.hasFocus) {//초점을 맞출 때의 작업return;}
//          
isKeyboardActived = false;

}
@override Widget build(BuildContext context) { return TextField( focusNode: _focusNode, textInputAction: TextInputAction.done, ); } } 이렇게 해서 큰 공을 세웠으니 테스트 후에 잠시 큰 문제를 발견하지 못했으니 그래도 비교적 쓰기 좋다.
참조 문서WidgetsBindingObserver 페이지 라이프 사이클 모니터링
Flutter의 라이프 사이클(상호 작용)

좋은 웹페이지 즐겨찾기