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

Making button disabled if some date is fetched in flutter

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

在 TextFormField 上方我有一个 datePicker,如果数据库中有在 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(...

哪个 return 我这个错误:FlutterError (setState() or markNeedsBuild() called during build.

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

感谢您的帮助,

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

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

改变这个:

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

进入这个:

                                _isButtonDisabled = true;