일상아빠

키보드 감지는 SatelessWidget에서는 불가능하고 StatefulWidget에 WidgetsBindingObserver를 추가해서 이벤트를 감지할 수 있습니다.


추가적으로 textfield에 focusNode를 추가하여 textfield에 focus가 있는지 여부도 같이 확인합니다.

class CommentContainerState extends State
    with WidgetsBindingObserver {

  final FocusNode focusNode = new FocusNode();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    focusNode.addListener(focus);
  }
 
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    focusNode.removeListener(focus);
    focusNode?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return new Container(child: TextField(
                          focusNode: focusNode,
                          /* 필요없는 부분 삭제*/
                        ));
  }

  @override
  void didChangeMetrics() {
    if (!mounted) return;

    if (
        focusNode.hasFocus &&
        MediaQuery.of(context).viewInsets.bottom > 0.0 &&) { 
    /// 키보드가 내려가는 경우        
    }
    else {
     /// 키보드가 올라온 경우
     }
  }
}

didChangeMetrics 함수는 크기가 변경될 때 호출되는 함수입니다. 아마 화면이 회전되는 경우에도 이벤트가 발생할 수 있으니 몇가지 변수를 추가해서 정확하게 체크해야 합니다.


현재 화면에서 키보드만 내리고 싶을 때는 아래와 같이 새로운 focusNode를 생성하여 그쪽에 포커스를 넘겨주면 됩니다.

FocusScope.of(context).requestFocus(new FocusNode());


'개발 > Flutter' 카테고리의 다른 글

배경이 투명한 페이지 만들기  (0) 2018.12.06
링크 모음  (0) 2018.11.25
키보드 show/hide 감지하기  (0) 2018.11.25
상태바, 내비게이션 바 보이기/감추기  (0) 2018.11.25
상태바 투명하게 만들기  (0) 2018.11.25

티스토리 툴바