Flutter框架性泛学习系列之二、Flutter应用层(Application Layer)上-常用Widgets与简单动画

文章目录

  • 概述
    • 一、应用程序(Application):
      • 1、创建应用对象
      • 2、定义应用主页
    • 二、Widgets:
      • 1. 基础的内置Widgets应用
        • 1.1 Text Widget
        • 1.2 RaisedButton Widget
        • 1.3 Image Widget
        • 1.4 Icon Widget
      • 2. 自定义Widgets的创建与应用
        • 2.1 创建按钮组件
        • 2.2 创建卡片组件
        • 2.3 创建自定义列表项
      • 3. 布局Widgets的应用
        • 3.1 Row Widget
        • 3.2 Column Widget
        • 3.3 Expanded Widget
        • 3.4 SizedBox Widget
        • 3.5 应用
      • 4. 手势识别与动画效果
      • 4.2 动画效果
      • 5. 其他高级Widgets的应用
        • 5.1 SingleChildScrollView
        • 5.2 TabBar & TabBarView

任何知识体系,都需要系统的去学习,有一个大概的框架,学习才能如遇得水。知道自己学习的是什么,属于知识体系中的哪一环。
学习就应该首先有一个体系,然后不求甚解的将体系过一遍,最后再在体系中,填充各部分知识。

概述

在Flutter框架的整体层次结构中,应用层(Application Layer)是最接近开发者的一层,负责管理应用程序的整体逻辑和用户界面。以下是应用层的一些关键组成部分和功能:

一、应用程序(Application):

应用程序是Flutter应用的顶层组件,它通常代表着整个应用的入口点。应用程序负责启动应用、管理应用的生命周期,并协调不同组件之间的交互。

应用程序的构建

在Flutter中,应用程序是整个应用的顶层组件,它代表着应用的入口点。在构建Flutter应用程序时,我们通常需要做以下几个步骤:

1、创建应用对象

使用MaterialApp或CupertinoApp等顶级组件创建应用对象,并指定应用的一些基本属性,如标题、主题等。

void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: 'My Flutter App',theme: ThemeData(primarySwatch: Colors.blue,),home: MyHomePage(),);}
}

2、定义应用主页

创建应用的主页,通常是一个StatefulWidget,负责展示应用的内容和处理用户交互。

class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Home'),),body: Center(child: Text('Welcome to my Flutter app!'),),);}
}

二、Widgets:

Widgets是Flutter应用层构建用户界面的基本单元。Flutter提供了丰富的内置Widgets,包括文本、按钮、图像等,开发者还可以通过组合现有的Widgets来创建自定义的UI组件。Widgets可以是有状态的(StatefulWidget)或无状态的(StatelessWidget),它们定义了UI的外观和行为。
在Flutter中,Widgets是构建用户界面的基本单元,它们不仅定义了UI的外观和行为,还提供了丰富的功能和灵活的运用方式。本文将深入探讨Flutter Widgets的使用,从基础的内置Widgets到自定义Widgets的创建,帮助开发者更好地掌握Flutter框架的核心技术。

1. 基础的内置Widgets应用

Flutter提供了大量内置的Widgets,涵盖了常见的UI组件,开发者可以直接使用这些Widgets来快速构建应用的用户界面。

1.1 Text Widget

Text Widget用于显示文本内容,可以设置字体样式、颜色等属性。

Text('Hello, Flutter!',style: TextStyle(fontSize: 20,fontWeight: FontWeight.bold,color: Colors.blue,),
)
1.2 RaisedButton Widget

创建凸起的按钮,可以设置按钮文本、颜色、点击事件等属性。

