首页 > 解决方案 > 复选框刷新 Flutter

问题描述

我正在尝试拥有一系列项目,而我的 CheckBox 没有更新(不改变状态)。

 Widget materialRow(
      String title, String pago, String text, double width, bool bandera) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
    
        Checkbox(
          value: bandera,
          onChanged: (bool newValue) {
            
            setState(() {
              bandera = newValue;
            });
          },
        ),
        Container(
          height: 180,
          width: width * 0.70,
          decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(25),
              border: Border.all(color: Utils.colorgreen)),
          child: Padding(
            padding: const EdgeInsets.all(10.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                Text(
                  title,
                  style: Utils.styleGreenTitle,
                ),
                Text(pago),
                Text(text),
              ],
            ),
          ),
        ),
      ],
    );
  }

仅在构建方法中我调用该函数 3 次

  materialRow(
                      "Gratuita",
                      "",
                      "Veras anuncios debes en cuando y solo podras agregar un oficio o profesion",
                      width,
                      checkPlease),

我为两个调用发送相同的变量

标签: flutter

解决方案


问题是当您触发重建时您正在更改的变量setState. 您可能会对在函数中构建的小部件而不是直接在State.

当你这样做时bandera = newValue;,你将参数 bandera设置为newValue. 您实际上并没有更改存储在State. 因此bandera = newValue;,为您的应用程序做的很少。在下一次重建时,该值将再次被 的值覆盖checkPlease。如果这是 anObject而不是原语,这可能不是问题,bool因为它会通过引用传递,并且通过正确的实现,它会解决的。

所以你必须做的是设置checkPlease变量。这很可能存储在buildandmaterialRow函数之外,这使得它能够在重建中幸存下来。

改变

setState(() {
  bandera = newValue;
});

setState(() {
  checkPlease= newValue;
});

替代:

除了将 a 传递boolmaterialRow函数之外,还传递一个回调

setState(() {
  checkPlease= newValue;
});

materialRow功能。如果您由于某种原因无法访问checkPlease该功能,则将使用此materialRow功能。

前任。

void callback(bool newValue) {
  setState(() {
    checkPlease= newValue;
  });
}

//Add callback as a parameter
Widget materialRow(String title, String pago, String text, double width, bool bandera, Function(bool) callback) {
   ...
          onChanged: callback,
   ...
}

//Function usage
materialRow(
  "Gratuita",
  "",
  "Veras anuncios debes en cuando y solo podras agregar un oficio o profesion",
  width,
  checkPlease,
  callback
),
 

推荐阅读