渲染视口不支持返回固有尺寸。

6

我遇到了以下异常:

FlutterError(RenderViewport不支持返回内在尺寸。计算内在尺寸需要实例化视口的每个子项,这违背了视口懒惰加载的原则。如果您只是试图在主轴方向上缩小视口,请考虑使用RenderShrinkWrappingViewport渲染对象(ShrinkWrappingViewport widget),它可以在不实现内在尺寸API的情况下实现该效果。)

当我添加 ProductsWidget 时,就会出现此异常。

Products Widget 的代码如下:

class ProductsWidget extends GetResponsiveView<HomeTabController> {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      shrinkWrap: true,
      itemCount: 3,
      // padding: EdgeInsets.symmetric(vertical: 20),
      physics: NeverScrollableScrollPhysics(),
      itemBuilder: (context, index) => Column(
        children: [
          Row()])}}

调用代码是:

body: LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
        return SingleChildScrollView(
          child: ConstrainedBox(
            constraints: BoxConstraints(
              minHeight: constraints.maxHeight,
            ),
            child: IntrinsicHeight(
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Expanded(
                      //  flex: 1,
                      child: HomeAppBar()),
                  // listView
                  // i made shrinkWrap=true
                  // neverScroll
                  Flexible(fit: FlexFit.tight, child: ProductsWidget()),
                ],
              ),
            ),
          ),
        );
      }),
4个回答

8

6
那是因为ListView懒加载每个子项。您可以使用包装在SingleChildScrollView中的Column来替换ListView。

1

SingleChildScrollView替换为CustomScrollView,像这样:

return Scaffold(
  appBar: AppBar(
    title: Text('Expanded Scrollable'),
  ),
  body: CustomScrollView(
    physics: AlwaysScrollableScrollPhysics(),
    slivers: [
      SliverFillRemaining(
        fillOverscroll: true,
        child: Column(
          children: <Widget>[
            Text('Hello ... '),
            Divider(
              height: 2,
            ),
            Expanded(
              child: Container(color: Colors.red,), // replace this Container with your listview
            )
          ],
        ),
      )
    ],
  ),
);

0

我通过使用SizedBox并指定其高度和宽度来解决了我的问题。然后我将SizedBox包装在Column中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接