flutter - 如何在启用键盘时启用或禁用按钮?
问题描述
在验证 TextFormField 期间启用键盘时如何启用或禁用按钮?
class WordsFormPageState extends State<WordsFormPage> {
var tps = new StringProcessor();
var _isButtonDisabled = false;
.....
@override
Widget build(BuildContext context) {
final editor = TextFormField(
decoration: InputDecoration(labelText: 'Your essay'),
keyboardType: TextInputType.multiline,
autovalidate: true,
minLines: 3,
maxLines: 20,
validator: (value) {
if (value.isEmpty) {
return 'Enter some text';
}
if (tps.getWordCount(value) == 100) {
_isButtonDisabled = false;
} else {
_isButtonDisabled = true;
return "${tps.getWordCount(value)}/100";
}
print(_isButtonDisabled);
return null;
},
);
final form = ListView(
children: <Widget>[
ExerciceCardSmall(
exercice: widget.exercice,
),
Card(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: editor,
),
),
],
);
return Scaffold(
resizeToAvoidBottomPadding: true,
appBar: AppBar(
title: Text(widget.exercice.title),
actions: <Widget>[
IconButton(
icon: Icon(Icons.save),
onPressed: _isButtonDisabled ? null : () {},
),
],
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: form,
),
);
}
}
我希望 IconButton 在字数 != 100 时被禁用,但在隐藏键盘之前该按钮不会被禁用或启用。
编辑:在构建方法中使用 setState 会抛出异常,解决方案是用 addPostFrameCallback 包装它
if (tps.getWordCount(value) == 100) {
SchedulerBinding.instance
.addPostFrameCallback((_) => setState(() {
_isButtonDisabled = false;
}));
} else {
SchedulerBinding.instance
.addPostFrameCallback((_) => setState(() {
_isButtonDisabled = true;
}));
return "${tps.getWordCount(value)}/100";
}
解决方案
你应该调用setState
验证器函数来让 Flutter 知道它已经改变了你页面的状态。
例如:
if (tps.getWordCount(value) == 100) {
setState(() {
_isButtonDisabled = false;
});
} else {
setState(() {
_isButtonDisabled = true;
});
return "${tps.getWordCount(value)}/100";
}
推荐阅读
- java - 如何修复“使用 Spring AOP,我想更改返回值,但返回类不是我的方法返回”
- android - androidx 包未导入。(灰色。像未使用的进口)
- python - 如何遍历数据框中的列表?
- docker - Docker从文件中编写构建时间参数
- python - Python - 通过用户定义的函数解析 JSON 数据
- java - 用于登录的 WebSecurityConfigurerAdapter 的配置
- php - 为什么“single-{custom-posttype}.php”不起作用?
- python - 用于显示高值范围差异的 Python Colormap
- elasticsearch - Kibana“可用字段”未显示数组内的(字符串)字段
- microsoft-dynamics - Windows 重新启动后运行 Microsoft Dynamics NAV 实例但没有响应