1. ホーム
  2. flutter

[解決済み] Flutterで次のTextFieldにフォーカスを移すには?

2022-08-10 14:52:06

質問

Flutterの初心者です。

以下のウィジェットを使って、複数のテキスト入力を持つフォームを構築しています。フォーム、TextFormFieldです。表示されるキーボードには "next" (次のフィールドにフォーカスを移すはず) フィールドアクションが表示されず、代わりに "done" アクション (これはキーボードを隠す) が表示されます。

公式ドキュメントでヒントを探しましたが、直接実行できるものは見つかりませんでした。 しかし、FocusNode() にたどり着きました。 料理本 , API ドキュメント ). ボタンなどの操作でフォーカスを移動させる機構を備えているのですが、それを キーボード .

どのように解決するのですか?

実現する方法が見つかりました。

  1. Done の代わりに Next アイコンを表示する - 設定 textInputAction パラメータを TextInputAction.next

  2. 使用方法 onFieldSubmitted コールバックを使用して、次のフィールドのフォーカスノードを要求します。

    class FormWidget extends StatelessWidget{    
       final focus = FocusNode();
       @override
       Widget build(BuildContext context) {
        return Form(
          child: SingleChildScrollView(
            padding: EdgeInsets.symmetric(horizontal: 16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                TextFormField(
                  textInputAction: TextInputAction.next,
                  autofocus: true,
                  decoration: InputDecoration(labelText: "Input 1"),
                  onFieldSubmitted: (v){
                    FocusScope.of(context).requestFocus(focus);
                  },
                ),
                TextFormField(
                  focusNode: focus,
                  decoration: InputDecoration(labelText: "Input 2"),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    

編集:ドキュメント(flutter.io/docs/cookbook/forms/focus)にあるように、 - FocusNodeのライフサイクルを管理することも必要です。そのため、init()メソッドでFocusNodeをinitし、親Widgetのdispose()でdisposeします。- AntonDerevyanko

更新: 同じことは FocusNodeFocusScopeNode を呼び出すだけで FocusScope.of(context).nextFocus() を見てください。 CopsOnRoadソリューション をご覧ください。より詳細な情報は doc .