设计给的效果如下:

拿到设计后,先把整体拆分成几个部分:

  1. “运营位”,使用自定义的旋转木马滑块组件实现可以滚动的运营位。
  2. “登录表单”,使用自定义的登录表单组件实现手机号、验证码登录的表单。
  3. “用户协议”,使用自定义的用户协议组件实现用户协议的声明文本。

然后就可以开始进行编码了。

第1步:绘制组件树

第2步:实现“运营位”

先把需要引用的自定义组件一次引入,carousel_with_indicator.dartlogin_form.dartuser_agreement.dart文件,它们分别对应《Flutter布局锦囊—轮播图片与滑块》、《Flutter布局锦囊—蜡笔画的表单》和《Flutter布局锦囊—用户协议声明》。

import 'package:flutter/material.dart';
import 'widgets/carousel_with_indicator.dart';
import 'widgets/login_form.dart';
import 'widgets/user_agreement.dart';/// 登录页面组件。
class LoginPage extends StatefulWidget {@override_LoginPageState createState() => _LoginPageState();
}

实现“运营位”的UI很简单,因为在《Flutter布局锦囊—轮播图片与滑块》中,已经完成了具体的实现,你只需要调用CarouselWithIndicator组件就可以了。

/// 与登录页面组件关联的状态子类。
class _LoginPageState extends State<LoginPage> {@overrideWidget build(BuildContext context) {// TODO: 第4步:实现“用户协议”,实现“相对下方”布局。// 脚手架(`Scaffold`)组件,实现基本Material设计视觉布局结构。return Scaffold(body: SafeArea(child: ListView(children: <Widget>[CarouselWithIndicator(),// TODO: 第3步:实现“登录表单”。// TODO: 第4步:实现“用户协议”。],),),);}
}

第3步:实现“登录表单”

同上,实现“登录表单”也只需要调用LoginForm组件即可,具体实现在《Flutter布局锦囊—蜡笔画的表单》中。

            // TODO: 第3步:实现“登录表单”。LoginForm(),

第4步:实现“用户协议”

实现“用户协议”的时候比较困难,因为你需要相对于屏幕下方来放置组件。笔者没有在Flutter文档中找到能同时实现灵活布局和相对屏幕下方布局的方法,只能采取非常土的方法,先计算出屏幕上剩余的空间。

    // TODO: 第4步:实现“用户协议”,实现“相对下方”布局。/// 屏幕下方的剩余高度。double screenHeight;// 媒体查询(`MediaQuery`)类,建立媒体查询解析给定数据的子树,返回媒体查询数据(`MediaQueryData`)类。// 媒体查询数据(`MediaQueryData`)类的方向(`orientation`)属性,媒体的方向,即设备是处于横向还是纵向模式。if (MediaQuery.of(context).orientation == Orientation.portrait) {// 媒体查询数据(`MediaQueryData`)类的大小(`size`)属性,逻辑像素中的媒体大小,即屏幕的大小。// 媒体查询数据(`MediaQueryData`)类的填充(`padding`)属性,应用程序可以呈现的显示矩形每一侧的物理像素数。// 填充(`padding`)属性的顶部(`top`)值是状态栏高度,底部(`bottom`)值是系统操作栏高度。screenHeight = MediaQuery.of(context).size.height - MediaQuery.of(context).padding.top -MediaQuery.of(context).padding.bottom - 536;} else {// 横屏时的高度,用于避免因为切换横竖屏导致的异常显示。screenHeight = 82.0;}

然后用大小框(SizedBox)组件来占据屏幕剩余的空间,再通过垂直(Column)组件的主轴对齐(mainAxisAlignment)属性把UserAgreement组件布局于屏幕下方。

            // TODO: 第4步:实现“用户协议”。// 通过大小框(`SizedBox`)组件来利用屏幕剩余的空间,实现从屏幕下方布局。SizedBox(height: screenHeight,child: Align(alignment: Alignment.bottomCenter,child: Column(// 垂直(`Column`)组件的主轴对齐(`mainAxisAlignment`)属性,如何将子组件放在主轴上。mainAxisAlignment : MainAxisAlignment.end,children: <Widget>[UserAgreement(),SizedBox(height: 20.0),],),),),

第5步:还原效果

Flutter布局锦囊---手机号登录页相关推荐

