【问题标题】:How to make a horizontal ListView with two row in Flutter?如何在 Flutter 中制作具有两行的水平 ListView?
【发布时间】:2021-09-08 15:22:43
【问题描述】:

我试图在水平 GridView 或 ListView 内的两行中显示目录列表
而不是单行,列表数据来自服务器 水平 ListView 与一行工作正常 我怎样才能像下面的 GIF 一样做到这一点?

下面的图片我有什么

下面的 gif 我需要什么

[

下面的完整代码水平 ListView 与一行工作正常,我需要将其转换为 GridView 以便它可以显示两行和水平滚动

_catList() {
return Container(
  height: 150,
  child: ListView.builder(
    itemCount: catList.length < 10 ? catList.length : 10,
    scrollDirection: Axis.horizontal,
    shrinkWrap: true,
    physics: AlwaysScrollableScrollPhysics(),
    itemBuilder: (context, index) {
      return Padding(
        padding: const EdgeInsetsDirectional.only(end: 10),
        child: GestureDetector(
          onTap: () async {
            if (catList[index].subList == null ||
                catList[index].subList.length == 0) {
              await Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => ProductList(
                        name: catList[index].name,
                        id: catList[index].id,
                        tag: false,
                        updateHome: widget.updateHome),
                  ));
              if (mounted) setState(() {});
            } else {
              await Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => SubCat(
                        title: catList[index].name,
                        subList: catList[index].subList,
                        updateHome: widget.updateHome),
                  ));
              if (mounted) setState(() {});
            }
          },
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Padding(
                padding: const EdgeInsetsDirectional.only(bottom: 5.0),
                child: new ClipRRect(
                  borderRadius: BorderRadius.circular(25.0),
                  child: new FadeInImage(
                    fadeInDuration: Duration(milliseconds: 50),
                    image: NetworkImage(
                      catList[index].image,
                    ),
                    height: 100.0,
                    width: 100.0,
                    fit: BoxFit.cover,
                    imageErrorBuilder: (context, error, stackTrace) =>
                        erroWidget(100),

                    //  errorWidget: (context, url, e) => placeHolder(50),
                    placeholder: placeHolder(100),
                  ),
                ),
              ),
              Container(
                child: Text(
                  catList[index].name,
                  style: Theme.of(context).textTheme.caption.copyWith(
                      color: colors.fontColor,
                      fontWeight: FontWeight.w600,
                      fontSize: 15),
                  overflow: TextOverflow.ellipsis,
                  textAlign: TextAlign.center,
                ),
                width: 100,
              ),
            ],
          ),
        ),
      );
    },
  ),
);

}

【问题讨论】:

    标签: flutter dart listview


    【解决方案1】:

    你可以使用网格视图来归档这个东西。这是配置的sn-p。

    GridView.count(
                      shrinkWrap: true,
                      crossAxisCount: 2,
                      physics: const ClampingScrollPhysics(),
                      scrollDirection: Axis.horizontal,
                      crossAxisSpacing: 10,
                      mainAxisSpacing: 20,
                      children: ...)
    

    这里 crossAxisCount: 2,scrollDirection: Axis.horizontal是你需要的。

    【讨论】:

    • 如果我使用“scrollDirection: Axis.vertical”但使用“scrollDirection: Axis.horizo​​ntal”,则此工作正常,显示空白页
    • 最后解决的问题是“高度:250”,不包括在 GridView.count() 中
    • 很好,但这将是更好的方法之一,因为提到 250 高度可能会因设备 dp 而异。
    • 你的意思是不推荐固定高度,如果是的话更好
    • 从 MediaQuery 获取大小或使用 GridView
    【解决方案2】:

    您可以将ListView.builderitemCount: catList.length/2 一起使用,并返回带有两个项目(索引和索引+1)的Column

    或使用GridView.count:

    Container(
      height: 150,
      child: GridView.count(
        shrinkWrap: true,
        scrollDirection: Axis.horizontal,
        crossAxisCount: 2,
        children: catList.isEmpty ? [Container()] : catList.map((cat) {
          return Padding(
            padding: const EdgeInsetsDirectional.only(end: 10),
             child: GestureDetector(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsetsDirectional.only(bottom: 5.0),
                    child: new ClipRRect(
                      borderRadius: BorderRadius.circular(25.0),
                      child: new FadeInImage(
                        fadeInDuration: Duration(milliseconds: 50),
                        image: NetworkImage(
                          cat.image,
                        ),
                        height: 100.0,
                        width: 100.0,
                        fit: BoxFit.cover,
                        imageErrorBuilder: (context, error, stackTrace) =>
                            erroWidget(100),
                        placeholder: placeHolder(100),
                      ),
                    ),
                  ),
                  Container(
                    child: Text(
                      cat.name,
                      style: Theme.of(context).textTheme.caption.copyWith(
                          color: colors.fontColor,
                          fontWeight: FontWeight.w600,
                          fontSize: 15),
                      overflow: TextOverflow.ellipsis,
                      textAlign: TextAlign.center,
                    ),
                    width: 100,
                  ),
                ],
              ),
            ),
          );
        }).toList(),
      ),
    );
    

    【讨论】:

    • 它显示错误 Colum's children must not contain any null values ,但在索引 3 处发现了一个 null 值
    • 你能发布 catList 的值吗?另外,您使用的是 GridView 还是 ListView(有 2 行列)?
    • 我已经用完整的当前代码编辑了帖子
    • 我可以看看您是如何尝试使用 GridView 而不是 ListView 来实现它的吗?
    • itemCount: catList.length/2 并返回一个包含两个项目(索引和索引+1)的列将给出重复的项目(1,2,2,3,3,4,4,5, 5,6,6,error) 所以我尝试将 GridView.count 作为您的上述代码,但它显示错误“列的子项不得包含任何空值,但在索引 3 处发现空值”
    猜你喜欢
    • 2011-04-22
    • 2020-08-27
    • 2020-10-31
    • 2016-02-19
    • 2020-02-21
    • 1970-01-01
    • 2015-12-29
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多