一周掌握Flutter开发--3、布局与 UI 组件

news/2025/2/26 19:39:49

在这里插入图片描述

文章目录

      • 布局与 UI 组件
      • 核心组件
        • 3.1 基础布局
        • 3.2 滚动布局
        • 3.3 容器类
      • 必须掌握
        • 3.4 响应式设计
        • 3.5 自适应布局
      • 总结

布局与 UI 组件

Flutter 的布局系统非常灵活,通过组合不同的 Widget 来构建复杂的 UI。掌握核心布局组件和设计原则是开发高效、美观应用的关键。


核心组件

3.1 基础布局
  • Row:水平排列子组件。

    Row(
      children: [
        Text('Left'),
        Spacer(), // 占据剩余空间
        Text('Right'),
      ],
    );
    
  • Column:垂直排列子组件。

    Column(
      children: [
        Text('Top'),
        Expanded(child: Container(color: Colors.red)), // 占据剩余空间
        Text('Bottom'),
      ],
    );
    
  • Stack:将子组件叠加在一起。

    Stack(
      children: [
        Container(color: Colors.blue),
        Positioned(
          top: 10,
          left: 10,
          child: Text('Overlay'),
        ),
      ],
    );
    
  • Flex:灵活布局,RowColumn 的底层实现。

    Flex(
      direction: Axis.horizontal, // 水平排列
      children: [
        Expanded(flex: 1, child: Container(color: Colors.red)),
        Expanded(flex: 2, child: Container(color: Colors.blue)),
      ],
    );
    

3.2 滚动布局
  • ListView:垂直滚动的列表。

    ListView(
      children: [
        ListTile(title: Text('Item 1')),
        ListTile(title: Text('Item 2')),
      ],
    );
    
    // 动态列表
    ListView.builder(
      itemCount: 100,
      itemBuilder: (context, index) => ListTile(title: Text('Item $index')),
    );
    
  • GridView:网格布局。

    GridView.count(
      crossAxisCount: 2, // 每行显示2个
      children: List.generate(10, (index) => Container(color: Colors.blue)),
    );
    
    // 动态网格
    GridView.builder(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
      itemCount: 10,
      itemBuilder: (context, index) => Container(color: Colors.blue),
    );
    
  • CustomScrollView:自定义滚动布局,结合 Slivers 使用。

    CustomScrollView(
      slivers: [
        SliverAppBar(
          title: Text('Sliver AppBar'),
          expandedHeight: 200,
        ),
        SliverList(
          delegate: SliverChildBuilderDelegate(
            (context, index) => ListTile(title: Text('Item $index')),
            childCount: 20,
          ),
        ),
      ],
    );
    

3.3 容器类
  • Container:多功能容器,可以设置尺寸、边距、背景色等。

    Container(
      width: 100,
      height: 100,
      color: Colors.blue,
      margin: EdgeInsets.all(10),
      child: Text('Hello'),
    );
    
  • Padding:设置内边距。

    Padding(
      padding: EdgeInsets.all(10),
      child: Text('Padded Text'),
    );
    
  • Expanded:在 RowColumn 中占据剩余空间。

    Row(
      children: [
        Expanded(
          flex: 2, // 占据2份空间
          child: Container(color: Colors.red),
        ),
        Expanded(
          flex: 1, // 占据1份空间
          child: Container(color: Colors.green),
        ),
      ],
    );
    
  • SizedBox:设置固定尺寸或占位。

    SizedBox(
      width: 100,
      height: 100,
      child: Text('Fixed Size'),
    );
    

必须掌握

3.4 响应式设计
  • MediaQuery:获取屏幕尺寸和设备信息。

    double screenWidth = MediaQuery.of(context).size.width;
    double screenHeight = MediaQuery.of(context).size.height;
    
  • LayoutBuilder:根据父组件尺寸动态调整布局。

    LayoutBuilder(
      builder: (context, constraints) {
        if (constraints.maxWidth > 600) {
          return WideLayout();
        } else {
          return NarrowLayout();
        }
      },
    );
    

