Minimal reproducible code:
class MainScreen extends StatefulWidget {
@override
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(onPressed: () => setState(() {})),
body: FooPage(key: ValueKey(0)),
);
}
}
class FooPage extends StatelessWidget {
FooPage({super.key});
final int _number = math.Random().nextInt(100);
@override
Widget build(BuildContext context) {
print('number = $_number');
return Container();
}
}
Each time you click the FAB, the number prints a new value. But as I'm already passing same key to the FooPage, why is it the MainScreen creates a new FooPage instance from scratch instead of using the existing one (with key 0)?
NOTE:
Please don't post answers to use const FooPage() after declaring a const constructor in the FooPage or assign FooPage to a final instance field in the MainScreen etc.
CodePudding user response:
Adding a key to a StatelessWidget doesn't make it stateful (remebering the random int).
I.e. the framework will still dispose and rebuild it as a new instance when deemed necessary.
