【问题标题】:Will my whole widget tree rebuild when a keyboard appears?当键盘出现时,我的整个小部件树会重建吗?
【发布时间】:2021-01-24 12:54:57
【问题描述】:

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

问题

我肯定会从 MediaQuery.of(context) 获取我的屏幕大小,但由于我只会使用它一次来进行计算,因此每当键盘出现或不是?如果它会重建,我应该在不同的地方进行计算吗?

【问题讨论】:

    标签: flutter responsive-design


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多