  1. Flutter布局锦囊---绑定手机页

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "顶部导航栏",标题+取消按钮+跳过按钮的应用栏. "手机号输入框",用于获取手机号码的圆角边框输入字 ...

  2. Flutter布局锦囊---完善信息页

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "用户昵称输入",获取用户输入的昵称信息. "用户头像选取",获取用户选取作为头像的图片. " ...

  3. Flutter布局锦囊---蜡笔画的表单

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "手机号输入框",使用自定义的登录表单字段组件实现的输入框. "验证码输入框",使用自定义的登录表单验 ...

  4. Flutter布局锦囊---带彩条的文本字段

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "文本输入框",使用文本字段(TextField)组件实现的输入框. "状态指示条",使用容器(Con ...

  5. Flutter布局锦囊---带输入字段的应用栏

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "堆栈容器",使用大小框(SizedBox)和堆栈(Stack)组件搞的容器,用于实现层次结构. "下层的导航& ...

  6. Flutter布局锦囊---涂鸦风格按钮

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "可点击框",使用堆栈(Stack)组件布局的可点击区域. "底部矩形",用来衬托"主要矩形 ...

  7. Flutter布局锦囊---轮播图片与滑块

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "运营位",可以通过左右滑动来切换图片. "进度条",显示"运营位"当前位置的进度 ...

  8. Flutter布局锦囊---圆框的表单字段

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "黑色圆角边框",因为文本字段(TextField)组件的没有符合需求的样式,所以要自己做一个边框. "文本输入 ...

  9. Flutter布局锦囊---男女性别单选

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "点击操作",感应用户选择性别的区域. "选择性别男",性别男的选择区域,点击会更新图片和样式. &q ...

最新文章

  1. LCA 朴素算法+树差分倍增+Tarjan算法 三种算法实现c++代码实现
  2. 关于SAP Spartacus添加缺失的cost center route配置的必要性
  3. MySQL触发器(转载)
  4. 数据库时区那些事儿 - MySQL的时区处理
  5. 实现高性能稳定的socket tcp通讯经验分享
  6. Python学习笔记-2017.8.08
  7. 苹果上新了!新款iPad Pro发布:妙控键盘成最大惊喜
  8. 2020【第十一届蓝桥杯省赛】 C/C++ B组 (第一场)
  9. recovery mode
  10. nx.adjacency_matrix计算邻接矩阵与真实结果不一致:解决办法记录
  11. SSL证书配置(https访问接口, 单向认证和双向认证)
  12. ’Hive快速入门课程视频【菜鸟窝出品】
  13. 正确思维,和非理性自我斗争
  14. Ctrl组合快捷键大全
  15. quicktime 的历史
  16. 基于S3C2440的Linux-3.6.6移植——声卡驱动
  17. jQuery点击查看更多,列表陆续显示
  18. pycharm/python报错:Traceback (most recent call last): .....
  19. TIA博途Wincc Advanced下载项目的具体方法演示(V16版本)
  20. 学“大神”炒币月收益300%?大神在背后偷偷举起了镰刀……

热门文章

  1. 【bzoj5018】[Snoi2017]英雄联盟
  2. 多学科优化MDO(任鸿频小结)
  3. 计算机代码 w6,蓝魔w6hd的参数介绍和刷机教程详解【图解】
  4. 苹果电脑电池的维护和保养(适用Macbook和Macbook Pro)
  5. matlab dct反变换,MATLAB中 DCT变换、DCT反变换、分块DCT变换
  6. 微信小程序头像上传(二---完结)
  7. android 显示附近蓝牙,Android 基础-搜索附近蓝牙
  8. 借条的诉讼时效是如何规定的
  9. linux无网下安装anaconda,使用anaconda安装pytorch
  10. 小虎卫app远程控制无人值守手机