Dol*_*rma 2 flutter flutter-layout
在我们的应用程序的一部分中,我希望BottomSheet具有以下代码形式的简单形式。不幸的是,当我输入时,我得到了错误
在performLayout()期间引发了以下断言:通常由TextField创建的InputDecorator不能具有无界的宽度。当父窗口小部件不提供有限的宽度约束时,就会发生这种情况。例如,如果InputDecorator包含在Row中,则必须限制其宽度。扩展窗口小部件或SizedBox可用于约束InputDecorator或包含它的TextField的宽度。'package:flutter / src / material / input_decorator.dart':断言失败:第881行pos 7行:'layoutConstraints.maxWidth <double.infinity'
我实现的代码:
void _settingModalBottomSheet(context){
showModalBottomSheet(
context: context,
elevation: 8.0,
builder: (BuildContext bc){
return Directionality(
textDirection: TextDirection.rtl,
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: 250.0
),
child: Container(
padding: EdgeInsets.fromLTRB(0.0,10.0,0.0,10.0),
child: new Wrap(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Text(
'please fill this form',
style: TextStyle(
fontSize: 13.0,
),
),
),
),
Divider(),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Column(
children: <Widget>[
Text('item 1'),
Container(
child: TextField(),
)
],
),
Column(
children: <Widget>[
Text('item 2'),
Container(
child: TextField(),
)
],
),
],
),
],
),
),
),
);
}
);
}
Run Code Online (Sandbox Code Playgroud)
你将不得不提供特定宽度的TextField,只需提供width您Container或您的包裹Column中 Expanded。
解决方案1
Container(
width: 100, // do it in both Container
child: TextField(),
),
Run Code Online (Sandbox Code Playgroud)
解决方案2
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded( // wrap your Column in Expanded
child: Column(
children: <Widget>[
Text('item 1'),
Container(child: TextField()),
],
),
),
Expanded( // wrap your Column in Expanded
child: Column(
children: <Widget>[
Text('item 2'),
Container(child: TextField()),
],
),
),
],
),
Run Code Online (Sandbox Code Playgroud)
在上面的问题中, Column 尝试比Row (其父级)可以分配给它的空间更宽 ,从而导致溢出错误。为什么 Column 要这样做?要了解这种布局行为,您需要了解 Flutter 框架如何进行布局:
“为了执行布局,Flutter 以深度优先遍历的方式遍历渲染树, 并将大小约束 从父级传递给子级……子级通过 在父级建立的约束内将大小传递给父级对象来做出响应 。”
在这种情况下, Row 小部件不会限制其子部件的大小,也不会限制 Column 小部件。由于缺乏来自其父小部件的约束,第二个 Text 小部件试图与它需要显示的所有字符一样宽。然后,Text 小部件的自定义宽度 Column 与它的父Row 小部件可以提供的最大水平空间发生冲突 。
如何解决?
好吧,你需要确保 Column 不会试图变得比它更宽。为此,您需要限制其宽度。一种方法是将 包装 Column 在一个 Expanded 小部件中:
可以通过将 TextField 包装在 Expanded 或 Flexible 小部件中来避免该错误。所以相信专栏应该是Expanded:
Row(
children: [
Expanded(
child: Column(
children: [
Text('This is the text and there enough to wrap'),
TextField()
]
))
]
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2680 次 |
| 最近记录: |