【Flutter】基础入门:Widgets

news/2024/10/22 8:27:57/

在 Flutter 中,Widget 是应用程序构建块的基础。几乎所有的对象都是一个 Widget,不论是显示在屏幕上的 UI 元素,还是一些功能性组件(例如用于手势检测的 GestureDetector,或用于传递应用主题数据的 Theme),它们都是 Widget。与原生开发中“控件”仅指 UI 元素不同,Flutter 的 Widget 概念更加广泛,它涵盖了界面显示、布局、手势检测、状态管理等多个层面。本文将深入讲解 Flutter 中的 Widget,帮助你从概念到实践掌握它们。

什么是 Widget

Widget 是 Flutter 应用的核心概念。万物皆 Widget,这是开发 Flutter 时需要牢记的一点。无论是屏幕上展示的文字、图片、按钮,还是布局的容器、手势检测器,甚至主题和动画控制,它们都以 Widget 的形式存在。你可以将 Widget 理解为 UI 元素的描述或一个函数,在输入某些参数时返回一个特定的用户界面。

Flutter 中的 Widget 分类

Flutter 中的 Widget 大体上可以分为两类:

  1. 有状态的 Widget (StatefulWidget)
  2. 无状态的 Widget (StatelessWidget)

无状态的 Widget (StatelessWidget)

StatelessWidget 是静态的,它们在生命周期中不发生变化。简单的文本、图标和图片等不需要交互的组件通常是无状态的。

示例:

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('StatelessWidget Example')),body: Center(child: Text('Hello, Flutter!')),),);}
}

在上面的代码中,MyApp 是一个 StatelessWidget,它只需要简单地显示一行文字。

有状态的 Widget (StatefulWidget)

StatefulWidget 可以管理和更新状态。它们能够根据用户的交互或内部事件(如计时器或动画)来动态更新界面。每个 StatefulWidget 都有一个对应的 State 对象,负责管理 Widget 的状态。

示例:

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatefulWidget {_MyAppState createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('StatefulWidget Example')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('You have pressed the button this many times:'),Text('$_counter', style: Theme.of(context).textTheme.headline4),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),),),);}
}

在这个例子中,点击按钮会触发 _incrementCounter 函数,更新 State 中的计数器值,随后通过 setState() 通知 Flutter 重新构建 UI 以反映最新的状态。

常见的基础 Widget

文本 Widget (Text)

Text 是用于显示简单文本的 Widget。它可以通过 style 属性自定义文字的字体、颜色和大小。

示例:

Text('Hello, Flutter!',style: TextStyle(fontSize: 24, color: Colors.blue),
)

图片 Widget (Image)

Image 用于加载和显示图片。它支持多种方式加载图片,如网络图片、文件图片、资源图片等。

示例:

Image.network('https://example.com/sample-image.jpg')

图标 Widget (Icon)

Icon 是用于显示图标的 Widget,Flutter 提供了丰富的内置图标库,如 Material Icons。

示例:

Icon(Icons.favorite, color: Colors.red, size: 40)

容器 Widget (Container)

Container 是最常用的布局 Widget,它可以包含子组件,并支持设置大小、边距、填充、对齐方式等。

示例:

Container(padding: EdgeInsets.all(10),margin: EdgeInsets.all(20),color: Colors.blue,child: Text('Container example'),
)

列 Widget (Column) 与 行 Widget (Row)

ColumnRow 是用于垂直和水平排列子组件的 Widget。它们常用于构建基本的布局。

示例:

Column(children: <Widget>[Text('Item 1'),Text('Item 2'),Text('Item 3'),],
)

按钮 Widget (ElevatedButton)

按钮是常见的交互元素,Flutter 提供了多种按钮组件,如 ElevatedButtonTextButtonIconButton

示例:

ElevatedButton(onPressed: () {},child: Text('Click Me'),
)

布局 Widgets

Flutter 提供了丰富的布局 Widgets,帮助开发者构建灵活且强大的 UI 布局。

Padding

Padding 用于给组件增加内边距。

示例:

Padding(padding: EdgeInsets.all(16.0),child: Text('Padded Text'),
)

Center

Center 将子 Widget 居中显示。

示例:

Center(child: Text('Centered Text'),
)

