一统天下 flutter - widget 基础: 焦点

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - widget 基础: 焦点

示例如下:

lib\widget\basic\focus.dart

/*
 * 焦点
 *
 * flutter 的 UI 部分是声明式 UI,不是传统的命令式编程,有一个缺点就是不方便命令一个 Widget 去做一些事情
 * 比如你想通过一个按钮控制一个输入框是否获取焦点,就需要借助 focusNode 实现
 * 比如你想通过一个按钮控制一个输入框的值,就需要借助 controller 实现
 */

import 'package:flutter/material.dart';
import 'package:flutter_demo/helper.dart';

class FocusDemo extends StatefulWidget {
  const FocusDemo({Key? key}) : super(key: key);

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

class _FocusDemoState extends State<FocusDemo> {

  final FocusNode _focusNode = FocusNode();
  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: true,
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          TextField(
            /// focusNode - 用于以命令方式控制 TextField 的焦点
            focusNode: _focusNode,
            /// controller - 用于以命令方式控制 TextField 的值
            controller: _controller,
            decoration: InputDecoration(
              enabledBorder: OutlineInputBorder(
                borderSide: const BorderSide(width: 5, color: Colors.orange),
                borderRadius: BorderRadius.circular(6),
              ),
            ),
          ),
          TextButton(
            /// autofocus - 是否自动获取焦点
            autofocus: true,
            /// onFocusChange - 焦点变化时触发的事件
            onFocusChange: (isFocus) {
              log("TextButton isFocus: $isFocus");
            },
            onPressed: () {
              /// 以命令方式控制 TextField 的值
              _controller.text = DateTime.now().toString();

              /// 以命令方式控制 TextField 的焦点
              if (_focusNode.hasFocus) {
                _focusNode.nextFocus(); // 让 TextButton 获取焦点
              } else {
                FocusScope.of(context).requestFocus(_focusNode); // 让 TextField 获取焦点
              }
            },
            child: Text("修改 TextField 的值,并在 TextField 和 TextButton 间切换焦点"),
            style: ButtonStyle(
              backgroundColor: MaterialStateProperty.resolveWith((states) {
                /// 获取焦点时的背景色
                if (states.contains(MaterialState.focused)) {
                  return Colors.green;
                }
                /// 正常状态的背景色
                return Colors.blue;
              }),
              foregroundColor: MaterialStateProperty.all(Colors.white),
            ),
          ),
        ],
      ),
    );
  }
}

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

posted @ 2023-03-22 10:08  webabcd  阅读(119)  评论(0编辑  收藏  举报