246

我遇到了一个我不知道如何修复的渲染异常。我正在尝试创建一个有 3 行的列。

行 [图片]

行 [文本字段]

行 [按钮]

这是我构建容器的代码:

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 实现缺少什么?

4

10 回答 10

503

(我假设您使用 a 是Row因为您希望TextField将来将其他小部件放在旁边。)

Row部件想要确定其非灵活子项的固有大小,因此它知道它为灵活子项留下了多少空间。但是,TextField没有固有宽度;它只知道如何将自己的大小调整到其父容器的全宽。尝试将其包装在FlexibleorExpanded中,告诉Row您您希望TextField占用剩余空间:

      new Row(
        children: <Widget>[
          new Flexible(
            child: new TextField(
              decoration: const InputDecoration(helperText: "Enter App ID"),
              style: Theme.of(context).textTheme.body1,
            ),
          ),
        ],
      ),
于 2017-08-31T21:40:19.010 回答
76

你会得到这个错误,因为TextField在水平方向上扩展了Row,所以我们需要限制 的宽度TextField,有很多方法可以做到这一点。

  1. 采用Expanded

     Row(
      children: <Widget>[
        Expanded(child: TextField()),
        OtherWidget(),
      ],
    )
    
  2. 采用Flexible

    Row(
      children: <Widget>[
        Flexible(child: TextField()),
        OtherWidget(),
      ],
    )
    
  3. 将其包裹在Containeror中SizedBox并提供width

    Row(
      children: <Widget>[
        SizedBox(width: 100, child: TextField()),
        OtherWidget(),
      ],
    )       
    
于 2019-07-07T14:59:27.367 回答
14

您应该使用灵活在行内使用文本字段。

new Row(
              children: <Widget>[
                new Text("hi there"),
                new Container(
                  child:new Flexible(
                        child: new TextField( ),
                            ),//flexible
                ),//container


              ],//widget
            ),//row
于 2018-06-23T08:42:58.380 回答
7

正如@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,
          ),
        ));
  }
}
于 2018-12-01T02:40:44.897 回答
7

解决方案是将您包装Text()在以下小部件之一中: 要么Expanded要么Flexible. 因此,您使用 Expanded 的代码将如下所示:

Expanded(
           child: TextField(
             decoration: InputDecoration(
               hintText: "Demo Text",
               hintStyle: TextStyle(fontWeight: FontWeight.w300, color: Colors.red)
              ),
           ),
        ),
于 2019-06-27T11:11:35.147 回答
1
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))),
            ),
          ),
        ),
      ],
    ),
于 2020-09-09T14:28:05.677 回答
0

我有同样的问题。

如果需要,可以使用Table小部件来避免TextField的此类问题

于 2020-08-17T13:24:57.180 回答
-1

Text()一个简单的解决方案是将您的内部包装为Container(). 因此,您的代码将如下所示:

Container(
      child: TextField()
)

在这里,您还可以获取容器的宽度和高度属性,以调整文本字段的外观。Flexible如果您将文本字段包装在容器内,则无需使用。

于 2018-11-08T02:55:57.317 回答
-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 对这个小部件的描述。

创建一个将其子级调整为子级固有宽度的小部件。这个类比较贵。尽可能避免使用它。

于 2021-07-05T09:20:23.550 回答
-1

最好的解决方案是使用 absouluts 空间值

        Row(
          children: <Widget>[
            SizedBox(
              width: MediaQuery.of(context).size.width * 0.3, 
              child: _telephonePrefixInput()
            ),
            SizedBox(width: MediaQuery.of(context).size.width * 0.02),
            Expanded(child: _telephoneInput()),
          ],
        ),
于 2021-09-03T08:39:15.977 回答