Flutter调试组件:打印任意组件尺寸位置信息 NRenderBox
2026年2月28日 22:20
一、需求来源
当页面元素特别多,比较杂,又必须获取某个组件尺寸位置时,一个个加 GlobalKey 有太麻烦,这是使用一个封装好的组件就特别有用了。然后就有了 NRenderBox 组件,可以打印出子组件的位置及尺寸。
二、使用
NRenderBox(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: Colors.transparent,
border: Border.all(color: Colors.blue),
borderRadius: BorderRadius.all(Radius.circular(0)),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
NNetworkImage(
width: 50,
height: 60,
url: AppRes.image.urls.random ?? '',
),
Text("选项"),
],
),
),
)
flutter: NRenderBox rect: Rect.fromLTRB(88.5, 322.0, 157.5, 413.0)
三、NRenderBox源码
import 'package:flutter/material.dart';
/// 点击打印尺寸
class NRenderBox extends StatefulWidget {
const NRenderBox({
super.key,
required this.child,
});
final Widget child;
@override
State<NRenderBox> createState() => _NRenderBoxState();
}
class _NRenderBoxState extends State<NRenderBox> {
final renderKey = GlobalKey();
RenderBox? get renderBox {
final ctx = renderKey.currentContext;
if (ctx == null) {
return null;
}
final box = ctx.findRenderObject() as RenderBox?;
return box;
}
Offset? get renderPosition {
return renderBox?.localToGlobal(Offset.zero);
}
@override
Widget build(BuildContext context) {
return GestureDetector(
key: renderKey,
onTap: () {
if (renderBox == null) {
return;
}
final position = renderPosition;
final size = renderBox!.size;
final rect = Rect.fromLTWH(position!.dx, position.dy, size.width, size.height);
debugPrint("$widget rect: $rect");
},
child: widget.child,
);
}
}