How to force initState every time the page is rendered in flutter?
Solution 1
First thing is you can't force
initState
to rebuild your widget. For that you havesetState
to rebuild your widget. As far as I can understand you want to recallinitState
just to call_getrecent()
again.
Here's what you should ideally do :
A simple solution would be to use FutureBuilder. You just need to use _getrecent()
in FutureBuilder
as parent where you want to use the data you get from _getrecent()
. This way everytime your Widget
rebuilds it will call _getrecent()
.
Solution 2
you can override didChangeDependencies
method. Called when a dependency of the [State] object changes as you use the setState
,
@override
void didChangeDependencies() {
// your codes
}
Also, you should know that using setState
updates the whole widget, which has an overhead. To avoid that you should const
, declaring a widget const will only render once so it's efficient.
ag2byte
Updated on December 30, 2022Comments
-
ag2byte over 1 year
I am adding some data into the
SharedPreferences
on page2 of my app and I am trying to retrieve the data on the homepage. I have used an init function on page 1 as follows:@override void initState() { super.initState(); _getrecent(); } void _getrecent() async { final prefs = await SharedPreferences.getInstance(); // prefs.clear(); String b = prefs.getString("recent").toString(); Map<String, dynamic> p = json.decode(b); if (b.isNotEmpty) { print("Shared pref:" + b); setState(() { c = Drug.fromJson(p); }); cond = true; } else { print("none in shared prefs"); cond = false; } }
Since the
initState()
loads only once, I was wondering if there was a way to load it every time page1 is rendered. Or perhaps there is a better way to do this. I am new to flutter so I don't have a lot of idea in State Management. -
ag2byte almost 3 yearsShould I change the return type of
_getrecent()
to something other thanvoid
? -
Shubhamhackz almost 3 yearsAs I can see in the code you shared that you're using
c = Drug.fromJson(p);
value somewhere in your widget. Ideally you should return this value and wrapFutureBuilder
to the widget which needs this value.