Skip to content

Instantly share code, notes, and snippets.

@talesluna
Last active December 11, 2022 18:02
Show Gist options
  • Save talesluna/14379dcc5d456a58326d797aa5d5a1b1 to your computer and use it in GitHub Desktop.
Save talesluna/14379dcc5d456a58326d797aa5d5a1b1 to your computer and use it in GitHub Desktop.
Reimplementation of flutter StatelessWidget to get direct lifecycle methods on stateless widgets
import 'package:flutter/material.dart' as material;
class StatelessElement extends material.StatelessElement {
StatelessElement(
super.widget, {
this.onCreate,
this.onDispose,
this.afterBuild,
this.afterCreate,
});
final void Function()? onCreate;
final void Function()? onDispose;
final void Function()? afterBuild;
final void Function()? afterCreate;
@override
void unmount() {
_runLifecycleCallback(onDispose);
super.unmount();
}
@override
void mount(material.Element? parent, Object? newSlot) {
_runLifecycleCallback(onCreate);
super.mount(parent, newSlot);
}
@override
material.Widget build() {
_runLifecycleCallback(afterCreate);
final widget = super.build();
_runLifecycleCallback(afterBuild);
return widget;
}
void _runLifecycleCallback(Function()? callback) {
if (callback is Function) {
callback!();
}
}
}
/// StatelesWidget reimplementation to get a lifecycle methods for Widgets
///
/// - onCreate - Called when Stateless Widget is instantiated
/// - afterCreate - Called after the complete creation of StatelessWidget and before build()
/// - afterBuild - Called immediately after StatelessWidget build()
/// - onDispose - Called when the StatelessWidget is unmounted
///
/// Example:
/// ```
/// class MyWidget extends StatelessWidget {
///
/// @override
/// void onCreate() {
/// print('My widget has been instantiated');
/// }
///
/// @override
/// void afterCreate() {
/// print('My widget has been instantiated and will be able to build()');
/// }
///
/// @override
/// void afterBuild() {
/// print('My widget was builded by build() method');
/// }
///
/// @override
/// void onDispose() {
/// print('My widget was unmounted');
/// }
///
/// @override
/// Widget build(BuildContext context) {
/// return Center(
/// child: Text('MyWidget'),
/// );
/// }
/// }
/// ```
///
abstract class StatelessWidget extends material.StatelessWidget {
const StatelessWidget({super.key});
@override
material.StatelessElement createElement() {
return StatelessElement(
this,
onCreate: onCreate,
onDispose: onDispose,
afterBuild: afterBuild,
afterCreate: afterCreate,
);
}
/// onCreate is called immediately after instantiating a StatelessWidget
@material.protected
void onCreate() {}
/// afterCreate is called after the StatelessWidget has completed initialization but before the build() starts
@material.protected
void afterCreate() {}
/// afterBuild is called immediately after StatelessWidget build()
@material.protected
void afterBuild() {}
/// onDispose is called when the StatelessWidget is unmounted
@material.protected
void onDispose() {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment