Home > Software design >  Rating becomes zero when i scroll down in flutter
Rating becomes zero when i scroll down in flutter

Time:07-30

I am using flutter rating bar package to give feedback to particular section then rating becomes back to 0. ho w can i persist the given rating constant .

Here is the screenshot of the app ...

  RatingBar(
                                    initialRating: 0,
                                    direction: Axis.horizontal,
                                    allowHalfRating: false,
                                    itemCount: 5,
                                    ratingWidget: RatingWidget(
                                        full: const Icon(Icons.star,
                                            color: Colors.orange),
                                        half: const Icon(
                                          Icons.star_half,
                                          color: Colors.orange,
                                        ),
                                        empty: const Icon(
                                          Icons.star_outline,
                                          color: Colors.orange,
                                        )),
                                    onRatingUpdate: (value) {}),

enter image description here

CodePudding user response:

i think its a flutter behavior. in case we have much children on listview, then when we scrolldown, the widget that out of screen will marked as dirty widget. then when we back scroll again , flutter will rebuild the widget.

Flutter already provide the solution here called

Destruction mitigation

you have to store the rating value to the object state. so when the widget get re-build , the value will automatically set from stored value.

other simple solution (not recomended) you can extend the cache of listview.

ListView(
 shrinkwrap: true,
 cacheExtent : 99999999 
 children: [
   RatingWidget(),
  ],

here the explanation to the chaceExtent

or another question in stackoverflow What exactly does cacheExtent property in ListView.Builder do?

CodePudding user response:

In onRatingUpdate save its value

onRatingUpdate :(val) async{
 SharedPreferences prefs = await SharedPreferences.getInstance();
 prefs.setInt("teacherConcept", val);
}

Then in initstate get the value like

SharedPreferences prefs = SharedPreferences.getInstance();
int teacherConcept = prefs.get("teacherConcept", true);

Assign this teacher concept as the initial value of the ratingbar

CodePudding user response:

That is because you have set initialRating to 0. So when you scroll down and come back up the whole widget rebuilds meaning for performance purposes it does not keep it in memory and the ratings get reset. So, what you can do is set the ratings set by the user into a variable through the onRatingUpdate and pass that variable into intitialRating

Map<String, int> ratings={'subjectClear':0, 'subjectVarieties':0}; // add other 8 as well
...
...
initialRating: ratings['subjectClear'],
onRatingUpdate: (value){
  rating['subjectClear'] = value;
  },
...

Still this data will be erased after the user restarts the app. So what you can do is store the data in a database and when the user returns substitute the values to the necessary variables.

  • Related