当前位置: 首页 > article >正文

Flutter:CustomScrollView自定义滚动使用

在这里插入图片描述
CustomScrollView的使用场景:当需要构建复杂的滚动布局时,如上图,有分页,爆款商品是ListView

注意事项

1Widget需要进行转换
_buildBanner().sliverToBoxAdapter(),

2、不能直接使用paddingHorizontal,
可用sliverPaddingHorizontal()代替

3、所有组件放在
CustomScrollView(
	slivers: []
)

上图代码

// 爆款商品
Widget _buildFlashSell() {
  return <Widget>[
    SizedBox(height: 25.w,),
    // 标题
    <Widget>[
      TDImage(assetUrl: "assets/myimage/nav-11.png",width: 36.w,height: 36.w,),
      SizedBox(width: 7.w,),
      TextWidget.body('爆款商品',size: 28.sp,color: const Color(0xff181818),),
      SizedBox(width: 20.w,),
      TextWidget.body('品质卓越,超值享受,一切尽在我们的爆款产品! ',size: 20.sp,color: const Color(0xff999999),),
    ].toRow(
      crossAxisAlignment: CrossAxisAlignment.baseline,
      textBaseline: TextBaseline.alphabetic,
    ).paddingHorizontal(30.w),
    SizedBox(height: 30.w,),

    // 爆款商品可左右滑动查看
    <Widget>[
      SizedBox(width: 30.w,),
      for (var i = 0; i < 5; i++)
      <Widget>[
        TDImage(assetUrl: "assets/myimage/goods.png",width: 200.w,height: 160.w,),
        SizedBox(height: 5.w,),
        TextWidget.body(
          '爆款商品爆款商品爆款商品',
          size: 28.sp,
          color: const Color(0xff181818),
          overflow: TextOverflow.ellipsis,
          maxLines: 1,
        ),
        SizedBox(height: 5.w,),
        <Widget>[
          TextWidget.body('¥',size: 24.sp,color: const Color(0xffFF6E00),),
          TextWidget.body('599.00',size: 28.sp,color: const Color(0xffFF6E00),),
        ].toRow(),
        Text('原价¥599.00',
          style: TextStyle(
            fontSize: 24.sp,
            color: const Color(0xff999999),
            decoration: TextDecoration.lineThrough,
            decorationColor: const Color(0xff999999)
          ),
        ),
      ].toColumn(crossAxisAlignment: CrossAxisAlignment.start).width(200.w).marginOnly(right: 15.w),
      SizedBox(width: 15.w,),
    ].toListView(scrollDirection: Axis.horizontal,).expanded(),

  ].toColumn()
  .decorated(border: Border.all(width: 1, color: const Color(0xffEDF1F2)),borderRadius: BorderRadius.circular(20.w))
  .tight(height: 390.w);
}
  
// 商品列表
Widget _buildGoodsList() {
  return SliverGrid(
    delegate: SliverChildBuilderDelegate(
      (BuildContext context, int position) {
        // var product = controller.goodsList[position];
        return <Widget>[
          TDImage(assetUrl: "assets/myimage/goods.png",width: 300.w,height: 300.w,),
          <Widget>[
            TextWidget.body('爆款商品爆款商品爆款商品爆款商品爆款商品爆款商品商品',size: 28.sp,color: const Color(0xff181818),overflow: TextOverflow.ellipsis),
            SizedBox(height: 10.w,),
            // 价格
            <Widget>[
              TextWidget.body('¥',size: 24.sp,color: const Color(0xffFF6E00),weight: FontWeight.bold,),
              TextWidget.body('599.00',size: 32.sp,color: const Color(0xffFF6E00),weight: FontWeight.bold,),
            ].toRow(),
            <Widget>[
              Text('原价¥599.00',
                style: TextStyle(
                  fontSize: 24.sp,
                  color: const Color(0xff999999),
                  decoration: TextDecoration.lineThrough,
                  decorationColor: const Color(0xff999999)
                ),
              ),
              TextWidget.body('销量:100',size: 24.sp,color: const Color(0xff999999),),
            ].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween),
          ].toColumn().paddingOnly(left: 20.w,right: 20.w,top: 20.w,)

        ].toColumn()
        .paddingTop(20.w)
        .decorated(border: Border.all(width: 1, color: const Color(0xffEDF1F2)),borderRadius: BorderRadius.circular(20.w));
      },
      childCount: controller.goodsList.length,
    ),
    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 2,
      mainAxisSpacing: AppSpace.listRow,
      crossAxisSpacing: AppSpace.listItem,
      childAspectRatio: 0.7,
    ),
  );
}

