flutter的TextField参数、案例整理(上)

本文详细介绍了Flutter中TextField的构造函数参数,以及如何使用TextEditingController监听输入,展示了如何控制键盘的显示和隐藏,以及FocusNode在焦点管理中的应用。
摘要由CSDN通过智能技术生成

TextField

概述

  • TextField 用于文本输入

构造函数

const TextField({
    Key key,
    this.controller, 
    this.focusNode,
    this.decoration = const InputDecoration(),
    TextInputType keyboardType,
    this.textInputAction,
    this.textCapitalization = TextCapitalization.none,
    this.style, // 文本样式
    this.strutStyle,
    this.textAlign = TextAlign.start, // 文本水平方向对齐方式
    this.textAlignVertical, // 本文垂直方向对齐方式
    this.textDirection, // 文本方向
    this.readOnly = false, // 是否是只读
    ToolbarOptions toolbarOptions,
    this.showCursor,
    this.autofocus = false, //在widget创建的时候是否自动获取焦点
    this.obscureText = false,// 是否隐藏文本,常用于密码输入
    this.autocorrect = true,
    this.enableSuggestions = true,
    this.maxLines = 1,
    this.minLines,
    this.expands = false,
    this.maxLength,//当设置了maxLength后,右下角会出现字数统计
    this.maxLengthEnforced = true,
    this.onChanged, // 内容发生改变方法回调
    this.onEditingComplete, // 完成编辑方法回调,实现了这个方法,键盘不再会自动收起
    this.onSubmitted, // 提交方法回调
    this.inputFormatters,// 用于校验,较麻烦,能搭配正则等使用
    this.enabled,
    this.cursorWidth = 2.0, // 光标宽度
    this.cursorRadius, // 光标圆角
    this.cursorColor, // 光标颜色
    this.keyboardAppearance,
    this.scrollPadding = const EdgeInsets.all(20.0), 
    this.dragStartBehavior = DragStartBehavior.start,
    this.enableInteractiveSelection = true,
    this.onTap, // 点击方法回调(开始编辑)
    this.buildCounter, // 搭配maxLength出现的字数统计,控制字数统计的显示样式
    this.scrollController, // 滚动
    this.scrollPhysics,
  })

示例代码

  • 使用 TextEditingController 对 TextField 输入进行监听
    • 别忘记了释放TextEditingController
    • 可以获取输入框的文本、设置光标位置、清空输入框等操作
/// 编辑框的控制器
TextEditingController textEditingController = TextEditingController();
/// 组件
TextField(
    maxLines: 1,
    maxLength: 50,
    textInputAction: TextInputAction.search,
    style: const TextStyle(fontSize: 12, color: Colors.black),
    controller: textEditingController,
    onEditingComplete: onSearch,
    decoration: InputDecoration(
        /// 关闭计数器
        counterText: '',
        contentPadding: const EdgeInsets.symmetric(horizontal: 10),
        hintText: "输入你想搜索的内容",
        hintStyle: TextStyle(
            fontSize: 12, color: Global.theme.light_gray_color),
        hintMaxLines: 1,
        /// 直接用border: BorderSide.none会有布局问题,需要包裹OutlineInputBorder
        border: const OutlineInputBorder(
            // BorderSide(color: ) 设置边框颜色
            // borderRadius: const BorderRadius.all(Radius.circular(10.0)), 设置边框圆角
            borderSide: BorderSide.none
            ),
        suffixIcon: EIcon(
            width: 20,
            height: 20,
            path: "assets/icon/icon_search.png",
            onTap: onSearch),
    ),
)
/// 在页面里放上键盘监听
KeyboardVisibilityBuilder(builder: (context, isKeyboardVisible) {
              dLog(_tag, "keyboard visible: $isKeyboardVisible");
              return emptyWidget;
            }),
// 给全部添加一个GestureDetector,设置onTap方法
// 方法内部加入FocusScope.of(context).unfocus();可以实现点击其他位置的地方让编辑框弹出的键盘隐藏
// 本质是用了焦点来控制键盘的显隐

通过点击button控制键盘显隐

  • 搭配FocusNode
  • FocusNode,管理TextField的焦点
class _TestWidgetState extends State<TestWidget> {
  // focusNode
  final FocusNode _focusNode = FocusNode(debugLabel: "Button");

  @override
  void initState() {
    super.initState();
    // 监听焦点
    _focusNode.addListener(() {
      if (_focusNode.hasFocus == true) {
        print("输入框获得焦点");
      } else {
        print("输入框失去焦点");
      }
    });
  }

  @override
  void dispose() {
    _focusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(left: 20, right: 20),
      child: Column(
        children: <Widget>[
          Center(
            child: TextField(
              focusNode: _focusNode,
            ),
          ),
          FlatButton(
            onPressed: () {
              if (_focusNode.canRequestFocus) {
                FocusScope.of(context).requestFocus(_focusNode);
              }
            },
            child: Text('键盘弹出'),
          ),
          MaterialButton(
            onPressed: () {
              _focusNode.unfocus();
            },
            child: Text('键盘消失'),
          )
        ],
      ),
    );
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值