Flutter: клавиатура вызывает переполнение раскладки внизу, когда находится в фокусе - PullRequest
1 голос
/ 09 мая 2020

У меня есть следующий код для макета.

@override
Widget build(BuildContext context) {
return Material(
  child: Scaffold(

//        resizeToAvoidBottomPadding: false,
//        resizeToAvoidBottomInset: false,
    appBar: PreferredSize(
      preferredSize: Size.fromHeight(70),
      child: AppBar(
        centerTitle: true,
        title: AutoSizeText(
          meal['name'],
          minFontSize: 30,
          maxFontSize: 50,
        ),
        backgroundColor: Colors.black,
        elevation: 1,
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.add),
            onPressed: () => null,
          ),
        ],
      ),
    ),
    body: Builder(
      builder: (context) {
        return Container(
          color: Colors.black,
          alignment: Alignment.center,
          child: FractionallySizedBox(
            widthFactor: 0.85,
            child: Container(
              child: Column(
                children: <Widget>[
                  Spacer(flex: 1,),
                  Container(
                    margin: EdgeInsets.only(bottom: 50),
                    child: Column(
                      children: <Widget>[
                        Container(
                          decoration: BottomWhiteDecoration(6.0),
                          padding: EdgeInsets.only(bottom: 8.0),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: <Widget>[
                              Text(
                                'Servings: 1',
                                style: TextStyle(color: Colors.white),
                              ),
                            ],
                          ),
                        ),
                        Container(
                          child: Column(
                            children: <Widget>[
                              RowNutrimentalInfo('Calories', meal['calories'], showGram: false),
                              RowNutrimentalInfo('Protein', meal['macros']['proteins']),
                              RowNutrimentalInfo('Carbs', meal['macros']['carbs']),
                              RowNutrimentalInfo('Fat', meal['macros']['fats']),
                            ],
                          ),
                        )
                      ],
                    ),
                  ),
                Spacer(flex: 2,),
                  Container(
                    child: Column(
                      children: <Widget>[
                        Form(
                          key: this._mealFormKey,
                          child: Row(
                            children: <Widget>[
                              Expanded(
                                flex: 10,
                                child: TextFormField(...),
                              ),
                              Spacer(flex: 1,),
                              Expanded(
                                flex: 10,
                                child: TextFormField(...),
                              ),
                            ],
                          ),
                        ),
                        FractionallySizedBox(
                          widthFactor: .50,
                          child: OutlineButton(
                            borderSide: BorderSide(color: Colors.white),
                            color: Colors.black,
                            onPressed: _eatMeal,
                            child: Padding(
                              padding: EdgeInsets.all(20),
                              child: Text('Ok',
                                  style: TextStyle(color: Colors.white)),
                            ),
                          ),
                        )
                      ],
                    ),
                  ),
                  Spacer(flex: 2,),
                ],
              ),
            ),
          ),
        );
      },
    ),
  ),
);
}

Однако, когда я начинаю вводить текст в одном из текстовых полей, клавиатура вызывает переполнение макета внизу, как показано на следующем изображении.

enter image description here

Ниже приведена ошибка, которую я получаю, и то, как она отображается на телефоне. Есть идеи, чтобы обойти это? Я видел похожие вопросы, решения, такие как установка resizeToAvoidBottomPadding: false, у меня не работают, поскольку клавиатура все еще закрывает ввод текста.

The following assertion was thrown during layout:
A RenderFlex overflowed by 45 pixels on the bottom.

The relevant error-causing widget was: 
Column file:///C:/Users/bolon/StudioProjects/macro_counter/lib/Meal.dart:92:26
The overflowing RenderFlex has an orientation of Axis.vertical.
The edge of the RenderFlex that is overflowing has been marked in the rendering with a yellow and 
black striped pattern. This is usually caused by the contents being too big for the RenderFlex.
Consider applying a flex factor (e.g. using an Expanded widget) to force the children of the 
RenderFlex to fit within the available space instead of being sized to their natural size.
This is considered an error condition because it indicates that there is content that cannot be seen. 
If the content is legitimately bigger than the available space, consider clipping it with a ClipRect 
widget before putting it in the flex, or using a scrollable container rather than a Flex, like a 
ListView.

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Проблема в том, что вы используете расширенные виджеты, вы видите, что расширенные виджеты гибки по своей природе, они будут потреблять и сжиматься в соответствии с доступным пространством. Если вы не хотите, чтобы вам нужно было указывать высоту.

