构建出色的用户体验对于您的应用程序的成功至关重要。无论您销售的产品多么出色,如果您的应用程序没有提供积极的用户体验,您就会陷入困境。在本教程中,您将学习如何使用 Flutter 构建直观的产品库并提供更好的购买体验。
我们将构建一个示例应用程序,以一种引人入胜的方式列出产品——点击产品,我们将为产品详细信息页面设置动画,您可以在其中设置其数量并将其添加到购物车。在顶部,您还将看到添加到购物车的商品数量,当您单击它时,您可以看到添加到其中的所有产品的列表。
在本教程结束时,您将学习如何构建更宽的屏幕、允许搜索产品、切换视图、管理购物车的状态以及在屏幕之间导航时添加材质动作以获得流畅的用户体验。
以下是我们的 Flutter 电子商务产品库完成后的外观:
以下是我们将在本教程中介绍的内容:
-
创建项目
-
创建画面
-
产品列表
-
产品详情
-
大车
-
-
添加产品
-
构建购物车
-
增加响应能力
-
切换产品显示视图
-
搜索产品
-
添加动画(材质运动系统)
创建项目
在开始之前,您必须安装 Flutter SDK 并创建一个基础项目。让我们看看如何做到这一点。
首先,从此链接获取 Flutter SDK 。安装后,通过在终端中点击以下命令检查一切是否正常:
扑医生
(注意:如果有任何东西标有红色标记,您必须先解决它们,然后再继续下一步)
现在,创建一个您想要创建此项目的目录并输入以下命令。这将在指定目录中创建一个全新的项目。
颤振创建ecomm_app
要打开、编辑文件内容并运行/调试/测试项目,您需要安装 IDE。您可以从以下任何编辑器中进行选择:
-
安卓工作室
-
视觉工作室代码
-
IntelliJ IDEA
打开projectfolder/lib/main.dart并通过点击播放按钮从 IDE 运行启动应用程序。您也可以通过输入以下命令从命令行运行它:
flutter run // 提示:如果你在运行多个设备,你可以运行// 以下:flutter run -d "<device_name>"
创建画面
示例应用程序由三个屏幕组成:产品列表、产品详细信息和购物车页面。
让我们看看这些屏幕如何融入流程:
首先,您将看到所有产品。点击任何项目都会打开详细信息页面。您可以将商品添加到购物车并导航到购物车页面。
产品列表
第一个屏幕显示所有产品及其名称、图像和价格。您可以在此处搜索产品并在网格视图和列表视图之间切换视图。在点击该项目时,它会打开产品详细信息页面。
以下是一些可用于构建第一个屏幕的基本小部件:
以下是创建此容器的确切代码:
Container ( //width: MediaQuery.of(context).size.width * 0.45, decoration : BoxDecoration ( color : AppTheme . of ( context ) .secondaryBackground , boxShadow : [ BoxShadow ( blurRadius : 4 , color : Color ( 0x3600000F ), 偏移量:偏移量(0,2 ),)] ,边界 半径: 边界半径。圆形(8 ),) , 孩子:填充( 填充:EdgeInsetsDirectional.fromSTEB (0,0,0,12 ), 孩子:列(mainAxisSize :MainAxisSize。max , 孩子:[行( mainAxisSize :MainAxisSize。max ,孩子:_ _ _ _ _ _ _ _ _ [ Expanded( child: ClipRRect( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(0), bottomRight: Radius.circular(0), topLeft: Radius.circular(8), topRight: Radius.circular(8), ), child: Image.network( product.image, width: 100, height: 100, fit: BoxFit.cover, ), ), ), ], ), Padding( padding: EdgeInsetsDirectional.fromSTEB(0, 4, 0, 0), child: Row( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB(8, 4, 0, 0), child: Text( product.name, style: AppTheme.of(context).bodyText1, ), ), ], ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB(0, 2, 0, 0), child: Row( mainAxisSize: MainAxisSize.max, children: [