出现键盘时重建整个小部件树

Posted

技术标签:

【中文标题】出现键盘时重建整个小部件树【英文标题】:Rebuild whole widget tree when a keyboard appears 【发布时间】:2021-07-03 03:14:13 【问题描述】:

当键盘出现抖动时如何解决重新渲染整个小部件树?在我的应用程序中,每当键盘出现和消失时,整个小部件树都会重新构建?有什么办法可以避免这种情况?

【问题讨论】:

设置脚手架resizeToAvoidBottomInset为false 【参考方案1】:

有多种方法可以解决这个问题,这是我过去使用过的一些解决方案。

Scaffold 的resizeToAvoidBottomInset 参数

将此设置为false,您的屏幕将不会调整大小,这样做的缺点是键盘将出现在您的 UI 顶部

例子:

class SampleScreen extends StatelessWidget 
  const SampleScreen(Key key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      resizeToAvoidBottomInset: false,
      body: Align(
        alignment: Alignment.bottomCenter,
        child: SafeArea(
          minimum: const EdgeInsets.all(20),
          child: TextField(
            decoration: new InputDecoration(
              enabledBorder: OutlineInputBorder(
                borderSide: BorderSide(color: Colors.black, width: 1.0),
              ),
              hintText: 'Mobile Number',
            ),
          ),
        ),
      ),
    );
  

将 Scaffold 的主体包裹在 ScrollView 中

通过将你的整个身体放在一个 ScrollView 中,你现在可能有一个冗长的表单,唯一需要注意的是你将无法使用 SpacerExpanded 小部件

例子

class SampleScreen extends StatelessWidget 
  const SampleScreen(Key key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: SafeArea(
        minimum: const EdgeInsets.all(20),
        child: SingleChildScrollView(
          child: Column(children: [
            Container(
              padding: EdgeInsets.all(20),
              margin: EdgeInsets.all(10),
              color: Colors.red,
              height: MediaQuery.of(context).size.height - 165,
            ),
            TextField(
              decoration: new InputDecoration(
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.black, width: 1.0),
                ),
                hintText: 'Mobile Number',
              ),
            ),
          ]),
        ),
      ),
    );
  

保存您当前的状态

使用有状态小部件并将应用的当前数据保存在某处。

【讨论】:

以上是关于出现键盘时重建整个小部件树的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的树小部件

开发 pyqt4 树小部件

html TreeFam基因树小部件

表单执行时会重建 Imagepicker,丢失所选图像

在路由后,TextField单击重建/重新加载小部件

在 StreamBuilder 中使用 Selector (Provider) 时不必要的小部件重建