代码之家  ›  专栏  ›  技术社区  ›  swapnil mane

当我在颤振中向下滚动时,额定值变为零

  •  0
  • swapnil mane  · 技术社区  · 2 年前

    这是应用程序的屏幕截图。。。

      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 回复  |  直到 2 年前
        1
  •  1
  •   pmatatias    2 年前

    我认为这是一种飘飘然的行为。如果我们在listview上有很多子项,那么当我们向下滚动时,屏幕外的小部件将标记为脏小部件。 然后,当我们再次向后滚动时,flatter将重建小部件。

    Destruction mitigation

    您必须将额定值存储到对象状态。因此,当小部件重新构建时,该值将根据存储的值自动设置。

    其他简单解决方案(不推荐)

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

    下面是对 chaceExtent

    What exactly does cacheExtent property in ListView.Builder do?

        2
  •  1
  •   Kaushik Chandru    2 年前

    在onRatingUpdate中保存其值

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

    然后在initstate中得到如下值

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

    将此教师概念指定为ratingbar的初始值

        3
  •  1
  •   Shaan Mephobic    2 年前

    initialRating 因此,当你向下滚动并返回时,整个小部件将重建意义以达到性能目的,它不会将其保留在内存中,评级将重置。因此,您可以通过 onRatingUpdate 并将该变量传递到 intitialRating

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

    但是,在用户重新启动应用程序后,这些数据将被删除。因此,您可以将数据存储在数据库中,当用户返回时,将值替换为必要的变量。