flutter:&UI布局 (六)

简介: 本文档介绍了Flutter中的UI布局方式,包括线性布局(如Column和Row)、非线性布局(如Stack、Flex、Positioned)以及Wrap布局等。通过具体示例代码展示了如何使用这些布局组件来构建灵活多变的用户界面,例如使用Column垂直排列文本、使用Stack叠加组件、以及利用Wrap实现自动换行的按钮布局等。

前言

在现代移动应用开发中,用户界面的布局设计至关重要。Flutter作为一个高效的UI框架,提供了丰富的布局组件,能够帮助开发者轻松构建灵活多变的用户界面。本文将深入探讨Flutter中的各种UI布局方式,包括线性布局(如Column和Row)、非线性布局(如Stack、Flex、Positioned)以及Wrap布局。通过具体的示例代码,我们将展示如何利用这些布局组件来创建简洁而富有表现力的界面。

UI布局

线性布局

return const Scaffold(
    body:Column(
      children:[ Text('hello'),
        Text('world'),
        Text('welcome'),
    ])
  );
body:Row(
      children: [
        Text('hello+'),
        Text('world+'),
        Text('welcome+')
      ],
    )

平分

Widget buildColumn(){
  return Container(
    decoration: BoxDecoration(border: Border.all()),
    child: Column(
  children: [
    Expanded(child: Container(color: Colors.grey,),flex: 1,),
    Expanded(child: Container(color: Colors.red,),flex: 1,),
    Expanded(child: Container(color: Colors.blue,),flex: 1,),
  ],
    ),
  );
}

先使用一个 之后会占满

child: Row(
          children: [
            ElevatedButton(
              onPressed: () {
                print("hello");
              },
              child: Text(
                "hello",
                style: TextStyle(fontSize: 20, color: Colors.black),
              ),
            ),
            Expanded(
              child: ElevatedButton(
                onPressed: () {
                  print("hello");
                },
                child: Text(
                  "hello",
                  style: TextStyle(fontSize: 20, color: Colors.black),
                ),
              ),
            )
          ],
        ),
return  Scaffold(
    body:Container(
      child: buildColumn(),
    )
  );
return Scaffold(
      body: Row(
        children: [
          Expanded(flex:1,child:Container(
            alignment: Alignment.center,
            height: 33,
            color: Colors.blue,
            child: Text('二级导航栏',style: TextStyle(
              color: Colors.white
            ),),
          ) )
        ],
      ),
    );

非线性布局

Stack

可以容纳多个组件,以叠加的方式摆放子组件,后者居上。拥有Alignment属性,可以与Positioned组件联合使用,精准并有效摆放。同AndroidFramLayout布局相似。

@override
  Widget build(BuildContext context) {
    return Stack(
      // alignment
      alignment: Alignment.center,
      children: [
        Container(
        height: 400,
      width: 300,
      color: Colors.red,
        ),Text('hello,flutter',style: TextStyle(color: Colors.blue),),
        Container(
          height: 200,
          width: 200,
          color: Colors.yellow,
        ),Text('hello,flutter',style: TextStyle(color: Colors.green),)
      ],
    );
  }


Flex

return Container(
            child: Row(
              children: [
                Expanded(
                    flex: 2,
                    child: Container(
                  width: 100,height: 100,
                  color: Colors.red,
                )),
                Expanded(
                    flex: 1,
                    child: Container(
                      width: 100,height: 100,
                      color: Colors.blue,
                    )),
              ],
            ),
          );

positioned

层叠布局和 Web 中的绝对定位、Android 中的 Frame 布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。层叠布局允许子组件按照代码中声明的顺序堆叠起来。Flutter中使用StackPositioned这两个组件来配合实现绝对定位。Stack允许子组件堆叠,而Positioned用于根据Stack的四个角来确定子组件的位置

return Container(
      height: 400,
      width: 300,
      color: Colors.red,
      child: Stack(
        children: [
          Positioned(
            // 改位置的地方
            left:0,
            bottom: 0,
            child: Container(
              height: 100,
              width: 100,
              color: Colors.yellow,
            ),
          ),
          Text('hello,world'),
        ],
      ),
    );

stack  加 positioned

实现 布局  

return Stack(
      children: [
        Positioned(
          height: 40,
          width: 40,
          right: 20,
          bottom: 20,
          child: Row(
            children: [
              Expanded(
                  flex: 1,
                  child: Container(
                    alignment: Alignment.center,
                    height: 44,
                    color: Colors.blue,
                     child: Icon(Icons.circle),
                  ))
            ],
          ),
        )
      ],
    );

获取屏幕的高度

final size = MediaQuery.of(context).size;
final width =  size.width
height..一样


aspectRadio

宽高比

//  高度是容器的一半
      return AspectRatio(aspectRatio: 2/1,
      child: Container(
        color: Colors.red,
      ),
      );
  }


