键盘打开时颤振中的溢出错误

Muh*_*man 9 dart flutter flutter-layout

我设计这一个登录页面溢出,当我在任何文本窗体域打开它点击键盘,并通过溢出警告这样见附件图片。我还希望按钮的右侧应该有一个凸起的按钮图标。

Widget build(BuildContext context) {
    return Container(
      child: Scaffold(
        body: Stack(
          fit: StackFit.expand,
          children: <Widget>[
            Container(
              decoration: BoxDecoration(
                  image: new DecorationImage(
                      image: new AssetImage('assets/login_page_bg_1.jpg'),
                      fit: BoxFit.cover,
                      colorFilter: new ColorFilter.mode(
                          Colors.black.withOpacity(0.55), BlendMode.dstATop))),
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: <Widget>[
                Expanded(
                  flex: 1,
                  child: Container(
                    margin: new EdgeInsets.only(top: 42.0),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        Image.asset('assets/logo.png',
                            width: 250.0, height: 200.21),
                      ],
                    ),
                  ),
                ),
                Expanded(
                  flex: 2,
                  child: Container(
                    margin: new EdgeInsets.only(bottom: 40.0),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        //form filed goes here
                        Text('Login As User',
                            textAlign: TextAlign.center,
                            style: TextStyle(
                                fontWeight: FontWeight.bold, fontSize: 35.0)),
                        TextFormField(
                            keyboardType: TextInputType.emailAddress,
                            decoration: InputDecoration(
                              hintText: 'you@example.com',
                              labelText: 'Email Address',
                            ),
                        new Container(
                          // width: MediaQuery.of(context).size.width,
                          child: RaisedButton.icon(
                            color: Color.fromARGB(251, 188, 74, 1),
                            label: Text('LOGIN'),
                            icon: Icon(Icons.send,
                                size: 10.0, color: Colors.black),
                            onPressed: () {
                              this.submit();
                            }, ),)],),),)],)],),),);
Run Code Online (Sandbox Code Playgroud)

初始状态

错误/溢出状态

Cop*_*oad 20

将以下属性设置为 false

Scaffold(
  resizeToAvoidBottomInset: false, 
  ... 
)
Run Code Online (Sandbox Code Playgroud)

如果您遇到溢出错误的问题,请使用SingleChildScrollView它。

Scaffold(
  resizeToAvoidBottomInset: false, // set it to false
  body: SingleChildScrollView(child: YourBody()),
)
Run Code Online (Sandbox Code Playgroud)

  • 我必须为上面的第二个示例设置 `resizeToAvoidBottomInset: true` - 以便在键盘出现时启动 `SingleChildScrollView` 滚动。而将值设置为“false”意味着键盘会覆盖 UI 并遮挡其他内容,并且滚动似乎不再起作用。 (3认同)

小智 7

发生这种情况是因为当键盘出现在屏幕上时,要绘制的画布的高度会降低。一种解决方案是将根容器包装在 SingleChildScrollView 中,如下所示:

Widget build(BuildContext context) {
return Scaffold(
      body: SingleChildScrollView(
          child: Stack(
            fit: StackFit.loose,
            children: <Widget>[
              Container(
                decoration: BoxDecoration(
                    image: new DecorationImage(
                        image: new AssetImage('assets/login_page_bg_1.jpg'),
                        fit: BoxFit.cover,
                        colorFilter: new ColorFilter.mode(
                            Colors.black.withOpacity(0.55), BlendMode.dstATop)
                            )
                ),
              ),
              Column(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  SizedBox(height: 42,),
                  Expanded(
                    flex: 1,
                    child: Center(
                      child:
                        Image.asset('assets/logo.png',
                            width: 250.0, height: 200.21),
                    ),
                  ),
                  Expanded(
                    flex: 2,
                    child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                        //form filed goes here
                        Text('Login As User',
                        textAlign: TextAlign.center,
                        style: TextStyle(
                            fontWeight: FontWeight.bold, fontSize: 35.0)),
                    TextFormField(
                      keyboardType: TextInputType.emailAddress,
                      decoration: InputDecoration(
                        hintText: 'you@example.com',
                        labelText: 'Email Address',
                      )
                    ),
                      new Container(
                        // width: MediaQuery.of(context).size.width,
                        child: RaisedButton.icon(
                          color: Color.fromARGB(251, 188, 74, 1),
                          label: Text('LOGIN'),
                          icon: Icon(Icons.send,
                              size: 10.0, color: Colors.black),
                          onPressed: () {
                            //this.submit();
                          }, ),)],)),
                  SizedBox(height: 40,)
            ],)],),));
Run Code Online (Sandbox Code Playgroud)

当内容的高度超过视口的可用高度时,它将使您的屏幕可滚动。


小智 6

  1. resizeToAvoidBottomPadding: false,和添加resizeToAvoidBottomInset: false, 到您的脚手架小部件中。

  2. 用 a 包装您的代码Container,设置 的Container参数height: MediaQuery.of(context).size.height,width: MediaQuery.of(context).size.width,。然后ContainerSingleChildScrollView.


Ram*_*ush 5

一个更简单的解决方案()似乎只是将Scaffold属性设置resizeToAvoidBottomPaddingfalse. 这对我很有用:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        resizeToAvoidBottomPadding: false,
        appBar: AppBar(...),
        body: ...
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:“resizeToAvoidBottomPadding”已标​​记为已弃用,建议使用“resizeToAvoidBottomInset”。 (2认同)