Flutter 开发3:创建第一个Flutter应用
Step 1: 安装Flutter
1.1 下载Flutter SDK
首先,你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。
$ cd ~/development
$ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip
1.2 更新环境变量
接下来,你需要将Flutter的bin目录添加到你的环境变量中。这样你就可以在任何地方运行Flutter命令。
$ export PATH="$PATH:`pwd`/flutter/bin"
Step 2: 安装Android Studio
Flutter需要一个Android平台来运行和测试应用程序。最简单的方式就是安装Android Studio,它包含了所有你需要的工具。
2.1 下载并安装Android Studio
访问Android Studio官方网站下载最新的Android Studio版本。然后按照提示进行安装。
2.2 安装Flutter和Dart插件
在Android Studio中,你需要安装Flutter和Dart插件来支持Flutter应用开发。
$ flutter doctor
这个命令将检查你的环境,并显示任何需要解决的问题。如果没有问题,你就可以开始创建你的第一个Flutter应用了。
Step 3: 创建你的第一个Flutter应用
3.1 使用Flutter命令行工具
使用Flutter命令行工具是创建新的Flutter应用最简单的方式。只需要运行以下命令:
$ flutter create my_app
$ cd my_app
这将创建一个新的Flutter应用,并且所有的代码都放在my_app目录下。
3.2 运行你的应用
在你的设备或模拟器上运行你的应用,只需要运行以下命令:
$ flutter run
现在你应该可以看到你的第一个Flutter应用在你的设备或模拟器上运行了。
Step 4: 探索你的应用
现在你已经创建了你的第一个Flutter应用,是时候更深入地了解它的工作原理了。让我们从main.dart文件开始。
$ cd lib
$ nano main.dart
这个文件是你的应用的入口点。它定义了一个main函数,这个函数调用了runApp函数,runApp函数接受一个Widget作为参数。在这个例子中,这个Widget是MyApp类的一个实例。
Step 5: 自定义你的应用
Flutter使用Widget来构建UI。每个Widget都是不可变的,一旦你的Widget被创建,你就不能改变它。但是,你可以通过改变它的状态来改变它的外观和行为。
5.1 创建一个新的Widget
让我们创建一个新的Widget,它包含一个按钮和一个文本。当你点击按钮时,文本将更新。
$ nano lib/main.dart
在这个文件中,你需要定义一个新的StatefulWidget。这个Widget有一个状态,当你点击按钮时,状态将更新,然后Widget将重新构建,显示新的文本。
class MyCustomWidget extends StatefulWidget { _MyCustomWidgetState createState() => _MyCustomWidgetState();
}class _MyCustomWidgetState extends State<MyCustomWidget> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}Widget build(BuildContext context) {return Container(child: Column(children: <Widget>[Text('You have pushed the button $_counter times.'),RaisedButton(onPressed: _incrementCounter,child: Text('Increment'),),],),);}
}
5.2 使用你的新Widget
现在你已经创建了一个新的Widget,你可以在你的应用中使用它。让我们把它添加到MyApp Widget中。
class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('My First Flutter App'),),body: MyCustomWidget(),),);}
}
现在,当你运行你的应用时,你应该可以看到你的新Widget,它包含一个显示文本和一个按钮。每次你点击按钮,文本都会更新。
5.3 测试你的应用
Flutter提供了一个强大的测试框架,你可以使用它来测试你的应用。让我们为你的新Widget写一个测试。
$ cd test
$ nano widget_test.dart
在这个文件中,你需要定义一个新的测试,这个测试将检查当你点击按钮时,文本是否正确更新。
void main() {testWidgets('MyCustomWidget updates text when button is pressed', (WidgetTester tester) async {await tester.pumpWidget(MyApp());expect(find.text('You have pushed the button 0 times.'), findsOneWidget);await tester.tap(find.byType(RaisedButton));await tester.pump();expect(find.text('You have pushed the button 1 times.'), findsOneWidget);});
}
你可以运行这个测试,看看你的Widget是否正常工作。
$ flutter test
如果你的测试通过,那么你可以确信你的Widget正常工作。
Step 6: 构建和发布你的应用
当你对你的应用满意,并准备发布它时,你需要构建它。Flutter提供了一个命令行工具,你可以使用它来构建你的应用。
6.1 构建你的应用
你可以使用以下命令来构建你的应用:
$ flutter build apk --release
这将构建一个适用于Android的APK文件。如果你想为iOS构建你的应用,你可以使用flutter build ios --release
。
6.2 发布你的应用
一旦你构建了你的应用,你就可以发布它了。你可以将它上传到Google Play Store或Apple App Store,或者你可以直接将APK文件提供给你的用户下载。
在这个教程中,你学习了如何创建你的第一个Flutter应用,如何自定义它,如何测试它,以及如何构建和发布它。虽然这只是一个简单的开始,但是Flutter提供了许多工具和库,你可以使用它们来创建更复杂的应用。现在,你已经掌握了基础知识,你可以开始探索Flutter的更多功能了。
享受你的Flutter旅程!
Step 7: 进一步学习
现在你已经掌握了Flutter的基础知识,你可能想要探索更多的内容。让我们看看你可以学习的一些主题。
7.1 使用外部包
Flutter有一个非常活跃的社区,他们创建了许多用于解决常见问题的包。你可以在pub.dev找到这些包。
7.2 使用动画
Flutter有一个强大的动画库,你可以使用它来创建复杂的UI动画。
7.3 使用数据库
如果你的应用需要存储大量的用户数据,你可能需要使用数据库。Flutter支持SQLite,你可以使用它来创建本地数据库。
7.4 使用网络服务
如果你的应用需要与服务器通信,你可能需要使用HTTP包。你可以使用它来发送GET和POST请求。
7.5 使用Flutter for Web
Flutter不仅可以用于构建移动应用,还可以用于构建网页应用。你可以使用和构建移动应用相同的代码库来构建网页应用。
结语
在这个教程中,你学习了如何创建你的第一个Flutter应用,如何自定义它,如何测试它,以及如何构建和发布它。你还了解了一些可以进一步学习的主题。Flutter是一个强大而灵活的框架,无论你是一个新手还是一个经验丰富的开发者,都可以使用它来创建美观而高效的应用。
享受你的Flutter旅程!
感谢阅读, Best Regards!
相关文章:

