Last active
December 11, 2022 18:02
-
-
Save talesluna/14379dcc5d456a58326d797aa5d5a1b1 to your computer and use it in GitHub Desktop.
Reimplementation of flutter StatelessWidget to get direct lifecycle methods on stateless widgets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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