键盘将内容向上推/调整屏幕大小

Posted

技术标签:

【中文标题】键盘将内容向上推/调整屏幕大小【英文标题】:Keyboard pushes the content up / resizes the screen 【发布时间】:2018-09-25 04:13:05 【问题描述】:

编辑

我收到报告说这是When the keyboard appears, the Flutter widgets resize. How to prevent this? 的副本。虽然这是相关的,但这是一个不同的问题。我希望键盘与 UI 重叠,直到它到达具有焦点的 TextField。这是 android 上的默认行为

原文:

我是一名 Android 开发人员,刚开始使用 Flutter。我想创建一个登录屏幕。我想要TextField 上方的图像。所以我想,我使用Stack 将图像放在背景上,一些TextField 在下面。

问题在于,键盘一出现,就会将所有内容向上推。在 Android 上,通常键盘仅在必要时才会向上推,直到到达 EditText

我尝试将 resizeToAvoidBottomPadding 设置为 false,但随后没有任何动作(当然)并且 TextField 被键盘覆盖。

我记得以前玩过 ios,这是默认行为,也许我应该重新考虑我的布局?

目前,我将其包装在 ListView 中,以便用户能够在键盘出现时滚动。

这是我的布局(仅用于测试)

@override
Widget build(BuildContext context) 
  this.context = context;
  return new Scaffold(
      key: _scaffoldKey,
      body: new Stack(
          children: <Widget>[loginImage(), new Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[new TextField(), new TextField(),
        new TextField(), new TextField(),
        new TextField(), new TextField()],
      )])
  );

:

【问题讨论】:

这是一个相关的 *** 问题顺便说一句:***.com/questions/46551268/… When the keyboard appears, the Flutter widgets resize. How to prevent this?的可能重复 我在评论中提到了相同的内容,但不同的是我的问题是关于 TextField 焦点 您的树中是否同时有多个脚手架? 不,这就是全部 【参考方案1】:

我在CupertinoTextField() 中设置autoFocus: true 时遇到了这个问题,并通过在Scaffold() 中设置resizeToAvoidBottomInset: false 来修复它。

resizeToAvoidBottomPadding 现已弃用。

使用resizeToAvoidBottomInset

【讨论】:

使用resizeToAvoidBottomInset : falseresizeToAvoidBottomPadding就是deprecated。 我试过resizeToAvoidBottomInset: false 但现在键盘的autoFocus: true 不起作用 这会导致我正在使用的视图全屏显示,然后又回到原来的大小【参考方案2】:

另外,我建议你使用ListView,而不是Stack。另一方面,您也可以试用SingleChildScrollView(但您可能需要添加额外的代码才能实现)。

快乐编码...

【讨论】:

【参考方案3】:

我认为这可以满足您的需求。最大的问题是您选择使用堆栈。仅当您想将事物堆叠在一起时才使用堆栈。在这种情况下,您不希望那样。将它放在一个列中并用扩展填充开放空间(此小部件扩展到可用空间并将所有内容向下推)是我这样做的方式。我并不是说这是最好的方法(只有 2 周的颤振经验)。但这是一种方式。希望对你有帮助!

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget 
    // This widget is the root of your application.
    @override
    Widget build(BuildContext context) 
        return new MaterialApp(
            title: 'Flutter Demo',
            theme: new ThemeData(
                primarySwatch: Colors.blue,
            ),
            home: new Scaffold(
                body: new Column(
                    children: <Widget>[
                        new Center(
                            child: new Container(
                                height: 150.0,
                                width: 75.0,
                                color: Colors.red,
                            ),
                        ),
                        new Expanded(
                            child: new Container(),
                        ),
                        new Column(
                            crossAxisAlignment: CrossAxisAlignment.center,
                            mainAxisAlignment: MainAxisAlignment.end,
                            children: <Widget>[
                                new TextField(),
                                new TextField(),
                                new TextField(),
                                new TextField(),
                                new TextField(),
                                new TextField()
                            ],
                        ),
                    ],
                ),
            ),
        );
    

【讨论】:

这给了我同样的问题。但我真的很高兴你向我解释了“扩展”!我遇到了将列放在底部的问题。但我实际上要解决的问题是键盘将所有文本字段向上推,而我希望键盘与未聚焦的文本字段重叠 您只希望活动(焦点)文本字段随键盘向上移动?我不知道该怎么做。对不起。仍然很高兴我能在扩展课程上帮助你。 似乎是一个已知问题:github.com/flutter/flutter/issues/13475【参考方案4】:
set this on scaffold:

1-resizeToAvoidBottomInset: true,

2-使用堆栈来设置你的背景。

body: Stack(fit: StackFit.expand, children: <Widget>[
          Opacity(
              opacity: 0.5,
              child: Image.asset('lib/assets/images/background3.jpg',
                  fit: BoxFit.cover)),
          Padding(
            padding: EdgeInsets.all(20),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Header1(),
                SizedBox(
                  height: 10,
                ),
                Tittle("Welcome to Bitetat's live repots"),
                Expanded(
                  child: SingleChildScrollView(
                      physics: AlwaysScrollableScrollPhysics(),
                      child: Column(
                        mainAxisSize: MainAxisSize.min,
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: <Widget>[
                          Container(

///// 3-那里你可以放你的领域

现在您可以享受漂亮的背景,并且您的键盘不会覆盖字段并且还可以滚动。

【讨论】:

【参考方案5】:

这是 Flutter 的默认功能。因此,如果您设置resizeToAvoidBottomInset: false,那么您将失去将 UI 组件保持在键盘上方的功能。 在您的应用程序中添加背景图像 更好的方法是这样做:

Container(
  decoration: BoxDecoration(
    color: primaryColor,
    image: DecorationImage(image: AssetImage(AppImages.appBg)),
  ),
  child: SafeArea(
    child: Scaffold(
      backgroundColor: Colors.transparent,
      body: //All Ui code here//
    ),
  ),
),

必须设置Scaffold的backgroundColor: Colors.transparent 否则,您将无法看到您的背景图片。

【讨论】:

以上是关于键盘将内容向上推/调整屏幕大小的主要内容,如果未能解决你的问题,请参考以下文章

如何停止在对话框中打开的键盘上调整大小/向上推的活动?

出现Android键盘时Unity调整屏幕大小

避免 android 软键盘调整布局大小。或回调隐藏视图

出现键盘后调整活动大小

滚动时如何在不同屏幕上调整导航栏的大小

旋转后获取 iPad 屏幕键盘的大小