Flutter开发(十一)—— 五种布局之Sliver滚动布局

本文详细介绍了Flutter中Sliver组件的使用方法,包括SliverAppBar、SliverGrid和SliverList等,通过实例展示了如何创建跟随内容滚动的头部、网格布局和列表布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

演示代码
以下代码中列举了Sliver关于SliverAppBar、SliverGrid、SliverList等组件属性的使用。

import 'package:flutter/material.dart';
import 'Animal.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: SliverLayout(),
      theme: ThemeData(
        primarySwatch: Colors.deepPurple, //主题背景颜色
        highlightColor: Colors.purple, //按下按钮时 高亮颜色
        splashColor: Colors.white,
      ),
    );
  }
}

// Sliver
class SliverLayout extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: <Widget>[
          // SliverAppBar 是可以跟随内容滚动的
          SliverAppBar(
            // title: Text('RedKey'),
            // pinned: true, //将标题固定在顶部

            floating: true, //标题随着滚动消失
            expandedHeight: 200.0, //伸展高度
            // flexibleSpace  可伸缩区域设置内容
            flexibleSpace: FlexibleSpaceBar(
              title: Text(
                'Redkeyset'.toUpperCase(), //toUpperCase()转成大写
                style: TextStyle(
                    fontSize: 18.0, //文字大小
                    letterSpacing: 2.5, //字间距
                    fontWeight: FontWeight.w400), //设置文字粗细
              ),
              // flexibleSpace 增加背景图片
              background:
                  Image.network('https://dwz.cn/xZbPzbOs', fit: BoxFit.cover),
            ),
          ),

          //安全区域显示,确保显示正常
          SliverSafeArea(
            sliver: SliverPadding(
              padding: EdgeInsets.all(8.0),
              // sliver: SliverGridDemo(),  //Grid
              sliver: SliverListDemo(), //List
            ),
          )
        ],
      ),
    );
  }
}

//  SliverGrid
class SliverGridDemo extends StatelessWidget {
  List<Animal> animals = Animal.allAnimal();
  @override
  Widget build(BuildContext context) {
    return SliverGrid(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 2, //每行2个item
        crossAxisSpacing: 8.0,
        mainAxisSpacing: 8.0,
        childAspectRatio: 1.5, // 长/宽的比例
      ),
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return Container(
            child: Image.network(
              animals[index].image,
              fit: BoxFit.cover,
            ),
          );
        },
        childCount: animals.length, //如果这里不设置数量,默认是无限多,界面超出部分报错。
      ),
    );
  }
}

//  SliverList
class SliverListDemo extends StatelessWidget {
  List<Animal> animals = Animal.allAnimal();
  @override
  Widget build(BuildContext context) {
    return SliverList(
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return Padding(
            padding: EdgeInsets.only(bottom: 40.0), //仅设置底部有padding
            child: Material(
              borderRadius: BorderRadius.circular(16.0), //设置Material倒角16.0
              elevation: 20.0, //设置阴影高度10.0
              shadowColor: Colors.grey.withOpacity(0.5), //设置阴影颜色,灰色透明度0.3
              // 使用层叠布局,图片上面还有文字
              child: Stack(
                children: <Widget>[
                  // AspectRatio 调整child到设置的宽高比
                  AspectRatio(
                    aspectRatio: 18 / 9, //指定长高比例
                    child: Container(
                      decoration: new BoxDecoration(
                        // border设置边框
                        border: new Border.all(width: 2.0, color: Colors.red),
                        //设置Container倒角16.0
                        borderRadius: BorderRadius.circular(16.0),
                        image: new DecorationImage(
                            image: new NetworkImage(
                              animals[index].image,
                            ),
                            fit: BoxFit.cover),
                      ),
                    ),
                  ),

                  //  Positioned控件主要用来设置绝对布局,必须配合Stack控件来使用
                  Positioned(
                    right: 20,
                    bottom: 20,
                    child: Column(
                      //纵向布局
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Text(animals[index].name,
                            style: TextStyle(
                              fontSize: 18.0,
                              color: Colors.orangeAccent,
                            )),
                        Text(animals[index].description,
                            style: TextStyle(
                              fontSize: 14.0,
                              color: Colors.purpleAccent,
                            )),
                      ],
                    ),
                  )
                ],
              ),
            ),
          );
        },
        childCount: animals.length, //如果这里不设置数量,默认是无限多,界面超出部分报错。
      ),
    );
  }
}

效果演示:
在这里插入图片描述

### Nginx 文件名逻辑漏洞(CVE-2013-4547) #### 漏洞概述 Nginx 文件名逻辑漏洞(CVE-2013-4547)允许攻击者通过精心构造的 URL 请求来绕过访问控制并读取或执行受限资源。此漏洞的根本原因在于 Nginx 错误地解析了带有特定编码字符的 URL,从而导致文件路径处理不当[^1]。 #### 影响范围 该漏洞影响多个版本的 Nginx,在某些配置下可能导致未经授权的文件访问甚至远程代码执行。具体受影响的版本包括但不限于: - Nginx 1.4.x 版本系列 - Nginx 1.5.x 版本系列 (部分) 当 Web 应用程序部署于上述版本之上时,可能存在潜在风险[^3]。 #### 复现过程 为了验证这一漏洞的存在,可以通过上传一个看似无害但实际上包含恶意 PHP 代码的图片文件 `phpinfo.jpg` 来测试。一旦成功上传,攻击者能够修改 HTTP 请求中的参数使服务器错误解释文件扩展名,进而触发命令注入行为[^4]。 ```bash curl -X POST http://example.com/upload.php \ -F "file=@/path/to/phpinfo.jpg" ``` 随后发送如下请求可尝试利用漏洞: ```http GET /uploads/phpinfo.jpg%00.php?cmd=id HTTP/1.1 Host: example.com ``` 如果存在漏洞,则返回的结果会显示当前用户的 ID 信息。 #### 安全修复措施 针对 CVE-2013-4547 的防护手段主要包括以下几个方面: - **升级至最新稳定版**:官方已发布更新解决此问题,建议立即应用最新的安全补丁以消除隐患[^2]。 - **手动修补源码**:对于无法即时升级的情况,可以从官方网站下载专门为此漏洞准备的安全补丁,并按照指引完成编译安装流程。 - **加强输入校验**:无论何时都应严格过滤用户提交的数据,特别是涉及文件操作的部分,防止非法字符进入内部处理环节。 - **启用 WAF 防护**:Web Application Firewall 能够识别异常模式并阻止可疑流量到达应用程序层面上游位置。 综上所述,及时采取适当行动可以有效降低遭受此类攻击的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值