当前位置: 首页 > 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…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...