当前位置: 首页 > news >正文

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 首先&#xff0c;你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来&#xff0c;你需要将Flutter…...

Linux中断下半部分:软中断,tasklet和工作队列

为什么要有下半部分 中断会打断其他程序&#xff0c;为了打断其他程序时间短&#xff0c;就需要中断处理程序快。执行中断处理程序后&#xff0c;相同中断不会触发&#xff0c;甚至所有中断都不能触发&#xff08;设置IRQF_DISABLED&#xff0c;其他硬件与操作系统无法通信)中…...

Flink CEP实现10秒内连续登录失败用户分析

1、什么是CEP&#xff1f; Flink CEP即 Flink Complex Event Processing&#xff0c;是基于DataStream流式数据提供的一套复杂事件处理编程模型。你可以把他理解为基于无界流的一套正则匹配模型&#xff0c;即对于无界流中的各种数据(称为事件)&#xff0c;提供一种组合匹配的…...

QSqlRelationalTableModel 关系表格模型

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

JS和CSS实现的原生轮播图

JSCSS实现滑动轮播图 使用JS加CSS来实现的幻灯片&#xff0c;主要使用的是CSS的transform属性中的translate来实现&#xff0c;适合与用户交互的轮播图&#xff0c;展现轮播图的数量&#xff0c;用户可自由进行选择。 <!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基础问题

一&#xff0e;DBMS 是什么 DBMS&#xff08;Database Management System&#xff09;,数据库管理系统&#xff0c;是一种操纵和管理 数据库的大型软件&#xff0c;用于建立、使用和维护数据库。对数据库进行统一的管理和 控制&#xff0c;以保证数据库的安全性和完整性。 二…...

SpringBoot使用Guava实现日志脱敏(含源码)

点击下载《SpringBoot使用Guava实现日志脱敏&#xff08;含源码&#xff09;》 1. 摘要 本文将介绍如何使用Google Guava库进行日志脱敏&#xff0c;保护敏感数据的安全。我们将详细解释脱敏的必要性&#xff0c;然后介绍如何使用Guava中的Strings、Maps和CharMatcher类来进行…...

数据结构—动态查找

动态查找介绍 1. 动态查找的引入&#xff1a;当查找表以线性表的形式组织时&#xff0c;若对查找表进行插入、删除或排序操作&#xff0c;就必须移动大量的记录&#xff0c;当记录数很多时&#xff0c;这种移动的代价很大。 2. 动态查找表的设计思想&#xff1a;表结构本身是…...

Tarjan算法学习笔记

目录 无向图的割点与桥 时间戳&#xff1a; 搜索树&#xff1a; 追溯值&#xff1a; 割边判定法则&#xff1a; 割点判定法则&#xff1a; 无向图的双连通分量 定理&#xff1a; 边双连通分量(e-DCC)的求法&#xff1a; e-DCC的缩点&#xff1a; 有向图的连通性 追…...

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-运行和维护

软件维护需要的工作量很大&#xff0c;大型软件的维护成本高达开发成本的4倍左右。所以&#xff0c;软件工程的主要目的就是要提高软件的可维护性&#xff0c;减少软件维护所需要的工作量&#xff0c;降低软件系统的总成本。 定义&#xff1a;软件已经交付使用之后&#xff0c;…...

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向系统中添加联系人信息。

实现步骤&#xff1a; &#xff08;1&#xff09;添加动态联系人的权限。 &#xff08;2&#xff09;创建Activity和布局文件&#xff0c;添加输入框和按钮等控件。 &#xff08;3&#xff09;完成添加联系人的功能。 代码文件如下&#xff1a; activity_main.xml文件 <!…...

Flume搭建

压缩包版本&#xff1a;apache-flume-1.9.0-bin.tar 百度盘链接&#xff1a;https://pan.baidu.com/s/1ZhSiePUye9ax7TW5XbfWdw 提取码&#xff1a;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 引入&#xff1a;const优先Web API 基本认知01 作用和分类02 什么是DOM03 DOM树04 DOM对象 获取DOM对象01 根据CSS选择器获取02 其他获取DOM元素方法 操作元素内容01 innerText 属性02 innerHTML 属性 操作元素属性操作元素的常用属性操作元素的样式属性操作表单元素…...

dvwa,xss反射型lowmedium

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

从云计算到物联网:虚拟化技术的演变与嵌入式系统的融合

文章目录 一、硬件性能提升&#xff1a;摩尔定律与嵌入式虚拟化二、CPU多核技术&#xff1a;为嵌入式虚拟化提供支持三、业务负载整合&#xff1a;嵌入式虚拟化的核心需求四、降低硬件成本&#xff1a;虚拟化技术的经济效益五、软件重用与移植&#xff1a;虚拟化技术的优势六、…...

linux 文件查看 head 、 cat 、 less 、tail 、grep

查看文件详细信息 stat 文件 cat 》》适合显示小文件【行数比较少】&#xff0c;如果行数较多&#xff0c;屏幕显示不完整&#xff08;如果虚拟操作&#xff0c;是无法上下键的&#xff0c;或者滚动鼠标的&#xff0c;第三方 xsheel&#xff0c;crt 可以方向键查看&#xf…...

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…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...