如果在 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 会在接收到新数据时自动为您重建它。
您唯一需要做的就是确保您的 ElevatedButton
在 FutureBuilder
内。
改变这个:
if (snapshot.hasData){
setState(() {
_isButtonDisabled = true;
});
进入这个:
_isButtonDisabled = true;
我想在 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 会在接收到新数据时自动为您重建它。
您唯一需要做的就是确保您的 ElevatedButton
在 FutureBuilder
内。
改变这个:
if (snapshot.hasData){
setState(() {
_isButtonDisabled = true;
});
进入这个:
_isButtonDisabled = true;