我收到一个渲染异常,我不明白如何修复。我正在尝试创建一个包含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,
);
}
我不再得到例外。 Row实现导致它无法计算该行的大小,我错过了什么?
答案 0 :(得分:149)
(我假设您正在使用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,
),
),
],
),
答案 1 :(得分:7)
您应该使用Flexible在一行内使用Textfield。
new Row(
children: <Widget>[
new Text("hi there"),
new Container(
child:new Flexible(
child: new TextField( ),
),//flexible
),//container
],//widget
),//row
答案 2 :(得分:3)
您会收到此错误,因为TextField
在水平方向上扩展,Row
也在水平方向上扩展,因此我们需要限制TextField
的宽度,有很多方法可以做到。
使用Expanded
Row(
children: <Widget>[
Expanded(child: TextField()),
OtherWidget(),
],
)
使用Flexible
Row(
children: <Widget>[
Flexible(child: TextField()),
OtherWidget(),
],
)
将其包装在Container
或SizedBox
中并提供width
Row(
children: <Widget>[
SizedBox(width: 100, child: TextField()),
OtherWidget(),
],
)
答案 3 :(得分:1)
一个简单的解决方案是将Text()
包装在Container()
中。
因此,您的代码将类似于:
Container(
child: TextField()
)
在这里,您还可以获取容器的width和height属性,以调整文本字段的外观。如果您将文本字段包装在容器中,则无需使用Flexible
。
答案 4 :(得分:1)
正如@Asif Shiraz提到的那样,我遇到了同样的问题,并通过在Flexible Pack中包装列解决了此问题,
new_poke_ohe = pd.concat([new_poke_df, new_gen_features, new_leg_features],
axis=1)
columns = sum([['Name', 'Generation', 'Gen_Label'],
gen_feature_labels,
['Legendary', 'Lgnd_Label'], leg_feature_labels], [])
new_poke_ohe[columns]
答案 5 :(得分:0)
解决方案是将Text()
包装在以下小部件之一中:
Expanded
或Flexible
。因此,您使用Expanded的代码将类似于:
Expanded(
child: TextField(
decoration: InputDecoration(
hintText: "Demo Text",
hintStyle: TextStyle(fontWeight: FontWeight.w300, color: Colors.red)
),
),
),
答案 6 :(得分:0)
我有同样的问题。
如果需要,可以使用 Table 小部件来避免 TextField
这种问题答案 7 :(得分:0)
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))),
),
),
),
],
),
答案 8 :(得分:0)
只需用 Flexible 或 Expanded 扩展 Textfield 。
答案 9 :(得分:-1)
如果您希望 TextField 根据其内容水平调整自身大小,那么您可以使用 IntrinsicWidth 小部件包装它。
Row(
children: [
Text("From"),
SizedBox(width: 10,),
IntrinsicWidth(child: TextField(
textAlignVertical: TextAlignVertical.center,
decoration: InputDecoration(
hintText: "Start Date Start Date Start Date",
hintStyle: TextStyle(color: Colour.pBlue, fontSize: 14),
border: InputBorder.none,
),
),),
SizedBox(width: 10,),
Text("To"),
SizedBox(width: 10,),
IntrinsicWidth(child: IntrinsicWidth(child: TextField(
textAlignVertical: TextAlignVertical.center,
decoration: InputDecoration(
hintText: "End Date",
hintStyle: TextStyle(color: Colour.pBlue, fontSize: 14),
border: InputBorder.none,
),
),)),
],
)
但在您的代码中使用它之前,请确保了解 Flutter 对这个小部件的看法。
<块引用>创建一个将其子级调整为子级固有宽度的小部件。 这个班比较贵。尽可能避免使用它。