当文本字段在 Flutter 中退出焦点(模糊)时,如何捕获事件?

How can I catch event when a text field is exiting focus (on blur) in Flutter?

我查看了 TextFormField,这里的字段不是我需要的:

我需要在用户退出焦点(关闭键盘或点击另一个文本字段)时进行处理,让用户看到他们的输入正在调整并处理为“正确的输入”。我怎样才能赶上这样的事件?

通过使用 FocusNode class,您可以添加一个焦点侦听器并可以捕获焦点变化。

通过使用 Focus class,您只需包装 TextField 并添加一个 onFocusChange 参数。

[解决方案 1]

  • 添加一个定义的 FocusNode 实例
FocusNode focusNode = FocusNode();
  • 在 initState 添加 FocusNode 的监听器。
focusNode.addListener(() {
      print('1:  ${focusNode.hasFocus}');
    });
  • 将 FocusNode 实例添加到 TextField 的 focusNode 参数。
TextField(
      focusNode: focusNode,
    )

[解法二]

  • 通过焦点小部件换行 TextField
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,
    );
  }
}