如果在颤动中获取某个日期,则禁用按钮
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 会在收到新数据时自动为您重建它。
您唯一需要做的就是确保您的ElevatedButton
在FutureBuilder
内。
改变这个:
if (snapshot.hasData)
setState(()
_isButtonDisabled = true;
);
进入这个:
_isButtonDisabled = true;
【讨论】:
我将按钮放在另一个具有相同功能的 FutureBuilder 中,效果很好,谢谢以上是关于如果在颤动中获取某个日期,则禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章