wrap 布局

需要用padding  包裹

return Padding(
          // 加 边距  需要在外面加
        padding: EdgeInsets.all(10),
        child:    Wrap(   // 一行满了之后  换行
        spacing: 10,  //  x axis   水平间距
        runSpacing: 10,  // y axis  垂直
        direction:  Axis.horizontal, //  默认  direction: Axis.vertical
        alignment: WrapAlignment.center, //  看 参数
        children: [
          Button("chapter one",onPressed: (){},),
          Button("chapter two",onPressed: (){},),
          Button("chapter three",onPressed: (){},),
          Button("chapter four",onPressed: (){},),
          Button("chapter five",onPressed: (){},),
          Button("chapter six",onPressed: (){},),
          Button("chapter seven",onPressed: (){},),
          Button("chapter eight",onPressed: (){},),
        ],
      ),
      );

demo

import 'package:flutter/material.dart';
class Myapp extends StatelessWidget {
  const Myapp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'hello flutter',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(title: Text("flutter app"),),
        body: LayoutDemo(),
      ),
    );
  }
}
class LayoutDemo extends StatelessWidget {
  const LayoutDemo({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
      return Padding(
          // 加 边距  需要在外面加
        padding: EdgeInsets.all(10),
        child:    Wrap(   // 一行满了之后  换行
        spacing: 10,  //  x axis   水平间距
        runSpacing: 10,  // y axis  垂直
        direction:  Axis.horizontal, //  默认  direction: Axis.vertical
        alignment: WrapAlignment.center, //  看 参数
        children: [
          Button("chapter one",onPressed: (){},),
          Button("chapter two",onPressed: (){},),
          Button("chapter three",onPressed: (){},),
          Button("chapter four",onPressed: (){},),
          Button("chapter five",onPressed: (){},),
          Button("chapter six",onPressed: (){},),
          Button("chapter seven",onPressed: (){},),
          Button("chapter eight",onPressed: (){},),
        ],
      ),
      );
    }
}
//  自定义按钮
class Button extends StatelessWidget {
  final String text;
  final void Function()? onPressed;
   Button(this.text,{Key? key,required this.onPressed}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
        style:ButtonStyle(
          backgroundColor: MaterialStateProperty.all(Color.fromRGBO(241, 255, 244, 244)),
          foregroundColor: MaterialStateProperty.all(Colors.black45)
        ),
        onPressed: onPressed,
        child:Text(text));
  }
}
void main(){
  runApp(
  const Myapp()
  );
}


相关文章
|
11天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
141 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
缓存 监控 前端开发
优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面
本文探讨了优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面,并通过案例分析展示了具体措施和效果,强调了持续优化的重要性及未来优化方向。
118 10
|
2月前
|
UED
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。
178 67
|
2月前
|
存储 容器
Flutter 构建自适应布局
Flutter 构建自适应布局
Flutter 构建自适应布局
|
7月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
230 1
|
3月前
|
开发框架 数据安全/隐私保护 开发者
Flutter 是一款强大的跨平台移动应用开发框架,本文深入探讨了其布局与样式设计
Flutter 是一款强大的跨平台移动应用开发框架,本文深入探讨了其布局与样式设计,涵盖布局基础、常用组件、样式设计、实战应用、响应式布局及性能优化等方面,助力开发者打造精美用户界面。
70 7
|
3月前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
134 4
|
3月前
|
容器
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
Flutter 的 Stack 布局组件允许你将多个子组件层叠在一起,实现复杂的界面效果。本文介绍了 Stack 的基本用法、核心概念(如子组件层叠、Positioned 组件和对齐属性),以及如何使用 MediaQuery 和 LayoutBuilder 实现响应式设计。通过示例展示了照片展示与文字描述、动态调整层叠布局等高级用法,帮助你构建更加精美和实用的 Flutter 应用。
187 2
|
4月前
|
API 容器
Flutter UI组件库(JUI)
Flutter UI组件库(JUI)
310 17
|
4月前
|
容器
Flutter&鸿蒙next 布局架构原理详解
Flutter&鸿蒙next 布局架构原理详解

热门文章

最新文章

  • 1
    用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
  • 2
    UI-TARS:字节跳动开源专注于多平台 GUI 自动化交互的视觉语言模型
  • 3
    移动端UI名词 - AxureMost
  • 4
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
  • 5
    unity判断鼠标在不在UI上
  • 6
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    14
  • 2
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
    58
  • 3
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
    38
  • 4
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    141
  • 5
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 6
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 7
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121
  • 8
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    75
  • 9
    flutter开发中Use ‘const’ with the constructor to improve performance. Try adding the ‘const’ keyword to the constructor invocation.报错如何解决-优雅草卓伊凡
    18
  • 10
    【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    27