3.5 自适应布局
  • 处理不同屏幕尺寸

    • 使用 MediaQueryLayoutBuilder 动态调整布局。
    • 使用 FlexibleExpanded 实现弹性布局。
    • 使用 AspectRatio 保持宽高比。
      AspectRatio(
        aspectRatio: 16 / 9,
        child: Container(color: Colors.blue),
      );
      
  • 示例:响应式布局

    class ResponsiveLayout extends StatelessWidget {
      
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: LayoutBuilder(
              builder: (context, constraints) {
                if (constraints.maxWidth > 600) {
                  return WideLayout();
                } else {
                  return NarrowLayout();
                }
              },
            ),
          ),
        );
      }
    }
    

总结

  • 基础布局:掌握 RowColumnStackFlex
  • 滚动布局:掌握 ListViewGridViewCustomScrollView
  • 容器类:掌握 ContainerPaddingExpandedSizedBox
  • 响应式设计:使用 MediaQueryLayoutBuilder 实现动态布局。
  • 自适应布局:处理不同屏幕尺寸,确保 UI 在各种设备上表现一致。

掌握这些布局与 UI 组件的使用技巧后,你可以轻松构建复杂且美观的 Flutter 应用界面。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!


http://www.niftyadmin.cn/n/5869110.html

相关文章

VMware建立linux虚拟机

本文适用于初学者,帮助初学者学习如何创建虚拟机,了解在创建过程中各个选项的含义。 环境如下: CentOS版本: CentOS 7.9(2009) 软件: VMware Workstation 17 Pro 17.5.0 build-22583795 1.配…

【网络安全 | 漏洞挖掘】Stripe 子系统 TaxJar 的 ATO 漏洞挖掘之旅

未经许可,不得转载。 文章目录 正文在这篇文章中,我将带大家回顾我是如何在 Stripe 旗下的 TaxJar 发现一个账户接管(Account Takeover)漏洞的。 正文 进入 TaxJar 后,我花了一些时间四处探索,发现了一些零碎的小问题。然而,我的目标是以低权限用户的身份邀请一个新成员…

易基因:RNA甲基化修饰和R-loop的交叉调控:从分子机制到临床意义|深度综述

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 R-loop(RNA-DNA杂合结构)是转录调控、DNA复制和修复等关键细胞过程的重要组成部分。但R-loop异常积累可能会破坏基因组完整性,从而导致多种疾病的发生…

go-zero中定时任务的用法

文章目录 使用扩展定义调度器测试方法 使用扩展 在go-zero框架中使用定时任务调度的写法示例,首先需要用到的扩展:go get -u github.com/robfig/cron/v3 扩展网址:robfig/cron: a cron library for go (github.com) 定义调度器 在 gozero/i…

KIMI K1.5:大规模强化学习在大语言模型中的应用与工程实践

目录 1、核心技术创新:长上下文强化学习 2、策略优化的技术细节 2.1、在线镜像下降变体 2.2、长度惩罚机制 2.3、智能采样策略 3、工程架构创新 3.1、混合部署框架 3.2、代码沙箱与奖励模型 3.3、分布式系统架构 4、实验成果与性能提升 5、结论与未来展望 大语言模…

品融电商解读:小红书KOC打法如何重构品牌增长新路径

品融电商解读:小红书KOC打法如何重构品牌增长新路径 在内容生态高度饱和的今天,品牌若想在小红书等平台实现破局,仅依赖“产品为王”的单一逻辑已远远不够。作为国内头部的小红书代运营公司,品融电商观察到,平台的竞…

Ubuntu搭建esp32环境 配置打开AT指令集 websocket功能

1,搭建前提 环境搭建参考乐鑫官网给的本地编译 ESP-AT 工程方法 因为公司电脑和网络的特殊性,不能正确解析域名(仅在浏览器上可以访问) ,所以这边访问的时候改成了ssh 未了避免使用外网困难的问题,这里用…

一文读懂什么是K8s Admission Controller

#作者:曹付江 文章目录 1、什么是 Admission Controllers?2、如何创建 Admission Controllers?3、Admission 控制器的最佳实践 K8s 中的操作与安全标准执行机制: 1、什么是 Admission Controllers? Admission contro…