Flutter 在SingleChildScrollView中实现嵌套ListView

Flutter 在SingleChildScrollView中实现嵌套ListView,flutter,flutter-layout,Flutter,Flutter Layout,在这个示例代码中,我想将嵌套的ListView放在SingleChildScrollView中,但出现以下错误: RenderBox was not laid out: RenderRepaintBoundary#8de00 relayoutBoundary=up1 NEEDS-PAINT 'package:flutter/src/rendering/box.dart': Failed assertion: line 1694 pos 12: 'hasSize' 我的代码: void main

在这个示例代码中,我想将嵌套的ListView放在SingleChildScrollView中,但出现以下错误:

RenderBox was not laid out: RenderRepaintBoundary#8de00 relayoutBoundary=up1 NEEDS-PAINT
'package:flutter/src/rendering/box.dart':
Failed assertion: line 1694 pos 12: 'hasSize'
我的代码:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      home: Scaffold(
        appBar: AppBar(
          title: Text("Scrollview Demo"),
        ),
        body: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              Container(
                height: 50.0,
                color: Colors.green,
                child: Center(
                  child: Text('message'),
                ),
              ),
              Expanded(
                child: ListView.builder(
                  itemCount: 30,
                  itemBuilder: (context, index) {
                    return ListTile(title: Text("Index : $index"));
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在ListView中,您可以设置

包覆膜收缩:对

因此,ListView只占用所需的空间

要禁用ListView上的滚动,使其使用SingleChildScrollView的滚动,可以设置

物理学:永远不要读物理

您需要删除将子项设置为获取可用屏幕的扩展项,以防此处是无限的

在这里:

SingleChildScrollView(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Container(
            height: 50.0,
            color: Colors.green,
            child: Center(
              child: Text('message'),
            ),
          ),
          Flexible(
            child: ListView.builder(
              itemCount: 30,
              shrinkWrap: true,
              itemBuilder: (context, index) {
                return ListTile(title: Text("Index : $index"));
              },
            ),
          ),
        ],
      ),
    )

在ListView中,您可以设置

包覆膜收缩:对

因此,ListView只占用所需的空间

要禁用ListView上的滚动,使其使用SingleChildScrollView的滚动,可以设置

物理学:永远不要读物理

您需要删除将子项设置为获取可用屏幕的扩展项,以防此处是无限的

在这里:

SingleChildScrollView(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Container(
            height: 50.0,
            color: Colors.green,
            child: Center(
              child: Text('message'),
            ),
          ),
          Flexible(
            child: ListView.builder(
              itemCount: 30,
              shrinkWrap: true,
              itemBuilder: (context, index) {
                return ListTile(title: Text("Index : $index"));
              },
            ),
          ),
        ],
      ),
    )

不要使用SingleChildScrollView,而是使用Column作为子对象,只需使用ListView即可

    return Scaffold(
      body: ListView(
        children: <Widget>[
          Container(
            height: 104,
            child: Card(
              clipBehavior: Clip.antiAliasWithSaveLayer,
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[],
              ),
            ),
          ),
          ListView(
            shrinkWrap: true,
            physics: NeverScrollableScrollPhysics(),
          ),
        ],
      ),
    );

不要使用SingleChildScrollView,而是使用Column作为子对象,只需使用ListView即可

    return Scaffold(
      body: ListView(
        children: <Widget>[
          Container(
            height: 104,
            child: Card(
              clipBehavior: Clip.antiAliasWithSaveLayer,
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[],
              ),
            ),
          ),
          ListView(
            shrinkWrap: true,
            physics: NeverScrollableScrollPhysics(),
          ),
        ],
      ),
    );

我当时也处于同样的处境,我也这么做了:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      home: Scaffold(
        appBar: AppBar(
          title: Text("Scrollview Demo"),
        ),
        body: ListView.builder(
          itemCount: 30 + 1,
          itemBuilder: (context, index) {
            if (index == 0) {
              return Container(
                height: 50.0,
                color: Colors.green,
                child: Center(
                  child: Text('message'),
                ),
              );
            }
            return ListTile(title: Text('Index : ${index -1}'));
          },
        ),
      ),
    );
  }
}

我当时也处于同样的处境,我也这么做了:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      home: Scaffold(
        appBar: AppBar(
          title: Text("Scrollview Demo"),
        ),
        body: ListView.builder(
          itemCount: 30 + 1,
          itemBuilder: (context, index) {
            if (index == 0) {
              return Container(
                height: 50.0,
                color: Colors.green,
                child: Center(
                  child: Text('message'),
                ),
              );
            }
            return ListTile(title: Text('Index : ${index -1}'));
          },
        ),
      ),
    );
  }
}

你能不能用flexible小部件代替expanded并将列的mainAxisSize设置为min。你能不能用flexible小部件代替expanded并将列的mainAxisSize设置为min。