当键盘出现时,我的整个小部件树会重建吗?

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();
  }
}