RaisedButton(onPressed: () {// 按钮点击事件处理},child: Text('Click me'),color: Colors.blue,
)
1.3 Image Widget

显示图像,可以从本地文件或网络加载图像。

Image.network('https://example.com/image.jpg')
1.4 Icon Widget

显示图标,可以使用Material Design或Cupertino风格的图标。

Icon(Icons.star,color: Colors.yellow,size: 24.0,
)

2. 自定义Widgets的创建与应用

2.1 创建按钮组件
class MyButton extends StatelessWidget {final String text;final VoidCallback onPressed;//一个回调MyButton({required this.text, required this.onPressed});Widget build(BuildContext context) {return RaisedButton(onPressed: onPressed,child: Text(text),);}
}
2.2 创建卡片组件
class MyCard extends StatelessWidget {final Widget child;final Color color;MyCard({required this.child, this.color = Colors.white});Widget build(BuildContext context) {return Container(padding: EdgeInsets.all(16),decoration: BoxDecoration(color: color,borderRadius: BorderRadius.circular(8),boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.5),spreadRadius: 2,blurRadius: 5,offset: Offset(0, 3),),],),child: child,);}
}
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('My App'),),body: Center(child: MyCard(child: Column(mainAxisSize: MainAxisSize.min,children: [Text('Hello, World!',style: TextStyle(fontSize: 24),),SizedBox(height: 10),Text('This is a custom card.',style: TextStyle(fontSize: 16),),],),),),),);}
}
2.3 创建自定义列表项
class MyListItem extends StatelessWidget {final String title;final String subtitle;final IconData icon;MyListItem({required this.title, required this.subtitle, required this.icon});Widget build(BuildContext context) {return ListTile(leading: Icon(icon),title: Text(title),subtitle: Text(subtitle),);}
}
ListView.builder(itemCount: yourDataList.length,itemBuilder: (context, index) {return MyListItem(title: yourDataList[index].title,subtitle: yourDataList[index].subtitle,icon: yourDataList[index].icon,);},
)

3. 布局Widgets的应用

3.1 Row Widget

水平排列子组件。

Row(children: <Widget>[Icon(Icons.account_circle),Text('Username'),],
)
3.2 Column Widget

垂直排列子组件。

Column(children: <Widget>[Text('Title'),Text('Subtitle'),],
)
3.3 Expanded Widget

在Row、Column等布局中扩展子组件。

Row(children: <Widget>[Expanded(child: Text('Left'),),Expanded(child: Text('Right'),),],
)
3.4 SizedBox Widget

设置固定大小的空白框。

SizedBox(width: 100.0,height: 100.0,child: const Card(child: Text('Hello World!')),
)
3.5 应用
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('布局Widgets示例'),),body: Padding(padding: EdgeInsets.all(20),child: Column(crossAxisAlignment: CrossAxisAlignment.stretch,children: [Expanded(flex: 1,child: Container(color: Colors.red,child: Center(child: Text('顶部区域')),),),Expanded(flex: 3,child: Row(crossAxisAlignment: CrossAxisAlignment.stretch,children: [Expanded(child: Container(color: Colors.blue,child: Center(child: Text('左侧区域')),),),SizedBox(width: 10),Expanded(child: Container(color: Colors.green,child: Center(child: Text('右侧区域')),),),],),),Expanded(flex: 2,child: Container(color: Colors.yellow,child: Center(child: Text('底部区域')),),),],),),),);}
}

在这个示例中,我们创建了一个简单的布局,包含了顶部、左侧、右侧和底部四个区域。Column用于垂直排列这些区域,Row用于水平排列左侧和右侧区域。Expanded用于指定每个区域的比例,使它们可以根据屏幕尺寸进行动态调整。通过这种方式,我们可以构建出灵活且自适应的用户界面。

4. 手势识别与动画效果

4.1 GestureDetector
捕获用户手势操作。

