Контейнер становится невидимым при добавлении к нему текстовых полей во Flutter

У меня есть Container, который должен включать два TextField, где я могу вставить название продукта и описание. Предполагается, что он появится и займет свое место при нажатии FloatingActionButton. Это на самом деле работает, пока я не вставлю TextField, и я не могу понять, почему.

Это код Cointainer, который я написал:

Padding(
  padding: const EdgeInsets.only(top: 4, bottom: 12),
  child: Container(
      width: 400,
      height: 125,
      decoration: BoxDecoration(
        color: Color(0xFF00ABB3),
        borderRadius: BorderRadius.all(Radius.circular(widgetsRadius))
      ),
      child: Padding(
        padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 20),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 25),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: const [
                  TextField(
                    decoration: InputDecoration(
                      hintText: "Name"
                    ),
                  ),
                  TextField(
                    decoration: InputDecoration(
                        hintText: "Description"
                    ),
                  )
                ],
              ),
            ),
            GestureDetector(
              onTap: () {
                setState(() {
                  isButtonVisible = !isButtonVisible;
                });
              },
              child: Icon(Icons.arrow_circle_right, color: Colors.white,)
            )
          ],
        ),
      ),
    ),
);

Вот результат без двух TextField:

Вот результат с двумя TextField:

Часть кода, где я на самом деле использую isButtonVisible (по запросу @Canada2000):

Scaffold(
  body: Padding(
    padding: const EdgeInsets.only(left: 28, right: 28, top: 35, bottom: 10),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        AnimatedCrossFade(
          duration: const Duration(milliseconds: 150),
          sizeCurve: Curves.easeOutCirc,
          firstChild: _addProductButton(),
          secondChild: _emptyProductContainer(),
          crossFadeState: isButtonVisible ? CrossFadeState.showFirst : CrossFadeState.showSecond,
        ),
      ],
    ),
  ),
);

Можете ли вы показать часть своего кода, где вы используете isButtonVisible

Canada2000 27.11.2022 23:34
0
1
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы запустите свой код, вы увидите эту ошибку в выводе:

layoutConstraints.maxWidth < double.infinity
"An InputDecorator, which is typically created by a TextField, cannot have an unbounded width.\nThis happens when the parent widget does not provide a finite width constraint. For example, if the InputDecorator is contained by a Row, then its width must be constrained. An Expanded widget or a SizedBox can be used to constrain the width of the InputDecorator or the TextField that contains it."

Это означает, что TextField занимает бесконечную ширину.

Итак, оберните TextFiedSizedBox:

SizedBox(
                      width: 100,
                      child: TextField(
                        decoration: InputDecoration(hintText: "Name"),
                      ),
                    ),

Кроме того, вы можете увеличить высоту родителя Container(), чтобы видеть все виджеты, когда они обрезаются.

Вот полный работающий пример:

import 'package:flutter/material.dart';

const Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: darkBlue,
      ),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  const MyWidget({Key? key}) : super(key: key);

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.only(top: 4, bottom: 12),
      child: Container(
        width: 400,
        height: 300,
        decoration: BoxDecoration(
            color: Color(0xFF00ABB3),
            borderRadius: BorderRadius.all(Radius.circular(15))),
        child: Padding(
          padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 20),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Padding(
                padding: const EdgeInsets.symmetric(vertical: 25),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: const [
                    SizedBox(
                      width: 100,
                      child: TextField(
                        decoration: InputDecoration(hintText: "Name"),
                      ),
                    ),
                    SizedBox(
                      width: 100,
                      child: TextField(
                        decoration: InputDecoration(hintText: "Description"),
                      ),
                    )
                  ],
                ),
              ),
              GestureDetector(
                  onTap: () {
                    setState(() {
                      // isButtonVisible = !isButtonVisible;
                    });
                  },
                  child: Icon(
                    Icons.arrow_circle_right,
                    color: Colors.white,
                  ))
            ],
          ),
        ),
      ),
    );
    ;
  }
}

Ваше решение работает, даже лучше, чем у @YeasinSheikh.

Marco Tartaglione 28.11.2022 16:36
Ответ принят как подходящий

Вы можете обернуть виджет Padding с помощью Expanded, он займет доступную ширину внутри строки для TextField.

child: Padding(
  padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 20),
  child: Row(
    mainAxisAlignment: MainAxisAlignment.spaceBetween,
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
      Expanded(child:Padding(
        padding: const EdgeInsets.symmetric(vertical: 25),
        child: Column(

Ваше решение работает отлично. Решение @MendelG работает еще лучше.

Marco Tartaglione 28.11.2022 16:36

Другие вопросы по теме