当前位置:   article > 正文

2024年Flutter 项目实战 编辑框(TextField) 自定义 七,2024年最新程序员面试自我介绍

flutter 项目实战

学习分享,共勉

Android高级架构师进阶之路

题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人

  • Android进阶知识体系学习脑图

  • Android进阶高级工程师学习全套手册

  • 对标Android阿里P7,年薪50w+学习视频

  • 大厂内部Android高频面试题,以及面试经历

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

helperText / helperStyle

编辑框底部提示文本行数(显示1行或者多行,如果文本值超过一行显示省略号)

InputDecoration(

helperMaxLines: 1,

helperText: ‘编辑框底部提示文本/编辑框底部提示文本/编辑框底部提示文本/编辑框底部提示文本/编辑框底部提示文本’,

helperStyle: TextStyle(color: Colors.red, fontSize: 14.0))

helperMaxLines

InputDecoration(

hintMaxLines: 1,

hintText: ‘编辑框内提示文本/编辑框内提示文本/编辑框内提示文本/编辑框内提示文本’,

hintTextDirection: TextDirection.rtl,

hintStyle: TextStyle(color: Colors.red, fontSize: 14.0))

hintText /  hintStyle / hintTextDirection / hintMaxLines

InputDecoration(

errorMaxLines: 1,

errorText: ‘编辑框错误文本提示一’,

errorBorder: UnderlineInputBorder(

borderRadius: BorderRadius.all(

Radius.circular(30), //边角为30

),

borderSide: BorderSide(

color: Colors.amber, //边线颜色为黄色

width: 2, //边线宽度为2

),),

errorStyle: TextStyle(color: Colors.blue, fontSize: 14.0))

errorMaxLines/errorText/errorBorder/errorStyle

TextField(

                decoration: const InputDecoration(
  • 1
                    enabledBorder: OutlineInputBorder(
  • 1
                      borderRadius: BorderRadius.all(
  • 1
                        Radius.circular(30), //边角为30
  • 1
                      ),
  • 1
                      borderSide: BorderSide(
  • 1
                        color: Colors.amber, //边线颜色为红色
  • 1
                        width: 2, //边线宽度为2
  • 1
                      ),
  • 1
                    ),
  • 1
                    focusedBorder: OutlineInputBorder(
  • 1
                        borderRadius: BorderRadius.all(
  • 1
                          Radius.circular(30), //边角为30
  • 1
                        ),
  • 1
                        borderSide: BorderSide(
  • 1
                          color: Colors.green, //边框颜色为绿色
  • 1
                          width: 5, //宽度为5
  • 1
                        ))),
  • 1
              ),
  • 1

enabledBorder/focusedBorder

/ 自定义编辑框 /

编辑框一键删除

assets文件夹下放置用来进行一键删除的图标

pubspec.yaml 注册图标依赖

initState函数里面初始化一键删除编辑框控制器

//定义一个controller

late TextEditingController _controller;

bool _isShoDel = false;

///是否获取焦点

bool _isFocus = false;

FocusNode _focusNode = FocusNode();

@override

void initState() {

// TODO: implement initState
  • 1
super.initState();
  • 1
_controller = TextEditingController();
  • 1
_controller.addListener(() {
  • 1
  _inputContro(_controller.text, false);
  • 1
});
  • 1
_focusNode.addListener(() {
  • 1
  print('输入框是否获取焦点: ${_focusNode.hasFocus}');
  • 1
  setState(() {
  • 1
    _isFocus = _focusNode.hasFocus;
  • 1
  });
  • 1
});
  • 1

}

失去焦点或者编辑框不存在文本时 , 一键删除图标隐藏

编辑框粘贴需用用到编辑控制器 , 复制文本粘贴到编辑会显示一键删除

编辑框输入文本后并失去焦点 , 一键删除按钮隐藏

编辑框输入完成后替换空格 ,网络请求数据只会上传除开空格后的文本

编辑框完整编码

import ‘package:flutter/cupertino.dart’;

import ‘package:flutter/material.dart’;

///自定义编辑

class CusTextField extends StatefulWidget {

final InputValueCallBack? _inputValueCallBack;

///编辑框输入颜色值

final inputColorValue;

///编辑框默认提示文本

final hintText;

///边框

final border;

///编辑框最外层边框

final bgBorder;

///标题

final Widget? labelText;

///编辑框输入文本大小

final inputFontSize;

///文本位置(左边|右边|中间)

final TextAlign? textAlign;

final keyboardType;

//文本行数

final int? maxLine;

///边框跟父视图边距

final margin;

CusTextField(this._inputValueCallBack,

  {this.inputColorValue,
  • 1
  this.hintText = '',
  • 1
  this.border,
  • 1
  this.bgBorder,
  • 1
  this.labelText,
  • 1
  this.inputFontSize,
  • 1
  this.textAlign = TextAlign.right,
  • 1
  this.maxLine = 1,
  • 1
  this.margin,
  • 1
  this.keyboardType});
  • 1

@override

_CusTextFieldState createState() => _CusTextFieldState();

}

