⚒️

Flutter でキーボードを閉じる

2022/07/24に公開

キーボード外をタップで閉じる

primaryFocus?.unfocus() を呼び出します。

使用例

main.dart
import 'package:flutter/material.dart';

void main() => runApp(
      MaterialApp(
        home: GestureDetector(
          onTap: () => primaryFocus?.unfocus(),
          child: const Scaffold(
            body: Center(
              child: TextField(
                autofocus: true,
              ),
            ),
          ),
        ),
      ),
    );

解説

Flutter v1.10.15 からこの方法が利用できます。

https://github.com/flutter/flutter/pull/43859

primaryFocus の実装をみてみると WidgetsBinding.instance.focusManager.primaryFocus を呼び出していました。

つまり、FocusManager.instance.primaryFocus?.unfocus() と動作は変わりません。

スクロールで閉じる

SingleChildScrollViewListView などのスクロール可能な Widget には keyboardDismissBehavior というプロパティが用意されていて、それを ScrollViewKeyboardDismissBehavior.onDrag に設定します。

使用例

main.dart
import 'package:flutter/material.dart';

void main() => runApp(
      const MaterialApp(
        home: Scaffold(
          body: SingleChildScrollView(
            keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
            child: SizedBox(
              height: 1200,
              child: Center(
                child: TextField(
                  autofocus: true,
                ),
              ),
            ),
          ),
        ),
      ),
    );

解説

ScrollView は Flutter v1.15.22 から、ListView や GridView などは v1.17.0 から利用できます。

https://github.com/flutter/flutter/pull/52068

https://github.com/flutter/flutter/pull/58746

実装をみてみると、スクロール更新時に FocusScope.of(context).unfocus() を呼び出すようにリスナーを登録していました。

if (keyboardDismissBehavior == ScrollViewKeyboardDismissBehavior.onDrag) {
  scrollable = NotificationListener<ScrollUpdateNotification>(
    child: scrollable,
    onNotification: (ScrollUpdateNotification notification) {
      final FocusScopeNode focusNode = FocusScope.of(context);
      if (notification.dragDetails != null && focusNode.hasFocus) {
        focusNode.unfocus();
      }
      return false;
    },
  );
}

おわりに

primaryFocus?.unfocus() でキーボードを閉じる」と書かれている記事が見つけられず、せっかく便利なものを用意してくれているのにもったいない!と思ったので記事にしました。

少しでもみなさんのお役に立てれば幸いです。

GitHubで編集を提案

Discussion