《深入浅出Dart》Widget和布局

简介: Widget和布局Flutter的布局与HTML/CSS布局方式上的写法有很大的不同,Flutter使用基于组件树的布局模型,其中每个组件都有自己的布局和渲染逻辑。相比之下,HTML/CSS使用基于盒模型的布局,其中元素通过框模型和定位属性进行布局。


Widget和布局

Flutter的布局与HTML/CSS布局方式上的写法有很大的不同,Flutter使用基于组件树的布局模型,其中每个组件都有自己的布局和渲染逻辑。相比之下,HTML/CSS使用基于盒模型的布局,其中元素通过框模型和定位属性进行布局。

Widget:Flutter用户界面的构建块

在Flutter中,一切皆是Widget。Widgets是Flutter用户界面的基本构建块,用于描述应用程序在给定其当前配置和状态的情况下应该如何显示。通过组合不同的Widget,我们可以构建出复杂、美观的用户界面。

Flutter中的Widget分为两类:

StatelessWidget

StatelessWidget是不可变的,一旦创建就不能更改。它们通常用于表示那些没有状态改变的静态UI元素。例如,IconTextContainer等都是无状态的Widget。

class MyStatelessWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('Hello World'),
    );
  }
}

StatefulWidget

StatefulWidget是有状态的,可以根据应用程序的状态和用户交互来改变。当状态发生变化时,StatefulWidget会自动重绘UI。常见的有状态Widget包括按钮、输入框、列表等。

class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  bool _isPressed = false;
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: () {
        setState(() {
          _isPressed = !_isPressed;
        });
      },
      child: Text(_isPressed ? 'Pressed' : 'Not Pressed'),
    );
  }
}

更多关于Widget的信息,你可以参考Flutter Widget介绍

布局组件:构建灵活的用户界面

在Flutter中,有多种布局组件可供选择,用于在屏幕上排列和定位Widget。以下是几个常用的布局组件:

Container

Container是一个多功能的容器,可以用于装饰、定位和约束其子Widget。你可以设置它的大小、颜色、边距等。

Container(
  color: Colors.blue,
  width: 200,
  height: 200,
  child: Text('Hello'),
)

Row和Column

Row和Column是用于水平和垂直排列子Widget的强大布局组件。你可以在它们内部添加各种子Widget,并使用mainAxisAlignmentcrossAxisAlignment来调整对齐方式。

Row(
  mainAxisAlignment: MainAxisAlignment.center,
  crossAxisAlignment: CrossAxisAlignment.center,
  children: <Widget>[
    Icon(Icons.star),
    Icon(Icons.star),
    Icon(Icons.star),
  ],
)

Stack

Stack允许将多个子Widget堆叠在一起,可以通过定位、对齐和尺寸调整来控制它们的位置。

Stack(
  alignment: Alignment.center,
  children: <Widget>[
    Container(color: Colors.red, width: 200, height: 200),
    Container(color: Colors.green, width: 150, height: 150),
    Container(color: Colors.blue, width: 100, height: 100),
  ],
)

ListView

ListView是一个滚动视图,可用于显示可滚动的列表。你可以使用ListView.builderListView.separated来构建列表。

ListView.builder(
  itemCount: 100,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text('Item $index'),
    );
  },
)

Expanded

Expanded是一个灵活的布局组件,用于占据剩余可用空间。它通常与Row和Column一起使用。

Row(
  children: <Widget>[
    Expanded(
      child: Container(color: Colors.red),
    ),
    Expanded(
      child: Container(color: Colors.green),
    ),
  ],
)

这只是布局组件中的几个例子,Flutter提供了丰富的布局组件,适应各种不同的UI需求。你可以根据需要选择合适的布局组件。

要了解更多关于布局的内容,你可以参考Flutter布局指南

结论

通过理解Widget和常用布局组件,你已经迈出了构建Flutter应用程序的第一步。Widget作为Flutter用户界面的构建块,帮助我们构建出灵活、交互丰富的应用程序。布局组件则允许我们在屏幕上排列和定位Widget,创建出美观、一致的用户界面。


目录
相关文章
|
Linux 网络安全 Docker
安装后无法使用 Docker 命令
【10月更文挑战第3天】
1298 2
|
机器学习/深度学习 编解码 算法
深度学习之边缘检测
边缘检测是计算机视觉中的一项基本任务,旨在识别图像中像素值变化显著的区域,即边缘。传统的边缘检测算法(如Sobel、Canny等)通过滤波器和梯度运算来检测边缘,而基于深度学习的方法则通过训练神经网络自动学习图像中的边缘特征,从而实现更高的检测精度和鲁棒性。
482 1
|
存储 算法 Linux
.bz2是什么格式的文件?Linux如何解压这种类型的文件?
【8月更文挑战第3天】.bz2是什么格式的文件?Linux如何解压这种类型的文件?
2183 1
|
JavaScript 前端开发 程序员
Vue2入门(安装Vue、devtools,创建Vue)以及MVVM分层思想
Vue2入门(安装Vue、devtools,创建Vue)以及MVVM分层思想
384 0
|
SQL 关系型数据库 MySQL
如何在MySQL 8.0版本中开启远程登录
如何在MySQL 8.0版本中开启远程登录
3634 0
|
网络协议 Ubuntu 关系型数据库
树莓派ubuntu20.04+Docker+Nginx+Wordpress个人网站搭建全纪录(超详细,入门友好篇)
前言: 本文基于树莓派4B平台,搭载Ubuntu Server 20.04 LTS版本服务器系统,通过将树莓派服务器连接Ipv6公网网络,利用Docker工具,部署Nginx反向代理与Wordpress网站管理系统,实现网站搭建与异地访问。同时用到了域名管理、DDNS、MySQl等工具。本文将从服务器镜像烧录开始,将网站搭建过程进行完整的说明记录。 (经验来自互联网,多次试错学习后总结如下,以供参考。) 关键词: 树莓派; Ubuntu ; Ipv6 ;Docker
1292 1
树莓派ubuntu20.04+Docker+Nginx+Wordpress个人网站搭建全纪录(超详细,入门友好篇)
|
存储 人工智能 测试技术
python自动化测试实战 —— CSDN的Web页面自动化测试
python自动化测试实战 —— CSDN的Web页面自动化测试
463 0
|
Go 数据安全/隐私保护 开发者
Go语言import真的很简单,分分钟学会!
Go语言import真的很简单,分分钟学会!
1120 1
|
存储 算法 安全
C# | 上位机开发新手指南(五)校验算法——CRC
当我们在进行数据传输时,可能会因为信道噪声、干扰等因素导致数据出现错误,从而影响传输的可靠性和准确性。此时,我们需要一种方法来检测数据是否出现错误,并尽可能快速地发现和纠正错误。CRC(Cyclic Redundancy Check)校验算法就是一种常用的数据校验方法,它通过对数据进行处理生成校验码,从而实现对数据的完整性和准确性进行验证。 使用CRC校验的意义在于能够提高数据传输的可靠性,降低数据传输错误率,确保数据的完整性和准确性。在各个领域中,如通信、网络、存储等,CRC校验都得到了广泛的应用。
855 0
C# | 上位机开发新手指南(五)校验算法——CRC
PyQt5-Qt Designer中控件的尺寸相关设置(sizePolicy策略)
PyQt5-Qt Designer中控件的尺寸相关设置(sizePolicy策略)
594 1