У меня есть 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,
),
],
),
),
);
Если вы запустите свой код, вы увидите эту ошибку в выводе:
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
занимает бесконечную ширину.
Итак, оберните TextFied
SizedBox
:
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.
Вы можете обернуть виджет 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 работает еще лучше.
Можете ли вы показать часть своего кода, где вы используете isButtonVisible