赞
踩
Android高级架构师进阶之路
题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。