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()
  );
}


相关文章
|
27天前
|
缓存 监控 前端开发
优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面
本文探讨了优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面,并通过案例分析展示了具体措施和效果,强调了持续优化的重要性及未来优化方向。
54 10
|
12天前
|
UED
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。
119 67
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
|
2天前
|
存储 容器
Flutter 构建自适应布局
Flutter 构建自适应布局
Flutter 构建自适应布局
|
26天前
|
开发框架 数据安全/隐私保护 开发者
Flutter 是一款强大的跨平台移动应用开发框架,本文深入探讨了其布局与样式设计
Flutter 是一款强大的跨平台移动应用开发框架,本文深入探讨了其布局与样式设计,涵盖布局基础、常用组件、样式设计、实战应用、响应式布局及性能优化等方面,助力开发者打造精美用户界面。
41 7
|
5月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
180 1
|
1月前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
103 4
|
1月前
|
容器
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
Flutter 的 Stack 布局组件允许你将多个子组件层叠在一起,实现复杂的界面效果。本文介绍了 Stack 的基本用法、核心概念(如子组件层叠、Positioned 组件和对齐属性),以及如何使用 MediaQuery 和 LayoutBuilder 实现响应式设计。通过示例展示了照片展示与文字描述、动态调整层叠布局等高级用法,帮助你构建更加精美和实用的 Flutter 应用。
137 2
|
2月前
|
API 容器
Flutter UI组件库(JUI)
Flutter UI组件库(JUI)
169 17
|
2月前
|
容器
Flutter&鸿蒙next 布局架构原理详解
Flutter&鸿蒙next 布局架构原理详解
|
4月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
71 1