flutter - 当键盘出现时,我的整个小部件树会重建吗?
问题描述
我正在尝试构建一个响应式移动应用程序,所以我找到了一种方法,我将屏幕划分为确定数量的网格并获取网格宽度和高度,然后使用这个宽度和高度来调整我的小部件
问题:
我肯定会从 MediaQuery.of(context) 获得我的屏幕大小,但是因为我只会使用它一次来进行计算,所以无论何时出现键盘,我的小部件树是否会重建(假设我在我的根小部件中进行了此计算)?如果它会重建,我应该在不同的地方进行计算吗?
解决方案
不,如果您在打开键盘时重建小部件期间没有放置任何设置状态或回调。但是,可以通过将主小部件放在SingleChildScrollView中的“脚手架”“下方”来轻松解决该问题,以避免呈现问题。
如果您绝对需要在键盘出现时执行操作,您可以在 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();
}
}
推荐阅读
- java - 如何将包信息与 Byte-buddy 中的类相关联?
- reactjs - Expo / React Native - 登录后无法重定向到主屏幕
- r - 在R中的多维数组中删除一层命名
- node.js - 更新电子和打字稿后的电子问题
- c# - 如何使用 C# 选择特定范围的数据列
- database - 如何使用 AppScript 将日期(从谷歌表数据)转换为时间戳(Firestore)?
- react-native-firebase - 无法使用 react-Native-firebase 构建项目
- javascript - 计算器应用程序中的日语数字格式
- rust - 如何确保 self 在不借入的情况下超过返回值
- go - 同时扫描多个端口时结果不可靠