Flutter 开发3:创建第一个Flutter应用
Step 1: 安装Flutter 1.1 下载Flutter SDK 首先,你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来,你需要将Flutter…...
Linux中断下半部分:软中断,tasklet和工作队列
为什么要有下半部分 中断会打断其他程序,为了打断其他程序时间短,就需要中断处理程序快。执行中断处理程序后,相同中断不会触发,甚至所有中断都不能触发(设置IRQF_DISABLED,其他硬件与操作系统无法通信)中…...

Flink CEP实现10秒内连续登录失败用户分析
1、什么是CEP? Flink CEP即 Flink Complex Event Processing,是基于DataStream流式数据提供的一套复杂事件处理编程模型。你可以把他理解为基于无界流的一套正则匹配模型,即对于无界流中的各种数据(称为事件),提供一种组合匹配的…...

QSqlRelationalTableModel 关系表格模型
一、 1.1 QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持。一个外键就是一个表中的一个字段 和 其他表中的主键字段之间的一对一的映射。例如,“studInfo”表中的departID字段对应的是“departments…...

JS和CSS实现的原生轮播图
JSCSS实现滑动轮播图 使用JS加CSS来实现的幻灯片,主要使用的是CSS的transform属性中的translate来实现,适合与用户交互的轮播图,展现轮播图的数量,用户可自由进行选择。 <!DOCTYPE html> <html lang"en">&…...

【微服务】skywalking自定义链路追踪与日志采集
目录 一、前言 二、自定义链路追踪简介 2.1 自定义链路追踪应用场景 2.2 链路追踪几个关键概念 三、skywalking 自定义链路追踪实现 3.1 环境准备 3.2 集成过程 3.2.1 导入核心依赖 3.2.2 几个常用注解 3.2.3 方法集成 3.2.4 上报追踪信息 四、skywalking 自定义日志…...
MYSQL基础问题
一.DBMS 是什么 DBMS(Database Management System),数据库管理系统,是一种操纵和管理 数据库的大型软件,用于建立、使用和维护数据库。对数据库进行统一的管理和 控制,以保证数据库的安全性和完整性。 二…...
SpringBoot使用Guava实现日志脱敏(含源码)
点击下载《SpringBoot使用Guava实现日志脱敏(含源码)》 1. 摘要 本文将介绍如何使用Google Guava库进行日志脱敏,保护敏感数据的安全。我们将详细解释脱敏的必要性,然后介绍如何使用Guava中的Strings、Maps和CharMatcher类来进行…...

