【Flutter教程】从零构建电商应用(一)
在这个系列中,我们将学习如何使用google的移动开发框架flutter创建一个电商应用。本文是flutter框架系列教程的第一部分,将学习如何安装Flutter开发环境并创建第一个Flutter应用,并学习Flutter应用开发中的核心概念,例如widget、状态等。
本系列教程包含如下四个部分,敬请期待:
- 如何从零构建flutter应用
- 如何在flutter中布局元素
- 如何在flutter中组织数据
- 如何在flutter中展示数据
1. 开发环境安装与Flutter项目创建
Flutter的开发文档相当出色,请参考官方文档先安装开发环境。
一旦开发环境安装好,我们可以创建一个新的测试项目。我倾向于使用android studio,因为它为flutter应用的开发提供了一个完备的集成开发环境。你需要在Android studio中安装一个Dard语言插件。
现在启动Android Studio,你会看到初始化Flutter项目的选项:
从配置列表中选择**Flutter Application **。
可以为你的第一个Flutter应用起一个酷炫的名字,不过如果你和我一样不善于起名,就用timer好了。
对话框的最后一步,会要求我们填写应用的包名:
接下来Flutter SDK就会为应用创建一个初始的目录结构,main.dart是应用执行的入口。
2. 编写并测试应用代码
在Flutter中,一切都是控件(widget)。Flutter应用中的图像、图标和文本都是widget。布局元素例如行、列、栅格等用来安排其他widget的位置、大小和对齐,而这些布局元素本身也是widget。
参考如下代码修改你的main.dart文件:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: Text('Welcome to Flutter'), ), body: Center( child: Text('Hello World'), ), ), ); } }
现在启动Android模拟器:
注意widget的焦点,我们接下来将修改MaterialApp的内容。先看一下原始版本:
body: Center( child: Text('Hello World'), )
Flutter中的布局元素(也是widget)可以根据其是否支持包含多个widget,而简单地归类为两种类型。例如,Container、Padding只能包含一个子widget,而Row、Column则可以包含多个。
现在我们在Row布局中引入三个文本widget:
body: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('0'), Text('0'), Text('0'), ], ), ),
现在看起来是这样:
在我们开始设置组件的样式之前,建议先创建一个新的widget来处理样式问题,以便遵循DRY(Don't Repeat Yoursel)原则。
将三个子widget用一个自定义widget(后面解释)替换。现在main.dart文件变成:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: Text('Timer'), ), body: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ CustomTextContainer(), CustomTextContainer(), CustomTextContainer(), ], ), ), ), ); } } class CustomTextContainer extends StatelessWidget { @override Widget build(BuildContext context) { return Text('00'); } }
我不是很擅长用户界面,但是我们还是尽力吧,加点背景色,留点空白:
class CustomTextContainer extends StatelessWidget { CustomTextContainer({this.label, this.value}); final String label; final String value; @override Widget build(BuildContext context) { return Container( margin: EdgeInsets.symmetric(horizontal: 5), padding: EdgeInsets.all(20), decoration: new BoxDecoration( borderRadius: new BorderRadius.circular(10), color: Colors.black87, ), child: Column( mainAxisSize: MainAxisSize.min, children: <Widget>[ Text( '$value', style: TextStyle( color: Colors.white, fontSize: 54, fontWeight: FontWeight.bold, ), ), Text( '$label', style: TextStyle( color: Colors.white70, ), ) ], ), ); } }
同时,在文本下面插入一个按钮widget,修改后的代码运行结果如下:
现在到了app最不可或缺的部分了:状态。状态将持有timer的当前值和运行标识。我 补充了一个TimerState类,它负责维护状态,同时构建widget树。
class Timer extends StatefulWidget { @override State<StatefulWidget> createState() { return new TimerState(); } } class TimerState extends State<Timer> { int secondsPassed = 0; bool isActive = false; @override Widget build(BuildContext context) { // Return Widget Tree } }
按钮用来切换timer的运行或者停止:
RaisedButton( child: Text(isActive ? 'STOP' : 'START'), onPressed: () { setState(() { isActive = !isActive; }); }, )
Dart有个用于异步操作的优雅的模块。我们可以使用其Timer类来实现读秒。修改后的TimerAppState代码如下,注意我们已经重构Timer类并改名为TimerApp以避免与异步模块中的Timer类混淆:
class TimerAppState extends State<TimerApp> { static const duration = const Duration(seconds:1); int secondsPassed = 0; bool isActive = false; Timer timer; void handleTick() { if (isActive) { setState(() { secondsPassed = secondsPassed + 1; }); } } @override Widget build(BuildContext context) { if (timer == null) timer = Timer.periodic(duration, (Timer t) { handleTick(); }); int seconds = secondsPassed % 60; int minutes = secondsPassed ~/ 60; int hours = secondsPassed ~/ (60*60); return MaterialApp(...) } }
好了,我们已经完成了第一个Flutter应用,完整的Dard代码可以在这里下载。
汇智网翻译整理,转载请标明出处。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
利用Spring Social轻松搞定微信授权登录
微信第三方登录有两种方式:扫码登录(微信开放平台)和公众号登录(微信公众平台) 扫码登录可以用于PC等跨平台应用,而公众平台必须在微信app内使用,且必须关注公众号. 下面以公众平台为例,介绍如何基于Spring Social实现微信用户授权并获取到用户信息(微信开放平台类似). 第一步:到微信公众平台后台注册应用并进行相关设置 微信公众平台后台地址: https://mp.weixin.qq.com/ 也可以先注册一个测试号: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 用微信扫码登录后台后可以看到如下页面: 其中的"appID"和"appsecret"需要记录下来,一会要用到. 滑到下方找到"网页授权获取用户基本信息",点击"修改",将自己测试服务器的域名或IP填上去: 修改页面: 第二步:添加相关代码 我们假设服务端是基于springboot。 1.增加spring-social-wechat依赖: Maven: <dependency> <groupId>com.ikaso...
- 下一篇
Linux上的文件类型与默认图标
引言 也许小伙伴们对 Linux 已经有一定程度的了解,或者已经是一名能够在工作和生活中活用它的 Linux 用户了。随着桌面环境的不断发展,Linux 系统已经不再仅仅是一个面向极客和开发者的操作系统了,在 PC 上,上手 Linux 桌面已经可以变得像上手Windows 桌面一样简单。 本篇文章是一篇纯黑的技术软文,讲的是我们平时一般不会在意的东西,而且不会涉及具体编程方面的知识,所以小伙伴们不用担心文章过于晦涩难懂,尽情的一边喝茶一边涨知识吧! Windows上的文件类型与默认图标 在Windows上,文件类型基于唯一后缀名进行区分,比如——文本类型的后缀名是”.txt”,而Win32应用程序的后缀名是“.exe”。在win10系统中,这些后缀名默认被隐藏,在文件管理器的选项中更改设置为显示,就能够看到每个文件的后缀名了。 对于每一种文件类型,Windows上都有一个默认图标(一般exe的图标不是默认的,而是应用自己定制的),它的默认图标可以由默认打开它的应用决定,比如——使用winrar作为默认应用打开”.zip”压缩文件,那么所有的”.zip”类型文件默认图标都会变成winr...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 2048小游戏-低调大师作品