Итак, я использовал MediaQuery, чтобы установить widget в соответствии с разрешениями устройства, пожалуйста, проверьте решение ниже для него, я создали демонстрацию вашего кода.

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutterlearningapp/colors.dart';

class HomeScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _HomeScreen();
  }
}

class _HomeScreen extends State<HomeScreen> {
  @override
  void initState() {
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Material(
        child: Scaffold(
      appBar: AppBar(
        title: Text("Demo Scroll"),
      ),
      body: Container(
        height: double.infinity,
        width: double.infinity,
        color: Colors.black,
        child: SingleChildScrollView(

            child: Column(

              children: <Widget>[
                Container(
                  height: MediaQuery.of(context).size.height*0.6,
                  child: Column(
                    children: <Widget>[
                      CommonWidget("Calories", "150"),
                      CommonWidget("Protein", "9g"),
                      CommonWidget("Carbs", "15g"),
                      CommonWidget("Fat", "25g"),
                    ],
                  ),
                ),
                Container(
                  height: MediaQuery.of(context).size.height * 0.4,
                  child: Align(
                    alignment: Alignment.topCenter,
                    child: Column(
                      children: <Widget>[
                        Row(
                          children: <Widget>[
                            Expanded(
                              child: TextField(
                                style: new TextStyle(color: Colors.white),
                                decoration: InputDecoration(
                                    enabledBorder: OutlineInputBorder(
                                      borderSide: BorderSide(color: Colors.white),
                                    ),
                                    focusedBorder: OutlineInputBorder(
                                      borderSide: BorderSide(color: Colors.white),
                                    ),
                                    labelText: "Serving"),
                              ),
                            ),
                            SizedBox(
                              width: 10.0,
                            ),
                            Expanded(
                              child: TextField(
                                style: new TextStyle(color: Colors.white),
                                decoration: InputDecoration(
                                    enabledBorder: OutlineInputBorder(
                                      borderSide: BorderSide(color: Colors.white),
                                    ),
                                    focusedBorder: OutlineInputBorder(
                                      borderSide: BorderSide(color: Colors.white),
                                    ),
                                    labelText: "Germs"),
                              ),
                            ),
                          ],
                        ),
                        SizedBox(
                          height: 10.0,
                        ),
                        OutlineButton(
                          borderSide: BorderSide(color: Colors.white),
                          color: Colors.black,
                          onPressed: () {},
                          child: Padding(
                            padding: EdgeInsets.all(20),
                            child: Text('   Ok  ',
                                style: TextStyle(color: Colors.white)),
                          ),
                        )
                      ],
                    ),
                  ),
                )




              ],
            ),
          ),
        ),

    ));
  }

  Widget CommonWidget(var name, var value) {
    return Padding(
      padding: EdgeInsets.all(15.0),
      child: Column(
        children: <Widget>[
          Row(
            children: <Widget>[
              Expanded(
                child: Text(
                  name,
                  style: TextStyle(fontSize: 16.0, color: Colors.white),
                ),
              ),
              Expanded(
                child: Align(
                  alignment: Alignment.centerRight,
                  child: Text(value,
                      style: TextStyle(fontSize: 16.0, color: Colors.white)),
                ),
              )
            ],
          ),
          Divider(
            color: Colors.white,
            height: 20.0,
          )
        ],
      ),
    );
  }
}

И вывод будет следующим в примере

enter image description here

0 голосов
/ 09 мая 2020
   Scaffold(
  resizeToAvoidBottomInset: true)

просто добавьте его в свой код.

...