I came across this example to get the Size/Position of a widget: https://medium.com/@diegoveloper/flutter-widget-size-and-position-b0a9ffed9407
what is wrong with my code?
I get the error:
The following NoSuchMethodError was thrown while handling a gesture:
I/flutter ( 8566): The method 'findRenderObject' was called on null.
I/flutter ( 8566): Receiver: null
I/flutter ( 8566): Tried calling: findRenderObject()
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(home: MyWidgetSizeTMP());
}
}
class MyWidgetSizeTMP extends StatefulWidget{
@override
MyWidgetSizeTMPState createState() {
return new MyWidgetSizeTMPState();
}
}
class MyWidgetSizeTMPState extends State<MyWidgetSizeTMP> {
//creating Key for red panel
GlobalKey _keyRed = GlobalKey();
_getSizes() {
final RenderBox renderBoxRed = _keyRed.currentContext.findRenderObject();
final sizeRed = renderBoxRed.size;
print("SIZE of Red: $sizeRed");
}
_getPositions() {
final RenderBox renderBoxRed = _keyRed.currentContext.findRenderObject();
final positionRed = renderBoxRed.localToGlobal(Offset.zero);
print("POSITION of Red: $positionRed ");
}
_afterLayout(_) {
_getSizes();
_getPositions();
}
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
),
body: Column(
children: <Widget>[
Flexible(
flex: 2,
child: Container(
color: Colors.red,
),
),
Flexible(
flex: 1,
child: Container(
color: Colors.purple,
),
),
Flexible(
flex: 3,
child: Container(
color: Colors.green,
),
),
Spacer(),
Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
MaterialButton(
elevation: 5.0,
padding: EdgeInsets.all(15.0),
color: Colors.grey,
child: Text("Get Sizes"),
onPressed: _getSizes,
),
MaterialButton(
elevation: 5.0,
color: Colors.grey,
padding: EdgeInsets.all(15.0),
child: Text("Get Positions"),
onPressed: _getPositions,
)
],
),
)
],
),
);
}
}
SizedBox is a built-in widget in flutter SDK. It is a simple box with a specified size.
In case if you want to adjust the children of Column or Row based on the screen's height or width, you can use the Expanded widget. The Expanded widget allows the widget to grow and fill the available space. By setting the appropriate flex value, you can size the flutter widget based on the screen's height and width.
You can use TextPainter to layout the text and get its width and height.
You can wrap in LayoutBuilder:
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
// height: constraints.maxHeight,
// width: constraints.maxWidth
return YourWidget();
}
);
This is because the _keyRed
is not attached to Context in your code.
to fix it -
@override
Widget build(BuildContext context) {
return Scaffold(
key: _keyRed, //Add this.
appBar: AppBar(
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With