Я получаю исключение при рендеринге, которое не понимаю, как исправить. Я пытаюсь создать столбец с 3 строками.
Строка [Изображение]
Строка [TextField]
Ряд [кнопки]
Вот мой код для создания контейнера:
Container buildEnterAppContainer(BuildContext context) {
var container = new Container(
padding: const EdgeInsets.all(8.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
buildImageRow(context),
buildAppEntryRow(context),
buildButtonRow(context)
],
),
);
return container;
}
и мой код buildAppEntryRow для текстового контейнера
Widget buildAppEntryRow(BuildContext context) {
return new Row(
children: <Widget>[
new TextField(
decoration: const InputDecoration(helperText: "Enter App ID"),
style: Theme.of(context).textTheme.body1,
)
],
);
}
Когда я бегу, я получаю следующее исключение:
I/flutter ( 7674): BoxConstraints forces an infinite width.
I/flutter ( 7674): These invalid constraints were provided to RenderStack's layout() function by the following
I/flutter ( 7674): function, which probably computed the invalid constraints in question:
I/flutter ( 7674): RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:256:13)
I/flutter ( 7674): The offending constraints were:
I/flutter ( 7674): BoxConstraints(w=Infinity, 0.0<=h<=Infinity)
Если я изменю buildAppEntryRow на TextField вместо этого
Widget buildAppEntryRow2(BuildContext context) {
return new TextField(
decoration: const InputDecoration(helperText: "Enter App ID"),
style: Theme.of(context).textTheme.body1,
);
}
Я больше не получаю исключения. Что мне не хватает в реализации строки, из-за которой она не может рассчитать размер этой строки?
Ответы:
(Я предполагаю, что вы используете a,
Row
потому чтоTextField
в будущем хотите разместить другие виджеты рядом с.)Row
Виджет хочет определить характеристическую размер его негибких детей , так что знает , как много места , что он оставил для гибких из них. ОднакоTextField
не имеет собственной ширины; он знает только, как изменить размер до полной ширины родительского контейнера. Попробуйте обернуть его вFlexible
или,Expanded
чтобы сообщить,Row
что вы ожидаете, что онTextField
займет оставшееся место:new Row( children: <Widget>[ new Flexible( child: new TextField( decoration: const InputDecoration(helperText: "Enter App ID"), style: Theme.of(context).textTheme.body1, ), ), ], ),
источник
mainAxisAlignment
к прерыванию виджета Row. С двумя текстовыми виджетами проблем нет, но с текстовым виджетом и содержащимся вFlexible
нем виджетом Textfield выравнивается по левому краю без интервала.Вы получаете эту ошибку, потому что
TextField
расширяется в горизонтальном направленииRow
, поэтому нам нужно ограничить ширинуTextField
, есть много способов сделать это.Использовать
Expanded
Использовать
Flexible
Оберните его
Container
илиSizedBox
и предоставьтеwidth
Row( children: <Widget>[ SizedBox(width: 100, child: TextField()), OtherWidget(), ], )
источник
TextField
в одном ряду.вы должны использовать гибкий, чтобы использовать текстовое поле внутри строки.
new Row( children: <Widget>[ new Text("hi there"), new Container( child:new Flexible( child: new TextField( ), ),//flexible ),//container ],//widget ),//row
источник
Container
, вы можете использоватьFlexible
напрямую.Решение состоит в том, чтобы поместить вас
Text()
внутрь одного из следующих виджетов: ЛибоExpanded
илиFlexible
. Итак, ваш код с использованием Expanded будет выглядеть так:Expanded( child: TextField( decoration: InputDecoration( hintText: "Demo Text", hintStyle: TextStyle(fontWeight: FontWeight.w300, color: Colors.red) ), ), ),
источник
Как упомянул @Asif Shiraz, у меня была такая же проблема, и я решил ее, обернув столбец в гибкий, вот так,
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: Row( children: <Widget>[ Flexible( child: Column( children: <Widget>[ Container( child: TextField(), ) //container ], )) ], mainAxisAlignment: MainAxisAlignment.spaceBetween, ), )); } }
источник
Простое решение обернуть
Text()
внутриContainer()
. Итак, ваш код будет таким:Здесь вы также получаете атрибуты ширины и высоты контейнера, чтобы настроить внешний вид вашего текстового поля. Нет необходимости использовать,
Flexible
если вы обертываете текстовое поле внутри контейнера.источник
width: n
У меня такая же проблема.
Если вы хотите, вы можете использовать виджет Table, чтобы избежать подобных проблем с TextField.
источник
Row( children: [ Expanded( flex: 1, child: Padding( padding: EdgeInsets.only(left: 5.0,right: 5.0), child: TextFormField( controller: commentController, validator: (String value){ if(value.isEmpty){ // ignore: missing_return return 'Comment cannot be blank.'; } }, decoration: InputDecoration( labelText: "Comment", labelStyle: TextStyle( fontFamily: 'Montserrat', fontWeight: FontWeight.bold, color: Colors.grey), focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.green))), ), ), ), ], ),
источник