Как я могу поймать событие, когда текстовое поле выходит из фокуса (при размытии) во Flutter?

Я смотрю в TextFormField, поля здесь не то, что мне нужно:

  • onChanged (вызывается после каждого нажатия клавиши, мне нужно, когда пользователь уже завершил и выйдет из фокуса TextFormField)
  • onEditingComplete (вызывается после нажатия пользователем кнопки «Готово» или аналогичной, но пользователь может выйти из фокуса TextFormField, не нажимая эту кнопку)
  • onSave (вызывается после звонка. Но мне нужно сделать это после того, как пользователь закончит редактирование, чтобы сообщить пользователю, что приложение "автоматически исправляет" введенные пользователем данные)
  • validator (также призвал form.validate(), прямо перед form.save(). не то что мне было нужно)

Мне нужно, чтобы, когда пользователь выходит из фокуса (закрывая клавиатуру или нажимая на другое текстовое поле), я выполняю обработку, чтобы позволить пользователю видеть, что их ввод корректируется и обрабатывается до «правильного». Как я могу поймать такое событие?

1 ответ

Решение

Используя класс , вы добавляете прослушиватель фокуса и можете FocusNodeотслеживать изменение фокуса.

Используя класс Focus , вы просто оборачиваете TextField и добавляете параметр onFocusChange.

[Решение 1]

  • добавить экземпляр определения FocusNode
      FocusNode focusNode = FocusNode();
  • добавить слушателя FocusNode в initState.
      focusNode.addListener(() {
      print('1:  ${focusNode.hasFocus}');
    });
  • добавьте экземпляр FocusNode в параметр focusNode TextField.
      TextField(
      focusNode: focusNode,
    )

[Решение 2]

  • Перенести текстовое поле по виджету Focus
      Focus(
  child: TextField(),
  onFocusChange: (hasFocus) {
    print('2:  $hasFocus');
  },
)

[Пример полного кода]

      import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  FocusNode focusNode = FocusNode();
  @override
  void initState() {
    super.initState();
    focusNode.addListener(() {
      print(focusNode.hasFocus);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _buildBody(),
    );
  }

  Widget _buildBody() {
    return TextField(
      focusNode: focusNode,
    );
  }
}


Другие вопросы по тегам