He estado tratando de obtener una casilla de verificación para habilitar un botón cuando está marcado o tener el botón deshabilitado cuando la casilla de verificación no está marcada y parece que no puedo hacer que funcione correctamente. Actualmente puedo hacer clic en la casilla de verificación, pero el botón permanece desactivado. La casilla de verificación cambia correctamente el estado de marcado a no marcado, pero el botón no refleja estos cambios. ¿Alguien ha visto los problemas con mi código y tiene algún consejo? ¡Se agradece cualquier ayuda! ¡Gracias!

Código de casilla de verificación

                        Container(
                          margin: EdgeInsets.all(17),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: [
                              Flexible(
                                  child: Text(
                                "You agree by checking this box",
                                style: TextStyle(
                                    color: Colors.black,
                                    fontWeight: FontWeight.bold),
                              )),
                            ],
                          ),
                        ),
                        SizedBox(
                          height: 7,
                        ),
                        Padding(
                          padding: EdgeInsets.only(left: 20),
                          child: Container(
                            child: Row(
                              children: [
                                Container(
                                  width: 20,
                                  height: 20,
                                  child: new StatefulBuilder(
                                    builder: (BuildContext context,
                                        StateSetter setState) {
                                      return new Transform.scale(
                                        scale: 2.0,
                                        child: Checkbox(
                                          value: isCheck,
                                          checkColor: Colors.green,
                                          activeColor: Colors.grey,
                                          onChanged: (bool value) {
                                            setState(() {
                                              isCheck = value;
                                            });
                                          },
                                        ),
                                      );
                                    },
                                  ),
                                ),

Código de botón

                                Container(
                                  width:
                                      MediaQuery.of(context).size.width * .45,
                                  height:
                                      MediaQuery.of(context).size.height * .09,
                                  child: RaisedButton(
                                    textColor: Colors.white,
                                    color: Colors.green,
                                    shape: RoundedRectangleBorder(
                                        borderRadius:
                                            BorderRadius.circular(10)),
                                    child: Text(
                                      "Verify Quarterly Report",
                                      style: TextStyle(
                                          fontWeight: FontWeight.bold,
                                          fontSize: 14),
                                    ),
                                    onPressed: isCheck ? () => submitReport() : null,
                                  ),
                                )
0
Carter 27 oct. 2020 a las 18:09

1 respuesta

La mejor respuesta

Como se indicó y se explicó en mi comentario anterior, aquí está el código que funciona y demuestra lo que está tratando de lograr:

No necesitas envolver tu CheckBox con un StatefulBuilder, si lo haces, Flutter helps you create a widget that both has state and delegates its build to a callback. por lo tanto, activar el setState no activa el setState de su Screen inicial o Widget.

Aquí hay una demostración que funciona eliminando el uso de StatefulBuilder.

   body: Column(
        children: [
          Container(
            margin: EdgeInsets.all(17),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Flexible(
                    child: Text(
                  "You agree by checking this box",
                  style: TextStyle(
                      color: Colors.black, fontWeight: FontWeight.bold),
                )),
              ],
            ),
          ),
          SizedBox(
            height: 7,
          ),
          Padding(
            padding: EdgeInsets.only(left: 20),
            child: Container(
              child: Row(
                children: [
                  Container(
                    width: 20,
                    height: 20,
                    child: Transform.scale(
                      scale: 2.0,
                      child: Checkbox(
                        value: isCheck,
                        checkColor: Colors.green,
                        activeColor: Colors.grey,
                        onChanged: (bool value) {
                          setState(() {
                            isCheck = value;
                          });
                        },
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
          Container(
            width: MediaQuery.of(context).size.width * .45,
            height: MediaQuery.of(context).size.height * .09,
            child: RaisedButton(
              textColor: Colors.white,
              color: Colors.green,
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(10)),
              child: Text(
                "Verify Quarterly Report",
                style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14),
              ),
              onPressed: isCheck ? () => submitReport() : null,
            ),
          ),
        ],
      ),
1
void 27 oct. 2020 a las 16:22