【问题标题】:Cannot update a single widget after all widgets are built构建所有小部件后无法更新单个小部件
【发布时间】:2021-12-12 06:44:07
【问题描述】:

我开发了一个应用程序来组织晚餐的快捷菜单。有 6 个食谱作为列表图块。我也有记分牌。记分牌显示随机生成的菜单的总值。分数是根据菜谱的一些数值属性计算出来的。

问题是我无法在加载所有配方图块后更新记分牌。当我打电话时

setState(){
  _score = _getScore();
}

所有小部件都被重建。然后,所有的配方小部件都用新配方重新绘制。

它会导致无限循环的重建。

_score 变量用于记分板小部件。

问题是, 如何只更新记分板小部件而不触发所有小部件重新进行?

---- 编辑/添加----

截图及相关代码如下。

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
            child: Column(
               children: <Widget>[
                  _buildScoreboard(),
                  _buildRecipeTile(context, RecipeType.maindish),
                  _buildRecipeTile(context, RecipeType.soup),
                  _buildRecipeTile(context, RecipeType.salad),
                  _buildRecipeTile(context, RecipeType.dessert),
                  _buildRecipeTile(context, RecipeType.bakery),
                  _buildRecipeTile(context, RecipeType.drink),
                ],
             ),
         ),
    );
  }
        

我要更新Text('$_score')

Widget _buildScoreboard() {
    return Text('$_score');
  }

配方图块小部件中有一个 FutureBuilder。而且,我们在加载每个图块后计算分数:_score = _getScore();

Widget _buildRecipeTile(BuildContext context, RecipeType recipeType) {
    CollectionReference cr = FirebaseFirestore.instance.collection('meals');

    return FutureBuilder<DocumentSnapshot>(
      future: cr.where("type", isEqualTo: recipeType.index).get().then((value) {
        return value.docs.elementAt(random.nextInt(value.size));
      }),
      builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            ...
            _score = _getScore();
            ...
          }
    );
  }

【问题讨论】:

    标签: flutter widget setstate


    【解决方案1】:

    您需要确定要更新的小部件(记分牌?),我们称之为YourNormalWidget 您需要将其包装在StatefulBuilder 中。

    这将使您能够访问仅适用于此小部件(不适用于构建的其余部分)的新 setState

    代码:

          return StatefulBuilder(builder: (BuildContext context, StateSetter setPartialStateOnly) {
            return YourNormalWidget(
    
              //your normal code... then:
                setPartialStateOnly(() {
                  yourVariable = updatedValues
                });
            )
    

    不是说普通的setState,而是叫新的setPartialStateOnly

    如果这没有帮助,请告诉我。

    【讨论】:

    • 我坚信您的解决方案会奏效。 :D 但我无法将它应用到我的代码中。我已将我的代码 sn-ps 添加到我的帖子中。请检查一下。
    • 我已经使用ValueListenableBuilder 解决了这个问题。 api.flutter.dev/flutter/widgets/…
    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2012-06-02
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多