学习分享,共勉
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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!