class _CusTextFieldState extends State {

//定义一个controller

late TextEditingController _controller;

bool _isShoDel = false;

///是否获取焦点

bool _isFocus = false;

FocusNode _focusNode = FocusNode();

@override

void initState() {

// TODO: implement initState
  • 1
super.initState();
  • 1
_controller = TextEditingController();
  • 1
_controller.addListener(() {
  • 1
  _inputContro(_controller.text, false);
  • 1
});
  • 1
_focusNode.addListener(() {
  • 1
  print('输入框是否获取焦点: ${_focusNode.hasFocus}');
  • 1
  setState(() {
  • 1
    _isFocus = _focusNode.hasFocus;
  • 1
  });
  • 1
});
  • 1

}

@override

void dispose() {

// TODO: implement dispose
  • 1
super.dispose();
  • 1

}

void _inputContro(v, bool isInput) {

///编辑框输入文本长度
  • 1
int _valueLength = '$v'.length;
  • 1
print('输入框输入监听 文本长度: $_valueLength');
  • 1
///编辑框输入文本大于0
  • 1
_isShoDel = (_valueLength > 0);
  • 1
///编辑框文本输入文本存在值时或者等于为空时刷新编辑框
  • 1
if (_valueLength <= 1 && isInput) {
  • 1
  setState(() {});
  • 1
  print('CusTextField_刷新编辑框');
  • 1
}
  • 1
///粘贴
  • 1
if (!isInput) {
  • 1
  setState(() {});
  • 1
}
  • 1
_inputValue(v);
  • 1

}

@override

Widget build(BuildContext context) {

return Container(
  • 1
  child: Row(
  • 1
    crossAxisAlignment: CrossAxisAlignment.center,
  • 1
    children: [
  • 1
      widget.labelText ?? Container(),
  • 1
      Expanded(
  • 1
        flex: 1,
  • 1
        child: Container(
  • 1
          child: TextField(
  • 1
            textAlign: (widget.textAlign)!,
  • 1
            maxLines: widget.maxLine!,
  • 1
            focusNode: _focusNode,
  • 1
            ///光标颜色
  • 1
            cursorColor: Color(0xff005CFA),
  • 1
            ///编辑框首次不自动获取焦点
  • 1
            autofocus: false,
  • 1
            keyboardType: widget.keyboardType ?? TextInputType.text,
  • 1
            style: TextStyle(
  • 1
                fontSize: widget.inputFontSize ?? 0.0,
  • 1
                fontWeight: FontWeight.w400,
  • 1
                ///文本输入或文本为空时的颜色值
  • 1
                color: Color(_isShoDel ? 0xff1D1D1F : 0xffB8BABF)),
  • 1
            decoration: InputDecoration(
  • 1
              ///默认文本
  • 1
              hintText: '${widget.hintText ?? ''}',
  • 1
              hintStyle: TextStyle(
  • 1
                color: Color(0xffB8BABF),
  • 1
                fontWeight: FontWeight.w400,
  • 1
              ),
  • 1
              ///边框
  • 1
              border: widget.border ?? InputBorder.none,
  • 1
            ),
  • 1
            onChanged: (v) {
  • 1
              _inputContro(v, true);
  • 1
            },
  • 1
            controller: _controller, //设置controller
  • 1
          ),
  • 1
        ),
  • 1
      ),
  • 1
      Offstage(
  • 1
        offstage: !(_isShoDel && _isFocus),
  • 1
        child: GestureDetector(
  • 1
          onTap: () {
  • 1
            _controller.clear();
  • 1
            _inputContro('', false);
  • 1
          },
  • 1
          child: Container(
  • 1
            alignment: Alignment.center,
  • 1
            width: 30.0,
  • 1
            height: 40.0,
  • 1
            color: Colors.transparent,
  • 1
            child: Image.asset('assets/input_delete.png'),
  • 1
          ),
  • 1
        ),
  • 1
      ),
  • 1
    ],
  • 1
  ),
  • 1
  decoration: BoxDecoration(
  • 1
    ///边框
  • 1
    border: widget.bgBorder ?? InputBorder.none,
  • 1
  ),
  • 1
  margin: widget.margin ?? EdgeInsets.all(0.0),
  • 1
);
  • 1

}

void _inputValue(v) {

String _curV = '$v'.replaceAll(' ', '');
  • 1
print('编辑框输入的值:$_curV');
  • 1
///编辑框输入值
  • 1
widget._inputValueCallBack!(_curV);
  • 1

}

}

///编辑框输入值

typedef void InputValueCallBack(var inputValue);

bool isEmpty(String? s) {

return (null == s || “” == s.toString().trim() || “null” == s || ‘{}’ == s);

}

编辑框使用

class TextEditPage extends StatefulWidget {

TextEditPage({Key? key, required this.title}) : super(key: key);

final String title;

@override

_TextEditPageState createState() => _TextEditPageState();

}

class _TextEditPageState extends State {

@override

Widget build(BuildContext context) {

return Scaffold(
  • 1
  appBar: AppBar(
  • 1
    title: Text(widget.title),
  • 1
  ),
  • 1
  body: Center(
  • 1
      child: CusTextField((v) {},
  • 1
          hintText: '编辑框提示文本',
  • 1
          margin: EdgeInsets.only(left: 10.0, right: 10.0),
  • 1
          keyboardType: TextInputType.number,
  • 1
          bgBorder: Border.all(color: Colors.green, width: 1.0),
  • 1
          textAlign: TextAlign.start,
  • 1
          inputFontSize: 14.0,
  • 1
          labelText: Text('\t编辑框标题\t'))),
  • 1
);
  • 1

}

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

TextInputType.number,

          bgBorder: Border.all(color: Colors.green, width: 1.0),
  • 1
          textAlign: TextAlign.start,
  • 1
          inputFontSize: 14.0,
  • 1
          labelText: Text('\t编辑框标题\t'))),
  • 1
);
  • 1

}

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

[外链图片转存中…(img-hP9G2gmb-1715689557306)]

最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/816328
推荐阅读
相关标签
  

闽ICP备14008679号