fluttertext内容⾼度不定问题解决
遇到⼀个listview嵌套listview ⾥⾯的item的Text内容⾼度不确定,
英⽂,数字普遍⽐汉字低4.0 所以最后有三种解决办法,⼀种是给listview加key ⼀种是强制输⼊汉字,第三种是加上缺失⾼度从⽽固定⾼度。
⼜遇到了获取widget的⾼度的问题,这⾥有三种⽅法,都很准确。
想要获取widget的尺⼨,必须要等widget的layout结束之后才能取到,⽬前有三种⽅式
通过BuildContext获取
通过GlobalKey获取
通过SizeChangedLayoutNotifier获取
通过BuildContext获取
widget的尺⼨存在于context?.findRenderObject()?.paintBounds?.size中,过早获取可能为空,需要延时获取.在flutter1.7之
前duration=Duration()就能获取到,但是1.7之后必须要设置⼀百毫秒以上才⾏.
class FindSizeWidget extends StatefulWidget {
@override
_FindSizeWidgetState createState() => _FindSizeWidgetState();
}
class _FindSizeWidgetState extends State<FindSizeWidget> {
@override
Widget build(BuildContext context) {
/// 延时⼀下,需要等state layout结束之后才能获取size
Future.delayed(Duration(milliseconds: 100), () {
_printSize();
});
return _buildContentWidget();
}
Widget _buildContentWidget(){
return Container(
color: d,
child: Text(
'''
1 (1)
2 (2)
3 (3)
4 (4)
''',
style: TextStyle(fontSize: 30),
maxLines: null,
softWrap: true,
),
);
}
_printSize(){
if (!mounted) return;
var size = context?.findRenderObject()?.paintBounds?.size;
String());
}
}
打印结果:
flutter: Size(277.0, 180.0)
通过GlobalKey获取
给FindSizeWidget增加构造⽅法,通过外部传⼊GlobalKey,⽅便以后寻到t对象.
class FindSizeWidget extends StatefulWidget {
const FindSizeWidget({Key key}) : super(key:key);
}
注意⼀个GlobalKey只能对应⼀个widget对象,当⼼复⽤问题.
增加⼀个获取尺⼨的按钮.点击之后获取尺⼨.
class _MyApp extends State<MyApp> {
GlobalKey _globalKey = GlobalKey();
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
FlatButton(
onPressed: () {
var size = _globalKey.currentContext
.findRenderObject()
.
paintBounds
.size;
String());
},
child: Text("获取尺⼨")),
FindSizeWidget(
key: _globalKey,
)
],
);
}
}
打印结果:
flutter: Size(277.0, 180.0)
通过SizeChangedLayoutNotifier获取
使⽤SizeChangedLayoutNotifier⽅式,Widget会在layout结束之后会发出⼀个LayoutChangedNotification通知,我们只需要接收这个通知,即可获取尺⼨信息,但是SizeChangedLayoutNotifier的RenderObject是_RenderSizeChangedWithCallback类,它在第⼀次布局完成之后并不会发出通知,所以我们要⾃定义SizeChangedLayoutNotifier和_RenderSizeChangedWithCallback两个类.
_RenderSizeChangedWithCallback源码部分:
@override
void performLayout() {
super.performLayout();
// Don't send the initial notification, or this will be SizeObserver all
// over again!
if (_oldSize != null && size != _oldSize)
onLayoutChangedCallback();
_oldSize = size;
}
修改_RenderSizeChangedWithCallback,只需要去掉_oldSize != null的判断即可.
@override
void performLayout() {
super.performLayout();
// Don't send the initial notification, or this will be SizeObserver all
/
/ over again!
if (size != _oldSize)
onLayoutChangedCallback();
_oldSize = size;
}
再修改_FindSizeWidgetState的build⽅法:
@override
Widget build(BuildContext context) {textstyle
return NotificationListener<LayoutChangedNotification>( onNotification: (notification) {
/// 收到布局结束通知,打印尺⼨
_printSize();
/
// flutter1.7之后需要返回值,之前是不需要的.
return null;
},
child: CustomSizeChangedLayoutNotifier(
child: _buildContentWidget(),
),
);
}
打印结果:
flutter: Size(277.0, 180.0)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论