简体   繁体   English

键盘正在上面添加额外的填充

[英]Keyboard is adding extra padding above

When I launch a keyboard (on iOS and Android) I have an extra 50 px padding added above it which shows an empty space. 当我启动键盘(在iOS和Android上)时,我在其上方添加了额外的50 px填充,显示空白区域。

This isn't caused by other suggested problems where there are multiple Scaffold widgets. 这不是由存在多个Scaffold小部件的其他建议问题引起的。 I know that this is caused by my layout and I'm not sure if it can be fixed at the moment. 我知道这是由我的布局引起的,我不确定它是否可以修复。

I have a static navigation bar that appears across the app at the bottom. 我有一个静态导航栏,显示在底部的应用程序中。 This is 50px high and sits below CupertinoApp . 这是50像素高,坐在下面CupertinoApp When the keyboard is launched, extra padding is added to fill this space it seems. 启动键盘时,会添加额外的填充以填充此空间。 This navigation bar is a Container widget with InkWell links to open views directly, sort of like CupertinoTabScaffold except I don't have tabs, it just pushes or replaces the current navigation item 这个导航栏是一个Container小部件,其中InkWell链接直接打开视图,有点像CupertinoTabScaffold,除了我没有标签,它只是推或替换当前导航项

Adding resizeToAvoidBottomInset: false, can't be used as this removes the scroll action or doesn't include the 50px so content is hidden. 添加resizeToAvoidBottomInset: false,不能用,因为这消除了滚动操作或不包括50像素所以内容是隐藏的。

This problem only occurs when the keyboard is active 仅在键盘处于活动状态时才会出现此问题

The CupertinoApp builder CupertinoApp构建器

Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () => Future<bool>.value(true),
      child: Column(
        children: <Widget>[
          Expanded(
            child: DefaultTextStyle(
                style: Fonts.defaultFontStyle(),
                child: CupertinoApp(
                  navigatorKey: navigatorKey,
                  routes: routes.builder,
                )),
          ),
          BottomBar(),
        ],
      ),
    );
  }

Adding a minimal example to get across a better idea 添加一个最小的例子来获得更好的想法

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.

  final NAVIGATION_HEIGHT = 50.0;

  final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

  static const home = "/";
  static const about = "/about";
  static const products = "/products";

  Map<String, WidgetBuilder> builder = {
    home: (BuildContext context) => MyPage(),
    about: (BuildContext context) => MyPage(),
    products: (BuildContext context) => MyPage(),
  };

  Widget _createButtonsBuilder(int index) {
    String pageTitle = builder.keys.toList()[index].substring(1);
    if (pageTitle.length == 0) {
      pageTitle = "Home";
    }

    return Expanded(
      child: Material(
        color: Colors.black87,
        child: InkWell(
            onTap: () {
              navigatorKey.currentState.push(CupertinoPageRoute<void>(
                builder: (BuildContext context) => MyPage(
                      title: "$pageTitle",
                  navigationHeight: NAVIGATION_HEIGHT,
                    ),
              ));
            },
            child: Container(
              padding: EdgeInsets.all(10.0),
              height: NAVIGATION_HEIGHT,
              child: Text(
                "$pageTitle",
                style: TextStyle(
                    inherit: true, color: Colors.white, fontSize: 20.0),
                textAlign: TextAlign.center,
              ),
            )),
      ),
    );
  }

  Widget _BottomBar() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceAround,
      mainAxisSize: MainAxisSize.max,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: List.generate(builder.keys.toList().length,
              (int i) => _createButtonsBuilder(i)),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.ltr,
      child: Container(
        color: Colors.white,
        child: Column(
          children: <Widget>[
            Expanded(
              child: CupertinoApp(
                title: 'Flutter Demo',
                routes: builder,
                navigatorKey: navigatorKey,
              ),
            ),
            _BottomBar()
          ],
        ),
      ),
    );
  }
}

class MyPage extends StatefulWidget {
  MyPage({Key key, this.title, this.navigationHeight}) : super(key: key);

  final String title;
  final double navigationHeight;

  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
        navigationBar: CupertinoNavigationBar(),
        child: Scrollbar(
          child: SingleChildScrollView(
            child: SafeArea(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(
                    '${widget.title}',
                  ),
                  SizedBox(height: 40.0),
                  Container(
                    margin: EdgeInsets.all(30.0),
                    child: CupertinoTextField(
                      placeholder: "Tap in here",
                    ),
                  ),
                  Container(
                      margin: EdgeInsets.all(30.0),
                      child: Text(
                          "When tapping to add focus to the above CupertinoTextField Widget the keyboard will appear as normal but because of the _BottomBar() outside the CupertinoApp the height (${widget.navigationHeight}px) is included in the padding above the keyboard")),
                  Container(
                      margin: EdgeInsets.all(30.0),
                      child: Text(
                          "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi interdum blandit diam sed faucibus. Donec ut enim in ante luctus sagittis. Donec vestibulum aliquet nunc, in efficitur erat molestie quis. In dictum aliquet neque. Vivamus pharetra nibh dictum urna sodales malesuada. Nunc porta condimentum mi, sed laoreet erat maximus vitae. Nunc luctus nisi urna, a luctus nisi consectetur quis. Sed rhoncus euismod nisl, in laoreet leo molestie sed. Suspendisse aliquet commodo dui, sit amet rhoncus sapien venenatis in. Nulla tempus libero diam, non cursus odio euismod at. Fusce nec ipsum ipsum. Mauris congue blandit risus, vitae pretium leo euismod id. Vivamus venenatis finibus diam id auctor. Donec vel urna finibus erat viverra bibendum. Vivamus sagittis eros id bibendum tristique. Nullam eleifend elit dapibus elit porttitor, ac egestas libero mollis.\n\nMorbi eleifend ligula sed leo placerat tristique. Mauris consequat fringilla maximus. Fusce pharetra ultrices risus, quis fermentum urna ultrices non. Vivamus suscipit nunc non ipsum ultrices laoreet. Etiam sed vestibulum eros, nec tempus neque. Vestibulum efficitur mauris ac ipsum aliquet, et tincidunt massa suscipit. Vivamus enim justo, viverra tempor purus eu, elementum tempor tortor. Sed rhoncus gravida sem, vitae molestie augue iaculis et. Donec augue ligula, interdum id interdum sit amet, condimentum in dolor. Donec dignissim erat lorem, ut accumsan felis porta id. Nunc lorem enim, maximus ut odio at, ultrices sodales velit."))
                ],
              ),
            ),
          ),
        ) // This trailing comma makes auto-formatting nicer for build methods.
        );
  }
}

I wrapped my CupertinoApp in Scaffold widget which exposed bottomNavigationBar . 我将我的CupertinoApp包装在Scaffold小部件中,该小部件暴露了bottomNavigationBar

@override
  Widget build(BuildContext context) {
    return WillPopScope(
        onWillPop: () => Future<bool>.value(true),
        child: Scaffold(
          body: DefaultTextStyle(
                style: Fonts.defaultFontStyle(),
                child: CupertinoApp(
                  navigatorKey: navigatorKey,
                  routes: routes.builder,
                )),
          ),
          bottomNavigationBar: HomeBottomBar(),
        ));
  }

And then added resizeToAvoidBottomPadding = true to any CupertinoPageScaffold's that have CupertinoTextfield children 然后将resizeToAvoidBottomPadding = true添加到任何拥有CupertinoTextfield子项的CupertinoPageScaffold

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM