Dart 正在崩溃的ListView.builder

Dart 正在崩溃的ListView.builder,dart,flutter,Dart,Flutter,我正在尝试在一个Flitter应用程序中设置搜索页面。此小部件显示一个搜索字段,监视用户键入的内容,并根据搜索字段中的每次更改更新建议点击列表。相关片段如下: List suggestList=[新文本(''); @凌驾 小部件构建(构建上下文){ 返回列( 儿童:[ 新形式( 子项:新建TextFormField( //\控制器侦听更改和更新建议列表 控制器:_控制器, 自动更正:错误, 装饰:输入装饰(labelText:“在此处搜索”), 保存:(str)=>打印(str), ), ),

我正在尝试在一个Flitter应用程序中设置搜索页面。此小部件显示一个搜索字段,监视用户键入的内容,并根据搜索字段中的每次更改更新建议点击列表。相关片段如下:

List suggestList=[新文本('');
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
新形式(
子项:新建TextFormField(
//\控制器侦听更改和更新建议列表
控制器:_控制器,
自动更正:错误,
装饰:输入装饰(labelText:“在此处搜索”),
保存:(str)=>打印(str),
),
),
新建ListView.builder(
itemBuilder:(上下文,索引)=>suggestList[index],
itemCount:suggestList.length,
)
],
);
}
此小部件崩溃,错误消息长达数页,但包含的文本表明我的错误是布局问题。我对飞舞和飞镖还不熟悉,无法真正将这里的建议有意义地应用到我的问题上

══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following assertion was thrown during performResize():
Vertical viewport was given unbounded height.
Viewports expand in the scrolling direction to fill their container.
In this case, a vertical
viewport was given an unlimited amount of vertical space in which to expand. 
This situation
typically happens when a scrollable widget is nested inside another 
scrollable widget.
If this widget is always nested in a scrollable widget there is no 
need to use a viewport because
there will always be enough vertical space for the children. 
In this case, consider using a Column
instead. Otherwise, consider using the "shrinkWrap" property 
(or a ShrinkWrappingViewport) to size
the height of the viewport to the sum of the heights of its children.
在下面的代码片段中,我尝试通过展示一系列文本小部件来模拟我想要的效果:

@覆盖
小部件构建(构建上下文){
返回列(
儿童:[
新形式(
子项:新建TextFormField(
控制器:_控制器,
自动更正:错误,
装饰:输入装饰(labelText:“在此处搜索”),
保存:(str)=>打印(str),
),
),
//将前两项手动显示为文本小部件
建议列表[0],
suggestList.length>1?suggestList[1]:新文本(“…”),
],
);
}

这是一个完美的工程,但看起来丑陋,显然是一个黑客,我不希望在最后的应用程序。我还确认了我的逻辑工作正常——我检查了
suggestList
是否始终填充了至少一个适合显示的
Text
小部件。关于如何修复ListView方法有什么想法吗?

一种方法是像这样构建列子级

  @override
  Widget build(BuildContext context) {
    List<Widget> columnChildren = [
      new Form(
        child: new TextFormField(
          // _controller listens for changes and updates suggestList
          //controller: _controller,
          autocorrect: false,
          decoration: InputDecoration(labelText: 'Search here'),
          onSaved: (str) => print(str),
        ),
      )
    ];
    columnChildren.addAll(suggestList);

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Column(
        children: columnChildren,
      ),
    );
  }
@覆盖
小部件构建(构建上下文){
列表列子项=[
新形式(
子项:新建TextFormField(
//\控制器侦听更改和更新建议列表
//控制器:_控制器,
自动更正:错误,
装饰:输入装饰(labelText:“在此处搜索”),
保存:(str)=>打印(str),
),
)
];
columnChildren.addAll(建议列表);
归还新脚手架(
appBar:新的appBar(
标题:新文本(widget.title),
),
正文:新栏目(
儿童:儿童,,
),
);
}
或者最好还是把建议列表作为一个列表

  List<String> suggestList = [
    'hello',
    'world',
  ];

  @override
  Widget build(BuildContext context) {
    List<Widget> columnChildren = [
      new Form(
        child: new TextFormField(
          // _controller listens for changes and updates suggestList
          //controller: _controller,
          autocorrect: false,
          decoration: InputDecoration(labelText: 'Search here'),
          onSaved: (str) => print(str),
        ),
      )
    ];
    columnChildren.addAll(suggestList.map((s) => new Text(s)).toList());
列表建议列表=[
“你好”,
“世界”,
];
@凌驾
小部件构建(构建上下文){
列表列子项=[
新形式(
子项:新建TextFormField(
//\控制器侦听更改和更新建议列表
//控制器:_控制器,
自动更正:错误,
装饰:输入装饰(labelText:“在此处搜索”),
保存:(str)=>打印(str),
),
)
];
columnChildren.addAll(suggestList.map((s)=>新文本)).toList();
或者,将ListView包装在展开的

  body: new Column(
    children: <Widget>[
      new Form(
        child: new TextFormField(
          // _controller listens for changes and updates suggestList
          //controller: _controller,
          autocorrect: false,
          decoration: InputDecoration(labelText: 'Search here'),
          onSaved: (str) => print(str),
        ),
      ),
      new Expanded(
        child: new ListView.builder(
          itemBuilder: (context, i) => new Text(wordList[i]),
          itemCount: wordList.length,
        ),
      ),
    ],
  ),
body:新列(
儿童:[
新形式(
子项:新建TextFormField(
//\控制器侦听更改和更新建议列表
//控制器:_控制器,
自动更正:错误,
装饰:输入装饰(labelText:“在此处搜索”),
保存:(str)=>打印(str),
),
),
新扩展(
子项:新建ListView.builder(
itemBuilder:(上下文,i)=>新文本(单词列表[i]),
itemCount:wordList.length,
),
),
],
),

这允许在固定表单下无限滚动列表。

谢谢,@Richard Heap,这就像一个符咒。知道ListBuilder方法为什么是错误的吗?你有一个垂直排列的小部件在另一个小部件中。因此,你可以将所有内容放入列中,或者将表单作为列表的零索引返回(尽管我认为您不希望表单从顶部滚动).ListBuilder是长滚动列表的理想选择,但它感觉您总是会有一个简短的建议列表。添加了一种在固定表单下创建滚动列表的方法。谢谢,这些不仅解决了我的问题,而且帮助我理解了基本机制。非常感谢。我特别喜欢扩展方法,因为它允许单个poi设置列表中每个组件项格式的nt。