美文网首页
Flutter 之 FocusNode (七十三)

Flutter 之 FocusNode (七十三)

作者: maskerII | 来源:发表于2022-05-18 21:00 被阅读0次

FocusNode 主要提供焦点控制功能

1. FocusNode

1.1 收起或者隐藏键盘


class MSFocusNodeDemo1 extends StatelessWidget {
  MSFocusNodeDemo1({Key? key}) : super(key: key);

  final _normalNode = FocusNode();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("FocusNodeDemo")),
      body: TextField(
        focusNode: _normalNode,
        onSubmitted: (string) {
          print(string);
          // _normalNode.unfocus();
          FocusManager.instance.primaryFocus!.unfocus();
        },
      ),
    );
  }
}

以下两种方式均可隐藏键盘。

normalNode.unfocus(); 
FocusManager.instance.primaryFocus.unfocus(); // 拿到对应的 FocusNode

1.2 自动跳转焦点

使用 FocusScope 控件,以及 FocusScopeNode 来对焦点进行管理


class MSFocusNodeDemo2 extends StatelessWidget {
  MSFocusNodeDemo2({Key? key}) : super(key: key);

  final FocusScopeNode _scopeNode = FocusScopeNode();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("FocusNodeDemo2")),
      body: FocusScope(
        node: _scopeNode,
        child: ListView(
          padding: EdgeInsets.symmetric(horizontal: 16),
          children: [
            _textField(),
            _textField(),
            _textField(),
            _textField(),
            _textField(),
            _textField(),
            _textField(),
            _textField(),
          ],
        ),
      ),
    );
  }

  TextField _textField() {
    return TextField(
      decoration: InputDecoration(hintText: "请输入文本"),
      onEditingComplete: () {
        // 跳到下一个textFiled
        _scopeNode.nextFocus();
      },
    );
  }
}

至此,我们已经实现了光标自动下跳的功能了

103.gif

1.3 跳过部分控件的 FocusNode

在 flutter 中很多子控件其实也有 focusNode 属性,与 TextField 一样。
在这里 FocusScopeNode 就一视同仁了,认为他也是可以聚焦的一份子,所以有时候会卡在某一个不是 TextField 的控件上。

设置 skipTraversal 属性,FocusScopeNode 会自动跳过设置为 true 的控件


class MSFocusNodeDemo3 extends StatelessWidget {
  MSFocusNodeDemo3({Key? key}) : super(key: key);

  final FocusScopeNode _scopeNode = FocusScopeNode();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("FocusNodeDemo3")),
      body: FocusScope(
        node: _scopeNode,
        child: ListView(
          padding: EdgeInsets.symmetric(horizontal: 16),
          children: [
            _textField(),
            _textField(),
            _btnField(),
            _textField(),
            _textField(),
            _btnField(),
            _textField(),
            _textField(),
          ],
        ),
      ),
    );
  }

  TextField _textField() {
    return TextField(
      decoration: InputDecoration(hintText: "请输入文本"),
      onEditingComplete: () {
        _scopeNode.nextFocus();
      },
    );
  }

  Widget _btnField() {
    return Row(
      children: [
        Expanded(child: _textField()),
        ElevatedButton(
          onPressed: () {},
          child: Text("点击"),
          focusNode: FocusNode(skipTraversal: true),
        )
      ],
    );
  }
}

102.gif

相关文章

网友评论

      本文标题:Flutter 之 FocusNode (七十三)

      本文链接:https://www.haomeiwen.com/subject/lmtzurtx.html