最近开始入坑flutter,正好遇到了一个新需求,响应国家号召的青少年模式。因为页面简单没有复杂UI也没什么网络请求,特别适合作为实验项目接入原生工程,在说服了iOS的同事之后准备开工。
开始一切都很顺利,结果在处理输入框的时候遇到了一个问题。
TextField(
controller: pwdController,
letterSpace: 38,
textSize: 30,
onChanged: (it) => {judgeState(context, pwdController)},
在我调用pwdController.clear()方法之后onChanged触发了n次并且数据并不是空字符。
/// Set the [value] to empty.
///
/// After calling this function, [text] will be the empty string and the
/// selection will be invalid.
///
/// Calling this will notify all the listeners of this [TextEditingController]
/// that they need to update (it calls [notifyListeners]). For this reason,
/// this method should only be called between frames, e.g. in response to user
/// actions, not during the build, layout, or paint phases.
void clear() {
value = TextEditingValue.empty;
}
看了下文档发现这个方法不应该在frames里调用。
于是在调用出加了一层
SchedulerBinding.instance.addPostFrameCallback(
(it) => {pwdController.clear()});
问题解决。
总结,所有需要在帧之间调用的方法目前看起来都可以通过 SchedulerBinding.instance.addPostFrameCallback来实现延迟到下一帧之前调用。
网友评论