【发布时间】:2021-01-24 12:54:57
【问题描述】:
我正在尝试构建一个响应式移动应用程序,因此我找到了一种方法,即我将屏幕划分为确定数量的网格并获取网格宽度和高度,然后使用此宽度和高度来调整我的小部件的大小
问题:
我肯定会从 MediaQuery.of(context) 获取我的屏幕大小,但由于我只会使用它一次来进行计算,因此每当键盘出现或不是?如果它会重建,我应该在不同的地方进行计算吗?
【问题讨论】:
我正在尝试构建一个响应式移动应用程序,因此我找到了一种方法,即我将屏幕划分为确定数量的网格并获取网格宽度和高度,然后使用此宽度和高度来调整我的小部件的大小
问题:
我肯定会从 MediaQuery.of(context) 获取我的屏幕大小,但由于我只会使用它一次来进行计算,因此每当键盘出现或不是?如果它会重建,我应该在不同的地方进行计算吗?
【问题讨论】:
不,如果您在打开键盘时重建小部件期间没有放置任何设置状态或回调。但是,可以通过将主小部件放在 SingleChildScrollView 中的 Scaffold “下方”来轻松解决该问题,以避免出现渲染问题。
如果您在键盘出现时绝对需要执行操作,您可以在 textField 中使用 FocusNode 并使用 addListener 方法为其添加监听器。通过传递一个函数来添加监听器,您可以在每次需要时触发一个 setState,从而使用新参数重新构建小部件。
这是我的意思的一个非常简化的版本:
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();
}
}
【讨论】: