颤振:具有TextField / TextFormField的底页

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)

Cop*_*oad 7

你将不得不提供特定宽度的TextField,只需提供widthContainer或您的包裹ColumnExpanded

解决方案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)


Par*_*iya 5

在上面的问题中, 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)