Stack

Stack 是一个叠加布局 Widget,允许将多个 Widget 叠加显示。常用于实现浮动按钮或重叠布局。

示例:

Stack(children: <Widget>[Container(color: Colors.blue, width: 200, height: 200),Positioned(left: 50,top: 50,child: Text('Stacked Text'),),],
)

Expanded

Expanded 用于在 RowColumn 中扩展子组件,分配剩余的空间。

示例:

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

Widget 的生命周期

StatefulWidget 中,Widget 的生命周期主要有以下几个阶段:

  • createState():创建状态对象,这个对象会保持 Widget 的状态。
  • initState():初始化状态,只调用一次。
  • build():构建 Widget 的 UI,每次状态改变时都会调用。
  • setState():当需要更新 UI 时调用此方法。
  • dispose():当 Widget 被销毁时调用,用于清理资源。

总结

在 Flutter 中,Widget 是应用程序构建的核心,涵盖了所有的 UI 组件、布局和功能模块。无论是无状态还是有状态的 Widget,都通过嵌套和组合的方式来构建复杂的用户界面。掌握基础的 Widget,如 TextImageIcon,以及常用的布局 Widget,如 ColumnRowPaddingExpanded,是学习 Flutter 的基础。通过理解 Widget 的使用方式和它们的生命周期,开发者能够灵活构建高效、可维护的应用。


http://www.ppmy.cn/news/1541019.html

相关文章

AWS 实现CI/CD

1 任务定义 containerDefinitions 定义部署信息指定每个子项的资源 最外层定义这个task需要的资源 这时候就可以使用低配置的EC2启动 创建service 增加负载均衡选择Application Load Balancer 创建新的监听器&#xff0c;监听端口是负载均衡入口的端口 查看负载均衡流量正常 …

Oracle权限安全管理

实验内容 本次实验先使用system用户连接 温馨提示&#xff1a;题目要求切换账户登录的时候自己记得切换&#xff0c;本文章只提供相应的SQL语句 在表空间BOOKTBS1&#xff08;实验4第1题已创建&#xff09;创建一张表BOOKS,其字段如下&#xff1a;&#xff1a; SQL> create…

24.10.20(换根哈希)

星期一&#xff1a; 阴间场 cf渡劫成功&#xff0c;拿下三题&#xff0c;终于上蓝&#x1f973;&#x1f973;&#x1f973; 贴 cf round978 div2 C cf传送门 答案取到n1但初始化没到n1&#xff0c;wa了一发&#xff0c;很烦&#x1f63f;…

Docker 安装sql server 登陆失败

错误&#xff1a; Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate]. Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Client unable to establish co…

网络相关(HTTP/TCP/UDP/IP)

网络相关 常见的状态码 100 临时响应 100 继续,请求者应当继续提出请求101 切换协议200 成功响应 200: 服务器成功处理请求201 以创建,请求成功并且服务器创建了新的资源202 已接受:服务器已接受请求,但尚未处理203 非授权信息:服务器已成功处理请求,但返回的信息可能来…

2024.10月18日- Vue2组件开发(3)

Vue组件开发 一、 ref属性 如果在vue里&#xff0c;想要获取DOM对象&#xff0c;并且不想使用JS的原生语法&#xff0c;那么就可以使用ref属性。ref属性的用法&#xff1a; 1&#xff09;在HTML元素的开始标记中&#xff0c;或者在Vue子组件中的开始标记中定义&#xff0c;相…

大数据面试题整理——Yarn

系列文章目录 第一章 HDFS面试题 第二章 MapReduce面试题 文章目录 系列文章目录什么是 Yarn&#xff1f;一、Yarn 的主要组件及其功能是什么&#xff1f;二、Yarn 中的容器&#xff08;Container&#xff09;是什么&#xff1f;三、简述 Yarn 的工作流程。四、Yarn 如何进行资…

Python网络请求库requests的10个基本用法

大家好&#xff01;今天我们要聊聊Python中非常实用的一个库——requests。这个库让发送HTTP请求变得超级简单。无论你是想抓取网页数据还是测试API接口&#xff0c;requests都能派上大用场。下面我们就一起来看看如何使用requests完成一些常见的任务。 引言 随着互联网技术的…