首页 > 解决方案 > 当键盘出现时,我的整个小部件树会重建吗?

问题描述

我正在尝试构建一个响应式移动应用程序,所以我找到了一种方法,我将屏幕划分为确定数量的网格并获取网格宽度和高度,然后使用这个宽度和高度来调整我的小部件

问题

我肯定会从 MediaQuery.of(context) 获得我的屏幕大小,但是因为我只会使用它一次来进行计算,所以无论何时出现键盘,我的小部件树是否会重建(假设我在我的根小部件中进行了此计算)?如果它会重建,我应该在不同的地方进行计算吗?

标签: flutterresponsive-design

解决方案


不,如果您在打开键盘时重建小部件期间没有放置任何设置状态或回调。但是,可以通过将主小部件放在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();
  }
}

推荐阅读