I just need some idea on how flutter stateful widgets build their stateful children when setState() is invoked. Please look at the code below.
class MyStatefulWidget extends StatefulWidget {
MyStatefulWidget({Key key}) : super(key: key);
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
Widget build(BuildContext context) {
print("Parent build method invoked");
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
StatefulChild(), // Keeping this line gives the output 1
statefulChild, // Keeping this line gives the output 2
RaisedButton(
child: Text('Click me'),
onPressed: () {
setState(() {});
},
)
],
),
),
);
}
StatefulChild statefulChild = StatefulChild();
}
class StatefulChild extends StatefulWidget {
StatefulChildState createState() => StatefulChildState();
}
class StatefulChildState extends State<StatefulChild> {
@override
Widget build(BuildContext context) {
print("Child00 build method invoked");
return Container();
}
}
When the RaisedButton is pressed,
Output 1 // Keeping only StatefulChild()
,
I/flutter ( 2903): Parent build method invoked
I/flutter ( 2903): Child00 build method invoked
Output 2 // Keeping only statefulChild
,
I/flutter ( 2903): Parent build method invoked
What is the difference here? What happens under the hood? Detailed explanation is much appreciated.
When the widget tree rebuilds, Flutter compares using ==
the previous and new widget returned by the build
method.
There are two scenarios in that situation:
==
is false
. In that case, Flutter will compare the runtimeType
& key
to know if the state of the previous widget should be preserved. Then Flutter calls build
on that widget
==
is true
. In which case, Flutter aborts the building of the widget tree (aka won't call build
).
This is an optimization possible thanks to the immutability of widgets.
Since widgets are immutable, if ==
haven't changed then it means that there's nothing to update. Flutter can therefore safely optimize that.
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