AlertDialog 上的 Flutter 状态管理

问题描述 投票:0回答:1

我正在尝试实现一个使用日期选择器来更改日期的系统,但我是在警报对话框上执行此操作,当我使用日期选择器更改值时,它在警报对话框屏幕中不会更改。除非我关闭并再次打开警报对话框,否则日期保持不变。在这种情况下我该如何改变状态?下代码:

updateInfo(BuildContext context) {
    placaController = TextEditingController(text: widget.infoApanha.placa);
    motoristaController =
        TextEditingController(text: widget.infoApanha.motorista);
    fimApanha = widget.infoApanha.dtFimApanha;
    saidaAviario = widget.infoApanha.dtSaidaAviario;
    AlertDialog alert = AlertDialog(
      title: Center(child: Text(widget.infoApanha.granja)),
      content: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          CustomTextFormField(
            title: 'PLACA DO VEÍCULO',
            validator: validator,
            controller: placaController,
          ),
          CustomTextFormField(
            title: 'MOTORISTA',
            validator: validator,
            controller: motoristaController,
          ),
          const FittedBox(
            fit: BoxFit.scaleDown,
            child: Padding(
              padding: EdgeInsets.fromLTRB(10, 8, 10, 0),
              child: Text('DATA E HORA FIM EMBARQUE'),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8),
            child: Container(
              padding: const EdgeInsets.all(8),
              width: double.infinity,
              decoration: BoxDecoration(
                  border: Border.all(color: Colors.red),
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(10)),
              child: FittedBox(
                fit: BoxFit.scaleDown,
                child: Row(
                  children: [
                    Text(DateFormat('dd/MM/yyyy HH:mm').format(fimApanha)),
                    IconButton(
                      onPressed: pickFimApanha,
                      icon: const Icon(
                        Icons.calendar_month,
                        color: Colors.red,
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
          const FittedBox(
            fit: BoxFit.scaleDown,
            child: Padding(
              padding: EdgeInsets.fromLTRB(10, 8, 10, 0),
              child: Text('DATA E HORA SAIDA AVIÁRIO'),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8),
            child: Container(
              padding: const EdgeInsets.all(8),
              width: double.infinity,
              decoration: BoxDecoration(
                  border: Border.all(color: Colors.red),
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(10)),
              child: FittedBox(
                fit: BoxFit.scaleDown,
                child: Row(
                  children: [
                    Text(DateFormat('dd/MM/yyyy HH:mm').format(saidaAviario)),
                    IconButton(
                      onPressed: pickSaidaAviario,
                      icon: const Icon(
                        Icons.calendar_month,
                        color: Colors.red,
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
      actions: [
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              Expanded(
                child: SizedBox(
                  width: double.infinity,
                  child: ElevatedButton(
                    onPressed: () async {
                      await Provider.of<InfoApanhaList>(context, listen: false)
                          .atualizaInfoApanha(
                        InfoApanha(
                          id: widget.infoApanha.id,
                          granja: widget.infoApanha.granja,
                          placa: placaController.text,
                          motorista: motoristaController.text,
                          dtFimApanha: fimApanha,
                          dtSaidaAviario: saidaAviario,
                        ),
                      );
                      Navigator.pop(context);
                    },
                    child: const Text('ENVIAR'),
                  ),
                ),
              ),
              const SizedBox(width: 20,),
              Expanded(
                child: SizedBox(
                  width: double.infinity,
                  child: ElevatedButton(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    child: const Text('CANCELAR'),
                  ),
                ),
              )
            ],
          ),
        ),
      ],
    );
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return alert;
      },
    );
  }

日期选择器功能:

Future pickFimApanha() async {
    DateTime? date = await pickDate();
    TimeOfDay? time = await pickTime();
    if (time == null) {
      return;
    } else {
      setState(() {
        fimApanha = DateTime(
          date!.year,
          date.month,
          date.day,
          time.hour,
          time.minute,
        );
      });
    }
  }
flutter dart android-alertdialog
1个回答
2
投票

用像这样的

StatefulBuilder
小部件包裹你的对话框

AlertDialog alert = AlertDialog(
      title: Center(child: Text(widget.infoApanha.granja)),
      content: StatefulBuilder(
builder: (context, alertSetState) {
return Column(
childern:[
// your code
]
);
}
 

然后使用

alertSetState
而不是像这样的 setState

 alertSetState(() {
        fimApanha = DateTime(
          date!.year,
          date.month,
          date.day,
          time.hour,
          time.minute,
        );
      });
© www.soinside.com 2019 - 2024. All rights reserved.