当键盘出现时,我的整个小部件树会重建吗?
Will my whole widget tree rebuild when a keyboard appears?
我正在尝试构建一个响应式移动应用程序,所以我找到了一种方法,我将屏幕分成一定数量的网格并获取网格宽度和高度,然后使用此宽度和高度调整我的小部件的大小
问题:
我肯定会从 MediaQuery.of(context) 中获取我的屏幕尺寸,但是因为我只会用它一次来做我的计算,我的小部件树是否会重建(假设我在我的根小部件中做了这个计算)每当键盘出现与否?如果它会重建,我应该在不同的地方进行计算吗?
不,如果您在打开键盘时重建小部件期间没有放置任何设置状态或回调。但是,通过将主小部件放在 SingleChildScrollView 中的脚手架“下方”以避免呈现问题,可以轻松解决此问题。
如果您绝对需要在键盘出现时执行操作,您可以在文本字段中使用 FocusNode 并使用 addListener[= 添加一个侦听器20=] 方法。通过传递一个函数来添加 Listener,您可以在每次需要时触发一个 setState,使 widget 使用新参数重建。
这是我的意思的一个非常简化的版本:
class MyWidget extends StatefulWidget{
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
FocusNode _focusNode;
int state=0;
@override
Widget build(BuildContext context) {
return Container(
height: state==0?100:200, //change the height depending on "state"
child: TextField(
focusNode: _focusNode,
),
);
}
void onFocus(){
setState(() {
//Check if the focus node is focused
if(_focusNode.hasFocus) state=1; //Change the value of the state
});
}
@override
void initState() {
super.initState();
_focusNode=FocusNode();
_focusNode.addListener(onFocus); //Here on focus will be called
}
@override
void dispose() {
super.dispose();
_focusNode.dispose();
}
}
我正在尝试构建一个响应式移动应用程序,所以我找到了一种方法,我将屏幕分成一定数量的网格并获取网格宽度和高度,然后使用此宽度和高度调整我的小部件的大小
问题:
我肯定会从 MediaQuery.of(context) 中获取我的屏幕尺寸,但是因为我只会用它一次来做我的计算,我的小部件树是否会重建(假设我在我的根小部件中做了这个计算)每当键盘出现与否?如果它会重建,我应该在不同的地方进行计算吗?
不,如果您在打开键盘时重建小部件期间没有放置任何设置状态或回调。但是,通过将主小部件放在 SingleChildScrollView 中的脚手架“下方”以避免呈现问题,可以轻松解决此问题。
如果您绝对需要在键盘出现时执行操作,您可以在文本字段中使用 FocusNode 并使用 addListener[= 添加一个侦听器20=] 方法。通过传递一个函数来添加 Listener,您可以在每次需要时触发一个 setState,使 widget 使用新参数重建。
这是我的意思的一个非常简化的版本:
class MyWidget extends StatefulWidget{
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
FocusNode _focusNode;
int state=0;
@override
Widget build(BuildContext context) {
return Container(
height: state==0?100:200, //change the height depending on "state"
child: TextField(
focusNode: _focusNode,
),
);
}
void onFocus(){
setState(() {
//Check if the focus node is focused
if(_focusNode.hasFocus) state=1; //Change the value of the state
});
}
@override
void initState() {
super.initState();
_focusNode=FocusNode();
_focusNode.addListener(onFocus); //Here on focus will be called
}
@override
void dispose() {
super.dispose();
_focusNode.dispose();
}
}