-
Notifications
You must be signed in to change notification settings - Fork 19
Update en-US.mdx #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,99 @@ | ||
--- | ||
title: What are `StatefulWidget` Lifecycle methods. Explain briefly. | ||
--- | ||
|
||
- **createState() method:** Whenever a StatefulWidget is created, the framework calls this method to create fresh State objects. This method must be overridden. | ||
|
||
- **initState() method:** This method is the first method that is called while creating a StatefulWidget class. Here we allocate our resources, which means we can initialize our variable, data, and properties. | ||
|
||
- **didChangeDependencies() method:** This method is called just after initState() method when a dependency of this State object changes. For example, if the previous build was referencing an InheritedWidget that changes, this method notifies the object to change. Generally, subclasses don't override didChangeDependencies() method because the framework calls build() methods after dependency change. But to do some expensive work, let's say some network calls, the method is preferred over doing everything on build() method itself. | ||
- **didChangeDependencies() method:** Called immediately after `initState()` and again whenever an `InheritedWidget` that this `State` depends on changes (e.g., `MediaQuery`, `Theme`, or a localized resource). Ideal for context-dependent initialization or expensive work that shouldn’t run on every build. | ||
```dart | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add a line break before the code block. |
||
@override | ||
void didChangeDependencies() { | ||
super.didChangeDependencies(); // **Annotation:** must call super | ||
final locale = Localizations.localeOf(context); | ||
// Fetch or update data based on current locale | ||
} | ||
|
||
- **build() method:** Every time the widget is rebuilt, the build() method is used. This can happen after calling initState(), didChangeDependencies(), or didUpdateWidget(), or after changing the state with a call to setState(). | ||
|
||
- **didUpdateWidget() method:** This method is called whenever the widget configuration changes. This method exists for triggering side-effects when one of the parameters in the StatefulWidget changes. A typical example is implicitly animated widgets. | ||
- **didUpdateWidget() method:** Called whenever the parent widget rebuilds and supplies a new instance of this widget with updated properties. Override it to compare oldWidget vs. widget and trigger side-effects when specific parameters change, without recreating the whole State. | ||
```dart | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add a line break before the code block. |
||
@override | ||
void didUpdateWidget(covariant MyWidget oldWidget) { | ||
super.didUpdateWidget(oldWidget); // **Annotation:** must call super | ||
if (oldWidget.userId != widget.userId) { | ||
fetchUserData(widget.userId); | ||
} | ||
} | ||
|
||
- **setState() method:** This method notifies the framework that the internal state of this object has changed. The provided callback must be synchronous which might impact the user interface in the subtree. The framework schedules a build() for this current State object. | ||
|
||
- **deactivate() method:** The framework calls this method when the State is removed from the tree, temporarily or permanently. | ||
|
||
- **dispose() method:** This method is called when the State is removed from the tree, permanently. After the dispose() method is called, the State object is considered unmounted. Subclasses should override this method to release any resources retained by this object. | ||
|
||
# NOTE - | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use the |
||
- When overriding Flutter lifecycle methods, it’s crucial to know **where** to place your own code relative to the `super.methodName()` call. | ||
## The rule of thumb is: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use the |
||
|
||
- **Initialization methods**: `super` **first**, then your code | ||
- **Teardown methods**: your code **first**, then `super` | ||
|
||
## Initialization Methods | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use the |
||
|
||
These methods prepare both Flutter’s internals and your own state. Always let Flutter finish its setup before you start: | ||
|
||
### `initState()` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use the |
||
|
||
```dart | ||
@override | ||
void initState() { | ||
super.initState(); // 1. Flutter’s setup | ||
// 2. Your initialization (controllers, listeners, etc.) | ||
} | ||
```` | ||
|
||
### `didChangeDependencies()` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use the |
||
|
||
```dart | ||
@override | ||
void didChangeDependencies() { | ||
super.didChangeDependencies(); // 1. Update inherited dependencies | ||
// 2. Context-dependent initialization (e.g. fetch localized data) | ||
} | ||
``` | ||
|
||
### `didUpdateWidget()` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use the |
||
|
||
```dart | ||
@Override | ||
void didUpdateWidget(covariant MyWidget oldWidget) { | ||
super.didUpdateWidget(oldWidget); // 1. Flutter swaps widget instance | ||
// 2. Compare oldWidget vs. widget, trigger side-effects | ||
if (oldWidget.userId != widget.userId) { | ||
fetchUserData(widget.userId); | ||
} | ||
} | ||
``` | ||
|
||
--- | ||
|
||
## Teardown Methods | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use the |
||
|
||
When cleaning up, reverse the order: undo your additions before letting Flutter unmount: | ||
|
||
```dart | ||
@override | ||
void dispose() { | ||
// 1. Clean up your resources (controllers.dispose(), remove listeners…) | ||
myController.dispose(); | ||
super.dispose(); // 2. Flutter finalizes unmounting | ||
} | ||
``` | ||
|
||
```dart | ||
@override | ||
void deactivate() { | ||
// 1. Undo temporary hooks or animations | ||
subscription.cancel(); | ||
super.deactivate(); // 2. Flutter removes this State from tree | ||
} | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add the title, it is required for the Dart script to run.