Flutter:故意隐藏键盘下的Stack项目

Posted

技术标签:

【中文标题】Flutter:故意隐藏键盘下的Stack项目【英文标题】:Flutter: Intentionally hide Stack items under keyboard 【发布时间】:2019-07-16 14:28:40 【问题描述】:

我在 Stack 中有一些小部件。

当键盘出现时,Stack 中使用Positioned(bottom: 0) 小部件显式定位在底部的小部件将转移到键盘顶部。

我怎样才能防止这种情况,并使一些小部件保持其位置,无论键盘是否在视图中?

例如,我希望“离线模式”标签位于键盘下方,而不是键盘上方。

这是此页面小部件外观的粗略草图:

Scaffold(
   body: Stack(
       children: [
           LoginImage(),
           LoginForm(),
           ConnectedToInternet(),
       ],
   ),
)

这是ConnectedToInternet 小部件的样子-

Positioned(
  bottom: 0,
  child: Container(
    width: MediaQuery.of(context).size.width,
    color: Colors.grey[900],
    child: Padding(
      padding: const EdgeInsets.all(4.0),
      child: Center(
        child: Text(
          "Offline mode",
          style: TextStyle(color: Colors.white, fontSize: 12),
        ),
      ),
    ),
  ),
);

【问题讨论】:

你的问题和这个问题类似吗? ***.com/questions/46551268/… 类似,但就我而言,我只想对选定的小部件执行此操作,而不是全部。 你能添加一个所需行为的视觉示例吗? 【参考方案1】:

我通过设置 resizeToAvoidBottomInset: false 来解决这个问题的方式,

Scaffold(
  appBar: AppBar()
  drawer: AppDrawer(),
  resizeToAvoidBottomInset: false,
  body: Stack(
    children:[
          // widgets 
        ]
       )
 )

【讨论】:

此节目被标记为正确答案。【参考方案2】:

在堆栈中使用 Positioned(bottom: 0.0) 小部件定位背景图像时遇到了类似的问题。当键盘出现时,图像移动到键盘的顶部。 通过执行以下操作解决了问题。

Widget build(BuildContext context) 
    return Container(
      color: Colors.white,
      child: Stack(
        children: <Widget>[
          _bottomImageStack(),
          Scaffold(
            appBar: AppBar(),
            backgroundColor: Colors.transparent,
            body: _mainBody(),
          ),
        ],
      ),
    );
  

Widget _bottomImageStack() 
    return Positioned(
      bottom: 0.0,
      child: Container(
        height: 235,
        width: MediaQuery.of(context).size.width,
        child: SvgPicture.asset(
          AssetPaths.LOGIN_SCREEN_BG_SVG,
          alignment: Alignment.bottomRight,
        ),
      ),
    );
  

Widget _mainBody() 
    return ListView(
      children: <Widget>[..Other widgets go here..],
    );
  

【讨论】:

这对我有用。太感谢了。我所做的唯一更改是,由于我的用例,我必须将 Positioned Widget 放在堆栈中的 Scaffold 之后。非常感谢! 为什么你这么聪明,这对我最后一年的项目有很大帮助【参考方案3】:

您可以将 stack 放置为 listview 的子级,这样键盘就不会将您的小部件移到顶部:

     Scaffold(
       body: ListView(
               children: <Widget>[
                 Stack(
                 children: [
                    LoginImage(),
                    LoginForm(),
                    ConnectedToInternet(),
                 ],
               ),
             ]
           ),
         )

【讨论】:

这不会完全起作用,因为登录表单里面也有 ListView。使用Expandedshrinkwrap 也不会修复BoxConstraints forces an infinite height. 消息。【参考方案4】:

尝试设置容器的高度以匹配页面高度,如下所示:

Positioned(
  bottom: 0,
  child: Container(
    width: MediaQuery.of(context).size.width,
    height: MediaQuery.of(context).size.height,
    color: Colors.grey[900],
    child: Padding(
      padding: const EdgeInsets.all(4.0),
      child: Center(
        child: Text(
          "Offline mode",
          style: TextStyle(color: Colors.white, fontSize: 12),
        ),
      ),
    ),
  ),
);

您可能还需要像这样更改堆栈中的位置:

Scaffold(
   body: Stack(
       children: [
           LoginImage(),
           ConnectedToInternet(),
           LoginForm(),
       ],
   ),
)

【讨论】:

【参考方案5】:

如果您可以指定小部件的高度,您可以使用Positioned(top) 来解决它。 ConnectedToInternet 可能看起来像:

var widgetHeight = 40.0; //replaced with your height
Positioned(
  top: MediaQuery.of(context).size.height - widgetHeight,
  child: Container(
    height: widgetHeight,
    child: SizedBox(height: widgetHeight), //replaced with your widget
  )
)

【讨论】:

以上是关于Flutter:故意隐藏键盘下的Stack项目的主要内容,如果未能解决你的问题,请参考以下文章

在flutter 如何隐藏软键盘

Flutter TextFormField 被键盘隐藏

Flutter - 键盘隐藏时TextFormField变为空白

Flutter 键盘一直隐藏文本字段并显示溢出像素

在 Flutter 应用程序中的 ListView 滚动上隐藏/关闭键盘

Flutter TextField被键盘隐藏,尝试了很多解决方案但不起作用