2

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

  • onChanged(在按下每个键后调用,当用户已经完成并退出 TextFormField 焦点时我需要)
  • onEditingComplete(在用户按下 Done 键或类似键后调用,但用户可以在不点击这些按钮的情况下退出 TextFormField 焦点)
  • onSave(调用后调用form.save()。但我需要在用户完成编辑后执行此操作,以让用户知道该应用程序对用户输入的内容进行“自动更正”)
  • validator(也叫form.validate(),就在之前form.save()。不是我需要的)

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

4

1 回答 1

4

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

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

[解决方案 1]

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

[解决方案 2]

  • 通过 Focus 小部件包装 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,
    );
  }
}


于 2021-08-06T03:45:25.163 回答