我在 Flutter 中有一个页面,其中包含几个小部件,包括一个 TextField(我们称之为 View1)。当用户单击 TextField 时,我重建仅显示 TextField 和键盘的页面(我们称之为 View2)。当用户完成 TextField 时,我再次重建页面,显示所有小部件,如前所述(我们称其为 View3,但请注意它与 View1 相同)。除了一件事,这工作正常。我得到一个临时的黄色/黑色指示器(在 Debug模式下),表明没有足够的空间来显示 View3 中的所有小部件。该指示器只持续很短的时间,我最终发现它出现是因为 Flutter 试图在键盘尚未完成动画处理时显示所有小部件。一旦键盘完成动画消失,黄色/黑色条就会消失,我认为这解释了为什么它只短暂出现。
在键盘完成动画化后执行的回调中请求构建 View3 会很好,但我看不到这样做的任何方式。也许我错过了什么?
我能想到的解决此问题的另一种方法是在构建 View3 之前插入延迟,以便有时间让键盘消失,但这似乎有点老套。还有其他想法吗?
编辑
我按如下方式添加了一个延迟,它起作用了。不过看起来还是有点老套。
Timer(Duration(milliseconds: 500),(){setState((){});});
最佳答案
尝试使用 WidgetsBindingObserver
并覆盖 didChangeMetrics
方法,如下所示:
class KeyboardTogglePage extends StatefulWidget {
@override
_KeyboardTogglePageState createState() => _KeyboardTogglePageState();
}
class _KeyboardTogglePageState extends State<KeyboardTogglePage>
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
var isKeyboardOpen = false;
///
/// This routine is invoked when the window metrics have changed.
///
@override
void didChangeMetrics() {
final value = MediaQuery.of(context).viewInsets.bottom;
if (value > 0) {
if (isKeyboardOpen) {
_onKeyboardChanged(false);
}
isKeyboardOpen = false;
} else {
isKeyboardOpen = true;
_onKeyboardChanged(true);
}
}
_onKeyboardChanged(bool isVisible) {
if (isVisible) {
print("KEYBOARD VISIBLE");
} else {
print("KEYBOARD HIDDEN");
}
}
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: TextField(),
),
);
}
}
关于dart - Flutter 检测键盘结束隐藏动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52140698/