单独的小部件中的Listbuilder无法正常运行

时间:2019-01-29 12:11:42

标签: flutter flutter-layout

我尝试了Flutter.io的listbuilder演示。效果很好,但是我想在页面上添加一个textview,因此我将listbuilder移到了一个单独的Widget中,这引发了以下错误:

发生异常。 FlutterError(无法命中测试从未布置过的渲染框。在此RenderBox上调用了hitTest()方法:RenderStack#894cd NEEDS-LAYOUT NEEDS-PAINT不幸的是,此对象的几何此时不知道,可能是因为从未布置过。这意味着它不能准确地进行命中测试。如果您在布局阶段本身尝试执行命中测试,请确保仅命中完成布局的测试节点(例如,节点的子节点,子节点, layout()方法已被调用)。

完整代码:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp(
    items: List<String>.generate(10, (i) => "Item $i"),
  ));
}

class MyApp extends StatelessWidget {
  final List<String> items;

  MyApp({Key key, @required this.items}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final title = 'Long List';

    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: body(),
      ),
    );
  }

  Widget body() {
    return Container(
        child: Column(children: <Widget>[
      ListView.builder(
        itemCount: items.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text('${items[index]}'),
          );
        },
      )
    ]));
  }
}

1 个答案:

答案 0 :(得分:0)

尝试删除Column中的body()

  Widget body() {
    return Container(
        child: /* Column(children: <Widget>[ */
      ListView.builder(
        itemCount: items.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text('${items[index]}'),
          );
        },
      )
    /* ]) */);
  }

这是因为Column似乎没有特定的大小来呈现子窗口小部件。 更多信息:https://flutter.io/docs/development/ui/layout/box-constraints#flex


更新@ 2019.02.18:

要为列表添加同级,可以尝试用Expanded将其包装,然后添加同级。

  Widget body() {
    return Container(
      child: Column(children: <Widget>[
        Text('DropdownButton'),
        Expanded(
          child: ListView.builder(
            itemCount: items.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('${items[index]}'),
              );
            },
          ),
        ),
      ])
    ),
  }