焦點(diǎn)管理
在Flutter中TextField使用FocusNode
管理焦點(diǎn)
FocusNode focusNode = FocusNode();
TextField(
focusNode: focusNode,
)
獲取拔莱、取消焦點(diǎn):
//獲取
focusNode.requestFocus();
//取消
focusNode.unfocus();
取消所有焦點(diǎn)
FocusScope.of(viewService.context).requestFocus(FocusNode());
不使用FocusNode
藻丢,自動(dòng)獲取焦點(diǎn)
TextField(
autofocus: true,
)
TextEditingController
TextEditingController
繼承自ValueNotifier
口渔。
是TextField
的控制器伤极,可以獲取TextField
的內(nèi)容谎懦、設(shè)置TextField的內(nèi)容。
也可以直接使用TextField
的onChanged
签赃,可以直接獲取內(nèi)容谷异。
TextField(
onChanged: (value){
},
)
文字無(wú)法居中的問題
引用:https://mp.weixin.qq.com/s/2A9THwAFJyQPL7-Jgd-ZjA
給TextField
設(shè)置一個(gè)高度時(shí),會(huì)導(dǎo)致文字不居中姊舵,這是因?yàn)?code>contentPadding引起的
image.png
contentPadding
的計(jì)算規(guī)則:
(TextField的高度 - 文字高度) / 2
重新設(shè)置contentPadding
后
image.png
計(jì)算contentPadding
代碼如下??
EdgeInsets _calculateContentPadding(TextStyle style, double height) {
var textPainter = TextPainter(
text: TextSpan(
text:'',
style: style,
),
textDirection: TextDirection.ltr,
textWidthBasis: TextWidthBasis.longestLine,
)..layout();
return EdgeInsets.symmetric(horizontal: 12,vertical: (height - textPainter.height) / 2);
}
然而我發(fā)現(xiàn)當(dāng)高度比較低時(shí)晰绎,只是單純?cè)O(shè)置contentPadding
還是輕微不居中寓落,很細(xì)微括丁,看3這個(gè)字符就能看出來(lái)
image.png
我重新設(shè)置了一下
isCollapsed: true,
可以了。image.png