如果在颤动中获取某个日期,则禁用按钮

Posted

技术标签:

【中文标题】如果在颤动中获取某个日期,则禁用按钮【英文标题】:Making button disabled if some date is fetched in flutter 【发布时间】:2021-12-11 09:07:32 【问题描述】:

当在 TextFormField 中获取数据时,我想禁用表单的提交按钮。

在 TextFormField 上方我有一个 datePicker,如果 DB 中有 datePicker 中选择的特定日期的数据,则 TextFormFilled 将填充此数据并禁用。

这是我使用 FutureBuilder 的方法:

FutureBuilder<double?>(
                              future: getTimes(selectedDate),
                              builder: (BuildContext context, AsyncSnapshot snapshot) 
                                if (snapshot.hasData)
                                  return TextFormField(
                                    controller: _timeController,
                                    textAlign: TextAlign.center,
                                    enabled: false,
                                    decoration: InputDecoration(
                                      hintText: snapshot.data.toString() + " h",
                                      contentPadding: EdgeInsets.zero,
                                      filled: true,
                                      fillColor: Colors.white
                                    ),
                                  );
                                 
                                else 
                                  return TextFormField(
                                    controller: _timeController,
                                    textAlign: TextAlign.center,
                                    enabled: true,
                                    decoration: InputDecoration(
                                      hintText: "0 h",
                                      contentPadding: EdgeInsets.zero,
                                      filled: true,
                                      fillColor: Colors.white
                                    ),
                                  );
                                
                              
                            )

问题是我还想禁用表单的提交按钮,所以我创建了一个 _isButtonDisabled 变量,

这是我的按钮代码:

ElevatedButton(
                              onPressed: _isButtonDisabled == true ? null : () async postTimes(await convertDate(selectedDate), convertTime(_timeController.text));,
                              child: Text("Submit")
                            ),

如果在我的 futureBuilder 中获取数据,我尝试使用 setState 方法将此变量设置为 true:

FutureBuilder<double?>(
                              future: getTimes(selectedDate),
                              builder: (BuildContext context, AsyncSnapshot snapshot) 
                                if (snapshot.hasData)
                                  setState(() 
                                    _isButtonDisabled = true;
                                  );
                                  return TextFormField(...

返回此错误:FlutterError (setState() 或 markNeedsBuild() 在构建期间调用。

我尝试通过使用this topic 中的一些函数示例来封装 setState 方法,但它并没有真正起作用,因为 TextFormField 的内容在获取的数据和默认文本之间不断闪烁,而不仅仅是显示获取的数据。

感谢您的帮助,

【问题讨论】:

这是否与您的last question 相关联? 请添加您的 getTimes 函数 【参考方案1】:

在您的情况下,您不需要调用setState:您不需要重建小部件。 FutureBuider 会在收到新数据时自动为您重建它。

您唯一需要做的就是确保您的ElevatedButtonFutureBuilder 内。

改变这个:

if (snapshot.hasData)
                                  setState(() 
                                    _isButtonDisabled = true;
                                  );

进入这个:

                                _isButtonDisabled = true;
                     

【讨论】:

我将按钮放在另一个具有相同功能的 FutureBuilder 中,效果很好,谢谢

以上是关于如果在颤动中获取某个日期,则禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中禁用日历中的前几天?

jQuery:如果 DatePicker UI 更改,则更新某个文本框

如何在颤动中禁用 texformfield 输入?

如何在颤动中间接调用另一个小部件中的 ontap 函数?

根据条件禁用按钮

有没有办法让颤动开关按钮继续打印,直到再次单击按钮(禁用)