initialize data once in initState and call the setState when data is ready causes exception
For everyone coming here at a later point
It is best to use the @override void didChangeDependencies ()
method of the State
class.
From the docs
This method is also called immediately after initState. It is safe to call BuildContext.inheritFromWidgetOfExactType from this method.
But make sure to check if you have already performed your initialization
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (bloc == null) { // or else you end up creating multiple instances in this case.
bloc = BlocProvider<MyBloc>.of(context);
}
}
Edit: Better answer below.
Apparently, you cannot access getData(context)
during initState
(more concrete: before it completed).
The reason, so I believe, is that getData
tries to look up an InheritedWidget
ancestor up in the tree, but the tree is just now being built (your widget is created during the parent widget's build
).
The obvious solution would be to delay getData
's lookup to a later point in time. There are several ways to achieve that:
- Delay the lookup to a later time.
scheduleMicrotask
should work fine. Look it up during the first
build
call. You could have anisInitialized
field set tofalse
and in youbuild
, something like:if (!isInitialized) { isInitialized = true; // TODO: do the getData(...) stuff }
an alternative is to put it inside PostFrameCallback
which is between initState
and Build
.
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) => getData());
super.initState();
}
getData() async {
}