GestureDetector(onTap: () {// 处理点击事件},child: Container(width: 100,height: 100,color: Colors.blue,child: Center(child: Text('Tap me'),),),
);

4.2 动画效果

使用Flutter内置的动画效果,如Opacity、Rotation、Scale等。

class MyAnimatedWidget extends StatefulWidget {_MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
}class _MyAnimatedWidgetState extends State<MyAnimatedWidget> {bool _isVisible = true;Widget build(BuildContext context) {return Column(children: <Widget>[AnimatedOpacity(opacity: _isVisible ? 1.0 : 0.0,duration: Duration(milliseconds: 500),child: Text('Hello'),),RaisedButton(onPressed: () {setState(() {_isVisible = !_isVisible;});},child: Text('Toggle Visibility'),),],);}
}

5. 其他高级Widgets的应用

5.1 SingleChildScrollView

滚动视图,当子组件超出屏幕时可以滚动查看。

SingleChildScrollView(child: Column(children: <Widget>[// 大量的子组件],),
)
5.2 TabBar & TabBarView

用于创建带有选项卡的界面。

TabBar(tabs: <Widget>[Tab(icon: Icon(Icons.directions_car)),Tab(icon: Icon(Icons.directions_transit)),Tab(icon: Icon(Icons.directions_bike)),],
)TabBarView(children: <Widget>[Icon(Icons.directions_car),Icon(Icons.directions_transit),Icon(Icons.directions_bike),],
)

通过以上丰富多样的例子,我们深入了解了Flutter Widgets的全面应用。从基础的内置Widgets到高级的布局和手势识别,再到动画效果和其他高级Widgets的应用,Flutter提供了丰富多样的组件供开发者使用,帮助我们构建出各种复杂、美观且高效的用户界面。

Flutter提供了Flutter Inspector工具,可以帮助开发者调试和优化应用的界面布局。开发者可以使用Flutter Inspector查看界面的层次结构和属性,以及调整布局和样式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络协议汇总

1.HTTP协议 1.认识URL 平时我们俗称的 "网址" 其实就是说的 URL URL中的字符只能是ASCII字符&#xff0c;但是ASCII字符比较少&#xff0c;而URL则常常包含ASCII字符集以外的字符&#xff0c;如非英语字符、汉字、特殊符号等等&#xff0c;所以要对URL进行转换。这个…

已解决Application run failed org.springframework.beans.factory.BeanNot

问题原因&#xff1a;SpringBoot的版本与mybiats-puls版本不对应且&#xff0c;spring自带的mybiats与mybiats-puls版本不对应 这里我用的是3.2.2版本的SpringBoot&#xff0c;之前mybiats-puls版本是3.5.3.1有所不同。 问题&#xff1a;版本对不上 解决办法&#xff1a;完整…

将JWT令牌存储到浏览器中localStorage中,并且往页面请求头中添加token

将JWT令牌存储到浏览器中localStorage中 localStorage.setItem(token, response.data.data) 其中response.data.data是后端返回的数据为jwt字符串 往页面请求头中添加token 在vue中的main.js添加如下再带&#xff0c;axios便会拦截所有请求并且如果localStorage有token则会…

宝塔nginx配置SpringBoot服务集群代理

宝塔nginx配置SpringBoot服务集群代理 1、需求&#xff1a; 现有一个springboot服务需要部署成集群&#xff0c;通过nginx负载均衡进行访问&#xff0c;其中这个springboot服务内置了MQTT服务、HTTP服务、TCP服务。 MQTT服务开放了1889端口 HTTP服务开放了8891端口 HTTP服务开…

LeetCode94.二叉树的中序遍历

题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 &#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 思路 中序遍历的顺序是左子树 -> 根节点 -> 右子树。因此&#xff0c;我们可以通过递归的方式遍历二叉树&…

《白话C++》第8章 8.4.1 INI文件简介,8.4.2面向过程的设计 Page 761

以下是一个INI例子文件的内容&#xff1a; [DISPLAY_SETTING] #是否显示启动窗口&#xff1a; will_show_splash_window yes default_title welcom... [NETWORK_SETTING] svc_host www.d2school.com svc_port 80 带中括号的行代表一个“配置段&#xff08;section&#x…

[word] word 怎样批量把英文单词的首字母全部改成大写 #笔记#其他#学习方法

word 怎样批量把英文单词的首字母全部改成大写 word在处理长文档的过程中&#xff0c;有时候一个单词在多页重复出现。如果要把该单词的首字母改成大写&#xff0c;如果一个一个的改&#xff0c;费时费力。 方法&#xff1a;替换功能 如&#xff1a;我要把camtasia批量改成C…

【riscv】使用qemu运行riscv裸机freestanding程序

文章目录 1. 运行显示2. 工具准备3. 裸机代码和编译3.1 源码3.2 编译 4. 使用qemu仿真运行riscv裸机程序 1. 运行显示 详见左下角&#xff0c; 运行时串口输出的字符 A ; 2. 工具准备 # for riscv64-linux-gnu-gcc sudo apt-get install gcc-riscv64-linux-gnu# for qemu-s…

P6279 题解

P6279 题解 Overview 结论&#xff08;待论证&#xff09; Description 给定一个有向图&#xff0c;这个有向图的每一个点所连接的点都属于同一个集合。 求集合数量最大且字典序最小的集合标号方案。 Solution 先讲结论。 结论&#xff1a;用 vector 存储每个点所连接的…

Spring Cloud Sleuth:分布式链路跟踪

1. 理解分布式链路跟踪 1.1 什么是分布式链路跟踪 在分布式系统中&#xff0c;由于服务间的调用涉及多个节点和网络通信&#xff0c;出现问题时追踪问题的根源变得异常困难。分布式链路跟踪是一种技术&#xff0c;旨在解决这个问题。它允许开发人员追踪分布式系统中请求的流转…

C#是什么?可以用来做什么?

C#是什么&#xff1f;可以用来做什么&#xff1f; C#简介 C#&#xff08;读作“C Sharp”&#xff09;是一种容易使用不复杂新型的编程语言&#xff0c;不仅是面向对象&#xff0c;它的类型还安全。C# 源于 C 语言系列&#xff0c;C、C、Java 和 JavaScript 程序员很快就可以上…

适用于高云FPGA的JTAG

目标板卡&#xff1a;小梅哥芯海无涯GOWIN高云ACG525(GW5A-LV25UG324) 1.软件要求&#xff1a;必须用商业版&#xff0c;因为教育版(V1.9.9Beta-4 Education)不支持此封装的GW5A。商业版需要上网申请License&#xff0c;此处提供D4D853392AD8.lic文件&#xff08;此方法为临时…

Linux ----防火墙值SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由…

基于stm32F103的蜂鸣器周期发声实验

蜂鸣器作为一种声音报警器件,应用广泛。本实验基于stm32F103单片机,通过控制蜂鸣器的IO口电平电压,使其周期性地进行电平翻转,从而驱动蜂鸣器发出周期性的鸣叫声。该实验主要运用了stm32的GPIO和定时器TIM的相关功能,不仅可以巩固这些外设的使用,也可以通过改变时间参数,控制蜂…

档案数字化加工涉密资质申请

等级介绍 涉密印制资质分为甲级和乙级两个等级。甲级资质单位可以从事绝密级、机密级和秘密级涉密印制业务。乙级资质单位可以从事机密级、秘密级涉密印制业务。 类别介绍 涉密印制资质包括涉密文件资料、国家统一考试试卷、涉密防伪票据证书、涉密光电磁介质、 涉…

题目 1138: C语言训练-求矩阵的两对角线上的元素之和

问题描述&#xff1a; 求矩阵的两对角线上的元素之和 样例输入&#xff1a; 3 1 2 3 4 5 6 7 8 9 样例输出&#xff1a; 25 问题分析&#xff1a; 因为奇数阶矩阵的主对角线和副对角线上的元素有重复&#xff0c;偶数阶矩阵的主对角线和副对角线上的元素无重复&#x…

软件测试面试题汇总

一、面试基础题 简述测试流程: 1、阅读相关技术文档&#xff08;如产品PRD、UI设计、产品流程图等&#xff09;。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例&#xff08;等价类划分法、边界值分析法等&#xff09;。 5、用例评审(…

OpenHarmony JS和TS三方组件使用指导

OpenHarmony JS和TS三方组件介绍 OpenHarmony JS和TS三方组件使用的是OpenHarmony静态共享包&#xff0c;即HAR(Harmony Archive)&#xff0c;可以包含js/ts代码、c库、资源和配置文件。通过HAR&#xff0c;可以实现多个模块或者多个工程共享ArkUI组件、资源等相关代码。HAR不…

文件上传漏洞--Upload-labs--Pass07--点绕过

一、什么是点绕过 在Windows系统中&#xff0c;Windows特性会将文件后缀名后多余的点自动删除&#xff0c;在网页源码中&#xff0c;通常使用 deldot()函数 对点进行去除&#xff0c;若发现网页源代码中没有 deldot() 函数&#xff0c;则可能存在 点绕过漏洞。通过点绕过漏洞&…

响应式编程要点 (Java)

整体学习概览 前置知识函数式编程Lambda表达式实践、Java8 Stream Api的使用响应式编程的原理和思想Reactive Stream的思想和Api实践Reactor思想和Api实践WebFlux的使用SpringData R2DBC 前置知识&#xff1a;函数式编程 函数式编程要点-CSDN博客 响应式编程原理和思想 全链…