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

学习分享,共勉

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(
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.all(
                        Radius.circular(30), //边角为30
                      ),
                      borderSide: BorderSide(
                        color: Colors.amber, //边线颜色为红色
                        width: 2, //边线宽度为2
                      ),
                    ),
                    focusedBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(
                          Radius.circular(30), //边角为30
                        ),
                        borderSide: BorderSide(
                          color: Colors.green, //边框颜色为绿色
                          width: 5, //宽度为5
                        ))),
              ),

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
super.initState();
_controller = TextEditingController();
_controller.addListener(() {
  _inputContro(_controller.text, false);
});
_focusNode.addListener(() {
  print('输入框是否获取焦点: ${_focusNode.hasFocus}');
  setState(() {
    _isFocus = _focusNode.hasFocus;
  });
});

}

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

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

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

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

编辑框完整编码

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,
  this.hintText = '',
  this.border,
  this.bgBorder,
  this.labelText,
  this.inputFontSize,
  this.textAlign = TextAlign.right,
  this.maxLine = 1,
  this.margin,
  this.keyboardType});

@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
super.initState();
_controller = TextEditingController();
_controller.addListener(() {
  _inputContro(_controller.text, false);
});
_focusNode.addListener(() {
  print('输入框是否获取焦点: ${_focusNode.hasFocus}');
  setState(() {
    _isFocus = _focusNode.hasFocus;
  });
});

}

@override

void dispose() {

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

}

void _inputContro(v, bool isInput) {

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

}

@override

Widget build(BuildContext context) {

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

}

void _inputValue(v) {

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

}

}

///编辑框输入值

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

}

最后

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

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

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

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

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

TextInputType.number,

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

}

最后

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

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

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

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

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

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

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值