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…...
InvoiceNet未来展望:AI发票解析技术的发展趋势和社区规划
InvoiceNet未来展望:AI发票解析技术的发展趋势和社区规划 【免费下载链接】InvoiceNet Deep neural network to extract intelligent information from invoice documents. 项目地址: https://gitcode.com/gh_mirrors/in/InvoiceNet InvoiceNet作为一款基于深…...
效率提升神器:用快马AI自动诊断并修复npm 128错误,节省排错时间
效率提升神器:用快马AI自动诊断并修复npm 128错误,节省排错时间 最近在团队协作开发一个Node.js项目时,频繁遇到npm安装依赖报错128的问题。每次都要花大量时间排查SSH配置、网络代理或仓库源的问题,严重影响了开发效率。于是我开…...
掌控微信数据:从信息丢失到价值挖掘的完整解决方案
掌控微信数据:从信息丢失到价值挖掘的完整解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMs…...
终极指南:5分钟学会永久免费使用Cursor Pro的完整教程
终极指南:5分钟学会永久免费使用Cursor Pro的完整教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...
这个 Plugin 让 OpenClaw 减少Skill 90%Token消耗
别让 Skill 列表烧光你的 Token——用一个 Plugin 让 OpenClaw 瘦身 90% 95 个 Skill,每轮对话就消耗 5000 多个 Token?本文将分享我们如何通过 Elasticsearch 语义搜索和一个 OpenClaw Plugin,将 Skill 列表从“全量注入”变为“按需加载”&…...
高效办公:浏览器扩展无需安装桌面软件的全功能解决方案
高效办公:浏览器扩展无需安装桌面软件的全功能解决方案 【免费下载链接】se-office se-office扩展,提供基于开放标准的全功能办公生产力套件,基于浏览器预览和编辑office。 项目地址: https://gitcode.com/gh_mirrors/se/se-office 在…...
Linux内核中的驱动程序开发高级话题
Linux内核中的驱动程序开发高级话题 引言 驱动程序是Linux内核中负责与硬件设备交互的重要组成部分,它为操作系统和硬件之间提供了桥梁。随着硬件技术的发展和系统复杂性的增加,驱动程序开发面临着越来越多的挑战。本文将深入探讨Linux内核中驱动程序开发…...
ForgeAdmin实战:开源项目分布式幂等组件 v2.0 升级
我在开源项目重构了分布式幂等组件:支持三种策略、Token防重放、结果缓存 为什么要重构幂等组件? 在企业级开发中,幂等性是保障数据一致性必不可少的能力。之前我在 Forge Admin 开源项目中实现了一个基础版本的幂等组件,但随着使…...
SGLang-v0.5.6备份策略详解:零基础学会模型状态保存与恢复
SGLang-v0.5.6备份策略详解:零基础学会模型状态保存与恢复 1. 引言 想象一下,你正在和一个AI助手进行一场长达半小时的深度对话,从技术讨论到方案规划,聊得非常投入。突然,服务器需要重启升级,或者程序意…...
auto_feed:重新定义PT资源转载工作流的技术架构解析
auto_feed:重新定义PT资源转载工作流的技术架构解析 【免费下载链接】auto_feed_js PT站一键转载脚本 项目地址: https://gitcode.com/gh_mirrors/au/auto_feed_js 如果你是一名PT社区的活跃用户,每天需要在不同站点间手动复制粘贴资源信息&#…...