// 主视图
Widget _buildView() {
  return CustomScrollView(
    slivers: [
      _buildBanner().sliverToBoxAdapter(),
      _buildSearch().sliverToBoxAdapter().sliverPaddingHorizontal(30.w),
      SizedBox(height: 30.w,).sliverToBoxAdapter(),
      _buildCategory().sliverToBoxAdapter().sliverPaddingHorizontal(30.w),
      SizedBox(height: 40.w,).sliverToBoxAdapter(),
      _buildNotice().sliverToBoxAdapter().sliverPaddingHorizontal(30.w),
      SizedBox(height: 30.w,).sliverToBoxAdapter(),
      _buildFlashSell().sliverToBoxAdapter().sliverPaddingHorizontal(30.w),
      SizedBox(height: 30.w,).sliverToBoxAdapter(),
      _buildGoodsList().sliverPaddingHorizontal(30.w),
    ],
  );
}

@override
Widget build(BuildContext context) {
  return GetBuilder<HomeController>(
    init: HomeController(),
    id: "home",
    builder: (_) {
      return Scaffold(
        // appBar: AppBar(title: const Text("card")),
        backgroundColor: Colors.white,
        body: SmartRefresher(
          controller: controller.refreshController,
          enablePullUp: true, // 启用上拉加载
          onRefresh: controller.onRefresh, // 下拉刷新回调
          onLoading: controller.onLoading, // 上拉加载回调
          footer: const SmartRefresherFooterWidget(), // 底部加载更多组件
          child: _buildView(),
        ),
      );
    },
  );
}

http://www.kler.cn/a/446662.html

相关文章:

  • 防火墙技术与网络安全
  • 【Linux系统编程】:信号(2)——信号的产生
  • 探索 Python编程 调试案例:计算小程序中修复偶数的bug
  • 计算机网络之多路转接epoll
  • Windows server 服务器网络安全管理之防火墙出站规则设置
  • 如何使用 WebAssembly 扩展后端应用
  • vue2,vue3 中 v-for 和v-if的优先级
  • 30.装饰器
  • 【Ubuntu】安装QQ
  • Apache SeaTunnel 增强对csv读取时分割字段的能力
  • 【论文笔记】欧美学术论文写作习惯解析:非母语作者的指南
  • 仓鼠身长能长到多少厘米?
  • 《第十二部分》1.STM32之RTC实时时钟介绍---BKP实验
  • 期权懂|2024年12月国内最新期权开通期权条件有什么?
  • 订单超时自动取消的7种方案
  • 深入理解YOLO系列目标检测头的设定方式
  • 如何有效划分服务器磁盘空间?具体的步骤和流程
  • 本地摄像头视频流在html中打开
  • 【机器学习】以机器学习为翼,翱翔网络安全创新苍穹
  • 汽车IVI中控开发入门及进阶(43):NanoVG
  • 打造智慧医院挂号枢纽:SSM 与 Vue 融合的系统设计与实施
  • 【单片机原理】第1章 微机基础知识,运算器,控制器,寄存器,微机工作过程,数制转换
  • HuggingFace datasets - 下载数据
  • C语言数据库管理系统示例:文件操作、内存管理、错误处理与动态数据库设计 栈和堆的内存分配
  • [c++进阶(二)] 智能指针详细剖析--RAII思想
  • 在 .NET 5.0 运行 .NET 8.0 教程:使用 ASP.NET Core 创建 Web API