数据结构—动态查找
动态查找介绍 1. 动态查找的引入:当查找表以线性表的形式组织时,若对查找表进行插入、删除或排序操作,就必须移动大量的记录,当记录数很多时,这种移动的代价很大。 2. 动态查找表的设计思想:表结构本身是…...
Tarjan算法学习笔记
目录 无向图的割点与桥 时间戳: 搜索树: 追溯值: 割边判定法则: 割点判定法则: 无向图的双连通分量 定理: 边双连通分量(e-DCC)的求法: e-DCC的缩点: 有向图的连通性 追…...
vue 项目涉及的焦点聚焦、格式化日期、判断是否为对象或数组、判断是否为空、深拷贝、节流、防抖
焦点聚焦 import Vue from vue // 插件对象(必须有 install 方法, 才可以注入到 Vue.use 中) export default {install () {Vue.directive(fofo, {inserted (el) {el el.querySelector(input)el.focus()}})} }格式化日期格式 export const formatDate (time) > {// 将xx…...

软件工程知识梳理6-运行和维护
软件维护需要的工作量很大,大型软件的维护成本高达开发成本的4倍左右。所以,软件工程的主要目的就是要提高软件的可维护性,减少软件维护所需要的工作量,降低软件系统的总成本。 定义:软件已经交付使用之后,…...
docker- php7.4
安装 gd拓展 anzhuanga在Dockerfile里面安装php7.4的GD库 - 知乎 apt update apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-devdocker-php-source extractdocker-php-ext-configure gd \ --with-jpeg/usr/include \ --with-freetype/usr/include/docker-…...
开发一个Android App,在项目中完成添加联系人的功能,通过ContentResolver向系统中添加联系人信息。
实现步骤: (1)添加动态联系人的权限。 (2)创建Activity和布局文件,添加输入框和按钮等控件。 (3)完成添加联系人的功能。 代码文件如下: activity_main.xml文件 <!…...

Flume搭建
压缩包版本:apache-flume-1.9.0-bin.tar 百度盘链接:https://pan.baidu.com/s/1ZhSiePUye9ax7TW5XbfWdw 提取码:ieks 1.解压 tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/ 2. 修改文件名 [rootbigdata1 opt]…...

Web APIs 1 DOM操作
Web APIs 1 引入:const优先Web API 基本认知01 作用和分类02 什么是DOM03 DOM树04 DOM对象 获取DOM对象01 根据CSS选择器获取02 其他获取DOM元素方法 操作元素内容01 innerText 属性02 innerHTML 属性 操作元素属性操作元素的常用属性操作元素的样式属性操作表单元素…...

dvwa,xss反射型lowmedium
xss,反射型,low&&medium low发现xss本地搭建实操 medium作为初学者的我第一次接触比较浅的绕过思路high low 发现xss 本关无过滤 <script>alert(/xss/)</script> //或 <script>confirm(/xss/)</script> //或 <scr…...

从云计算到物联网:虚拟化技术的演变与嵌入式系统的融合
文章目录 一、硬件性能提升:摩尔定律与嵌入式虚拟化二、CPU多核技术:为嵌入式虚拟化提供支持三、业务负载整合:嵌入式虚拟化的核心需求四、降低硬件成本:虚拟化技术的经济效益五、软件重用与移植:虚拟化技术的优势六、…...

linux 文件查看 head 、 cat 、 less 、tail 、grep
查看文件详细信息 stat 文件 cat 》》适合显示小文件【行数比较少】,如果行数较多,屏幕显示不完整(如果虚拟操作,是无法上下键的,或者滚动鼠标的,第三方 xsheel,crt 可以方向键查看…...
13.2 Web与Servlet进阶(❤❤)
13.2 Web与Servlet进阶 1. 请求与响应1.1 URL与URI1.2 HTTP请求的结构1. 结构2.后端获取访问工具类型:getHeader().toLowerCase方法1.3 响应的结构1. 结构2. 响应常见状态码3. 后端设置响应参数4. 响应的ContentType作用1.4 请求转发与响应重定向应用1. 请求转发:getRequestDis…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...