【问题标题】:Flutter - Sliver Layout horizontal scroll inside Sliver ListFlutter - Sliver List 内的 Sliver Layout 水平滚动
【发布时间】:2019-03-15 05:39:41
【问题描述】:

我尝试在 Sliver List (CustomScrollview - SliverList) 中制作水平滚动列表

这是我的代码:

import 'package:flutter/material.dart';
class DetailScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
   return Scaffold(
    body: CustomScrollView(
        slivers: <Widget>[
        DetailAppBar(),
        SliverPadding(
          padding: EdgeInsets.all(16.0),
          sliver: SliverList(
            delegate: SliverChildListDelegate(
              [
                Card(child: Text('data'),),
                Card(child: Text('data'),),
                Card(child: Text('data'),),
                Card(child: Text('data'),),

                // Scrollable horizontal widget here
              ],
            ),
          ),
        ),
      ],
    ),
    bottomNavigationBar: NavigationButton());


 }

}

你能给我这个案例的例子或解决方案吗?我真的需要一些帮助。

【问题讨论】:

  • 将滚动方向更改为水平。即scrollDirection: Axis.horizontal,
  • 不,我的意思是我的“// 此处可滚动水平小部件”中的小部件。但是您的解决方案使所有小部件从上到下水平滚动

标签: mobile layout dart flutter


【解决方案1】:

其他解决方案对我不起作用,因为当我使用 ListView 时它会出错

这是我写的一个名为 HorizontalSliverList 的类,它可以很好地完成工作

这是你需要复制的类:

class HorizontalSliverList extends StatelessWidget {
  final List<Widget> children;
  final EdgeInsets listPadding;
  final Widget divider;

  const HorizontalSliverList({
    Key key,
    @required this.children,
    this.listPadding = const EdgeInsets.all(8),
    this.divider,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SliverToBoxAdapter(
      child: SingleChildScrollView(
        scrollDirection: Axis.horizontal,
        child: Padding(
          padding: listPadding,
          child: Row(children: [
            for (var i = 0; i < children.length; i++) ...[
              children[i],
              if (i != children.length - 1) addDivider(),
            ],
          ]),
        ),
      ),
    );
  }

  Widget addDivider() => divider ?? Padding(padding: const EdgeInsets.symmetric(horizontal: 8));
}

【讨论】:

    【解决方案2】:

    SliverToBoxAdapter 中使用ListView

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: CustomScrollView(
            slivers: <Widget>[
              SliverPadding(
                padding: EdgeInsets.all(16.0),
                sliver: SliverList(
                  delegate: SliverChildListDelegate(
                    [
                      Card(
                        child: Text('data'),
                      ),
                      Card(
                        child: Text('data'),
                      ),
                      Card(
                        child: Text('data'),
                      ),
                      Card(
                        child: Text('data'),
                      ),
                    ],
                  ),
                ),
              ),
              SliverToBoxAdapter(
                child: Container(
                  height: 100.0,
                  child: ListView.builder(
                    scrollDirection: Axis.horizontal,
                    itemCount: 10,
                    itemBuilder: (context, index) {
                      return Container(
                        width: 100.0,
                        child: Card(
                          child: Text('data'),
                        ),
                      );
                    },
                  ),
                ),
              ),
            ],
          ),
        );
      }
    

    【讨论】:

    • 如何在不指定容器高度的情况下使 ListView 高度响应?
    • 你不能因为列表视图的工作原理。他们试图尽可能多地占用空间,并且无法从另一个列表视图中获取大小。您可以做的是计算项目的高度并相应地设置列表视图的高度
    • @ChristianX:你会如何计算物品的高度?我的意思是你的意思是对它们进行硬编码?或者有没有办法获得小部件的高度?
    猜你喜欢
    • 2021-07-27
    • 2023-01-17
    • 2019-11-20
    • 2020-03-27
    • 2022-01-10
    • 1970-01-01
    • 2020-09-19
    • 2020-10-14
    • 2021-06-04
    相关资源
    最近更新 更多