How to call a function on start in Flutter stateless widgets

Dane Mackier
FilledStacks
Published in
2 min readMay 3, 2019

--

Flutter Stateless widget startup logic

One of the most common scenarios in Mobile development is calling an async function when a new view is shown. In Flutter this can be done using a stateful widget and calling your code in the initState function.

class Example extends StatefulWidget {
Example({Key key}) : super(key: key);
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> { @override
void initState() {
_getThingsOnStartup().then((value){
print('Async done');
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Container();
}
Future _getThingsOnStartup() async {
await Future.delayed(Duration(seconds: 2));
}
}

What if you want to call it from a stateless widget? Well, that’s possible too. Use a stateful widget as a your root widget that you can provide a callback function too to execute your startup logic. See example below.

Create a StatefulWrapper that takes in a function to call and a child to display.

/// Wrapper for stateful functionality to provide onInit calls in stateles widget
class StatefulWrapper extends StatefulWidget {
final Function onInit;
final Widget child;
const StatefulWrapper({@required this.onInit, @required this.child}); @override
_StatefulWrapperState createState() => _StatefulWrapperState();
}
class _StatefulWrapperState extends State<StatefulWrapper> {@override
void initState() {
if(widget.onInit != null) {
widget.onInit();
}
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}

Wrap your stateles widget’s UI in a StatefulWrapper and pass on the onInit logic you would like to run

class StartupCaller extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StatefulWrapper(
onInit: () {
_getThingsOnStartup().then((value) {
print('Async done');
});
},
child: Container(),
);
}
Future _getThingsOnStartup() async {
await Future.delayed(Duration(seconds: 2));
}
}

and that’s it. The function will only be called once when the stateful widget is initialized. Checkout all the tutorials here you might find some more Flutter magic.

--

--

Dane Mackier
FilledStacks

A full stack software developer focused on building mobile products, its tools and architecture. Always reducing boiler plate code and experimenting.