GlobalKey in Flutter :
- All widgets should have a Key key as optional parameter or their constructor. Key is something used by flutter engine at the step of recognizing which widget in a list as changed.
For example:
final mainKey = GlobalKey<ScaffoldState>();
Scaffold(key: mainKey);
mainKey.currentState.showSnackBar(snackbar);
Best your answer in interview
When your page 4 Tab 1 tab counter box 2 and 3 page counter + and last tab is counter -.
- A key that is unique across the entire app.
- Global keys uniquely identify elements. Global keys provide access to other objects that are associated with those elements, such as BuildContext. For StatefulWidgets, global keys also provide access to State.
- Widgets that have global keys reparent their subtrees when they are moved from one location in the tree to another location in the tree. In order to reparent its subtree, a widget must arrive at its new location in the tree in the same animation frame in which it was removed from its old location in the tree.
- Reparenting an Element using a global key is relatively expensive, as this operation will trigger a call to State.deactivate on the associated State and all of its descendants; then force all widgets that depends on an InheritedWidget to rebuild.
- If you don’t need any of the features listed above, consider using a Key, ValueKey, ObjectKey, or UniqueKey instead.
- You cannot simultaneously include two widgets in the tree with the same global key. Attempting to do so will assert at runtime.

When use GlobalKey in flutter?
Main Use:
- They allow widgets to change parents anywhere in your app without losing state, or they can be used to access information about another widget in a completely different part of the widget tree. An example of the first scenario might if you wanted to show the same widget on two different screens, but holding all the same state, you’d want to use a GlobalKey.
- Validation
- final _formKey = GlobalKey<FormState>();
Create a global key that uniquely identifies the Form widget and allows validation of the form.
- PageStorageKeys are specialized keys that store a user’s scroll location so that the app can preserve it for later.
- SnackBar
- RenderBox
- Swap position
void main() => runApp(new MaterialApp(home: PositionedTiles())); class PositionedTiles extends StatefulWidget { @override State<StatefulWidget> createState() => PositionedTilesState(); } class PositionedTilesState extends State<PositionedTiles> { List<Widget> tiles = [ StatelessColorfulTile(), StatelessColorfulTile(), ]; @override Widget build(BuildContext context) { return Scaffold( body: Row(children: tiles), floatingActionButton: FloatingActionButton( child: Icon(Icons.sentiment_very_satisfied), onPressed: swapTiles), ); } swapTiles() { setState(() { tiles.insert(1, tiles.removeAt(0)); }); } } class StatelessColorfulTile extends StatelessWidget { Color myColor = UniqueColorGenerator.getColor(); @override Widget build(BuildContext context) { return Container( color: myColor, child: Padding(padding: EdgeInsets.all(70.0))); } }
Example: 2
void main() => runApp(new MaterialApp(home: PositionedTiles())); class PositionedTiles extends StatefulWidget { @override State<StatefulWidget> createState() => PositionedTilesState(); } class PositionedTilesState extends State<PositionedTiles> { // Stateful tiles now wrapped in padding (a stateless widget) to increase height // of widget tree and show why keys are needed at the Padding level. List<Widget> tiles = [ Padding( padding: const EdgeInsets.all(8.0), child: StatefulColorfulTile(key: UniqueKey()), ), Padding( padding: const EdgeInsets.all(8.0), child: StatefulColorfulTile(key: UniqueKey()), ), ]; @override Widget build(BuildContext context) { return Scaffold( body: Row(children: tiles), floatingActionButton: FloatingActionButton( child: Icon(Icons.sentiment_very_satisfied), onPressed: swapTiles), ); } swapTiles() { setState(() { tiles.insert(1, tiles.removeAt(0)); }); } } class StatefulColorfulTile extends StatefulWidget { StatefulColorfulTile({Key key}) : super(key: key); @override ColorfulTileState createState() => ColorfulTileState(); } class ColorfulTileState extends State<ColorfulTile> { Color myColor; @override void initState() { super.initState(); myColor = UniqueColorGenerator.getColor(); } @override Widget build(BuildContext context) { return Container( color: myColor, child: Padding( padding: EdgeInsets.all(70.0), )); } }
6) Dismissible
Each Dismissible must contain a Key. Keys allow Flutter touniquely identify Widgets.
7) Access using other page
import 'package:flutter/material.dart'; main() { runApp(MaterialApp( theme: ThemeData( primarySwatch: Colors.indigo, ), home: App(), )); } class App extends StatefulWidget { @override State<App> createState() => _AppState(); } class _AppState extends State<App> { GlobalKey<_CounterState> _counterState; @override void initState() { super.initState(); _counterState = GlobalKey(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: Center( child: Column( children: <Widget>[ Counter( key: _counterState, ), ], )), floatingActionButton: FloatingActionButton( child: Icon(Icons.navigate_next), onPressed: () { Navigator.of(context).push( MaterialPageRoute(builder: (context) { return Page1(_counterState); }), ); }, ), ); } } class Counter extends StatefulWidget { const Counter({ Key key, }) : super(key: key); @override _CounterState createState() => _CounterState(); } class _CounterState extends State<Counter> { int count; @override void initState() { super.initState(); count = 0; } @override Widget build(BuildContext context) { return Row( children: <Widget>[ IconButton( icon: Icon(Icons.add), onPressed: () { setState(() { count++; }); }, ), Text(count.toString()), ], ); } } class Page1 extends StatefulWidget { final GlobalKey<_CounterState> counterKey; Page1( this.counterKey); @override _Page1State createState() => _Page1State(); } class _Page1State extends State<Page1> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: Center( child: Row( children: <Widget>[ IconButton( icon: Icon(Icons.add), onPressed: () { setState(() { widget.counterKey.currentState.count++; print(widget.counterKey.currentState.count); }); }, ), Text( widget.counterKey.currentState.count.toString(), style: TextStyle(fontSize: 50), ), ], ), ), ); } }
The flutter tutorial is a website that bring you the latest and amazing resources of code. All the languages codes are included in this website. The languages like flutter, android, java,kotlin etc.with the help of this languages any user can develop the beautiful application
For more information about Flutter. visit www.fluttertutorial.in