Rating becomes zero when i scroll down in flutter

324 views Asked by At

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

3

There are 3 answers

7
pmatatias On BEST ANSWER

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?

4
Shaan Mephobic On

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.

0
Kaushik Chandru On

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