【问题标题】:How to vertically stack ListView's with one ListView expanded如何在展开一个 ListView 的情况下垂直堆叠 ListView
【发布时间】:2018-10-01 03:51:04
【问题描述】:

我正在构建一个简单的 Flutter 应用程序,其中两个 ListView 相互叠加。我试图将占用所有可用空间的第一个列表视图(文件列表)定位在第二个列表视图(标签列表)上方,它只占用显示标签所需的空间。

Here is a mockup of the desired design (image)

我尝试将列表添加到Stack 小部件,但列表重叠。我也尝试将ListView 添加到两个Expanded 小部件,但这也不起作用。

This is what my app looks like 使用 Stack 小部件。

这里是所有使用的代码(如果你想运行它,复制并粘贴到默认项目main.dart

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage();

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Stack(
        alignment: Alignment.bottomCenter,
        children: [
          new ListView.builder(
            itemCount: 10,
            itemBuilder: (context, index) {
              return new ListTile(
                title: new Text("File $index"),
              );
            },
          ),
          new Text("Tags"),
          new ListView.builder(
            scrollDirection: Axis.vertical,
            itemCount: 10,
            itemBuilder: (context, index) {
              return new Chip(label: new Text("Tag $index"));
            }
          ),
        ],
      ),
    );
  }
}

有人知道如何在 Flutter where you have two vertical ListView's with some space between them 中制作这种布局吗?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    使用内部有多个 SliverLists 的 CustomScrollView:

      CustomScrollView(
        slivers: <Widget>[
          SliverList(
            delegate: SliverChildListDelegate(List<Text>.generate(7, (int i) {
              return Text("List 1 Item $i");
            })),
          ),
          SliverToBoxAdapter(
            child: Text('Tags'),
          ),
          SliverList(
            delegate: SliverChildListDelegate(List<Text>.generate(3, (int i) {
              return Text("List 2 Item $i");
            })),
          ),
        ],
      )
    

    【讨论】:

    • 刚刚尝试过,使用ColumnExpanded 不会将第二个堆叠在第一个下方,而是在屏幕上同时显示 ListView1 占据屏幕的 70%,第二个占据占屏幕的 30%。例如,如果ListView1 中有 100 个文件,用户应该向下滚动以查看 ListView2,但使用这种方法,ListView1ListView2 将同时可见。
    • 我想我现在得到了你想要的。可能是shrinkWrap 属性,让我测试一下。
    • 用正确的解决方案编辑了答案。让我知道它是否有效。
    • 非常感谢!我试过了,这几乎是我想要的。基本上我希望List 1Expanded 那样占用空白空间,然后在底部得到List 2。运行您的解决方案后,我截取了屏幕截图以更好地解释https://i.imgur.com/QfuKLvQ.png
    • SliverFillRemaining (如果可用,它会填满空白空间)几乎可以满足我的要求,但是它说“除了这个条子之外,没有任何空间可以容纳任何东西”,所以我无法添加第二个列表小部件。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2012-04-30
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多