iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Flutter 开发一个登录页面
  • 879
分享到

Flutter 开发一个登录页面

2024-04-02 19:04:59 879人浏览 泡泡鱼
摘要

目录业务逻辑图片圆形裁剪圆形扁平按钮TextField 文本框完整代码页面跳转总结业务逻辑 为了演示登录跳转,在分类浏览先做了一个简单的按钮,点击跳转到登录页面。实际的 App 中

业务逻辑

为了演示登录跳转,在分类浏览先做了一个简单的按钮,点击跳转到登录页面。实际的 App 中,通常会是触发某些需要登录才能查看的操作后再跳转到登录界面。

布局分析

界面如上图所示,从界面上看,整体内容区域是居中的,内容的布局是一个简单的列式布局,包括了顶部的一个 LoGo(通常是 App图标),再往下是两个文本输入框,最后是登录按钮。整体布局比较简单,使用 Center 下嵌一个Column 进行列布局即可。

图片圆形裁剪

Flutter 中实行图片圆形裁剪有两个方式,一是使用外层的容器,通过将正方形的按圆形裁剪即可;二是使用内置的 CircleAvatar。不过从名字上看 CircleAvatar 用于头像的,因此这里使用容器的来实现圆形裁剪。封装一个获取圆形图片的方法_getRoundImage,传入图片资源名称和正方形边长,代码如下所示:


Widget _getRoundImage(String imageName, double size) {
    return Container(
      width: size,
      height: size,
      clipBehavior: Clip.antiAlias,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.all(Radius.circular(size / 2)),
      ),
      child: Image.asset(
        imageName,
        fit: BoxFit.fitWidth,
      ),
    );
  }

这里使用了 BoxDecoration 将边框设置为圆形的边框,半径为边长的一半,这样就达到边框是圆形的效果了。但是,需要额外设置一个属性就是 clipBehavior,这是边缘裁剪类型,默认是不裁剪的。这里使用了 Clip.antiAlias(抗锯齿)的方式进行裁剪,这种方式的裁剪效果最好,但是更耗资源,其他的裁剪方式如下:

  • Clip.hardEdge:从名字就知道,这种方式很粗糙,但是裁剪的效率最快;
  • Clip.antiAliasSaveLayer:最为精细的裁剪,但是非常慢,不建议使用;
  • Clip.none:默认值,如果内容区没有超出容器边界的话,不会做任何裁剪。内容超出边界的话需要使用别的裁剪方式防止内容溢出。

圆形扁平按钮

这里需要提一下, Flutter 2.0以前的扁平按钮是FlatButton,使用起来很简单,但是很多场合不太满足,因此2.0以后引入了 TextButton 替代。TextButton 多了一个 style来装饰按钮样式。具体可以看官方的文档。这里我们的按钮需要设置背景色为主题色,然后按钮文字颜色为白色,同时需要切成圆角,因此还是使用 Container 的边界圆弧来实现。需要注意的是,默认按钮的宽度是根据内容来的,因此为了让按钮撑满屏幕,我们设置了 Container 的宽度为 double.infinity。代码如下所示:


Widget _getLoginButton() {
    return Container(
      height: 50,
      width: double.infinity,
      margin: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: Theme.of(context).primaryColor,
        borderRadius: BorderRadius.circular(4.0),
      ),
      child: TextButton(
        style: ButtonStyle(
          foregroundColor: MaterialStateProperty.all<Color>(Colors.white),
          backgroundColor:
              MaterialStateProperty.all<Color>(Theme.of(context).primaryColor),
        ),
        child: Text(
          '登录',
        ),
        onPressed: () {
          print(
              'Login: username=${_username.trim()}, passWord=${_password.trim()}');
        },
      ),
    );
  }

按钮点击回调事件为 onPressed,这里只是简单地打印了表单的内容。

TextField 文本框

TextField 是 Flutter 提供的文本输入框,TextField 的属性非常多,常用的属性如下:

  • keyboardType:键盘类型,可以指定是数字、字母、电话号码、邮箱、日期等多种方式,通过与表单内容匹配的键盘类型可以提供输入效率,进而改善用户体验。
  • controller:TextEditinGController 对象,TextEditingController 主要用于控制文本框的初始值,清除内容的操作。
  • obscureText:是否需要隐藏输入内容,如果为 true,则输入内容会使用圆点显示,通常用与密码。
  • decoration:文本框的装饰,属性也很多,可以指定前置图标,边框类型、后置组件等多种属性,因此可以通过 decoration 获得想要的文本框样式。
  • focusnode:聚焦点,可以通过这个来控制文本框是否获取焦点,从而实现类似上一个下一个的输入控制。
  • onChanged:输入值改变事件回调,通常用这个方法实现双向绑定。

在这个案例中,我们使用了一个前置图标用来表示输入内容的类型,比如使用手机图标代表输入手机号,使用代表代表密码。同时使用了一个 Offstage作为后置的组件,用于在输入内容后可以点击清除内容。Offstage 组件是通过一个属性offstage来控制组件是否显示,这样我们可以在没有内容的时候隐藏它,有输入内容的时候再显示。

为了提高代码复用性,使用了一个方法获取通用的文本框,这里主要是使用了 Container包裹以控制边距和文本框下的分隔线:


Widget _getInputTextField(
    TextInputType keyboardType, {
    FocusNode focusNode,
    controller: TextEditingController,
    onChanged: Function,
    InputDecoration decoration,
    bool obscureText = false,
    height = 50.0,
  }) {
    return Container(
      height: height,
      margin: EdgeInsets.all(10.0),
      child: Column(
        children: [
          TextField(
            keyboardType: keyboardType,
            focusNode: focusNode,
            obscureText: obscureText,
            controller: controller,
            decoration: decoration,
            onChanged: onChanged,
          ),
          Divider(
            height: 1.0,
            color: Colors.grey[400],
          ),
        ],
      ),
    );
  }

完整代码


class _LoginPageState extends State<LoginPage> {
  //TextEditingController可以使用 text 属性指定初始值
  TextEditingController _usernameController = TextEditingController();
  TextEditingController _passwordController = TextEditingController();
  String _username = '', _password = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('登录'),
        brightness: Brightness.dark,
      ),
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _getRoundImage('images/logo.png', 100.0),
            SizedBox(
              height: 60,
            ),
            _getUsernameInput(),
            _getPasswordInput(),
            SizedBox(
              height: 10,
            ),
            _getLoginButton(),
          ],
        ),
      ),
    );
  }

  Widget _getUsernameInput() {
    return _getInputTextField(
      TextInputType.number,
      controller: _usernameController,
      decoration: InputDecoration(
        hintText: "输入手机号",
        icon: Icon(
          Icons.mobile_friendly_rounded,
          size: 20.0,
        ),
        border: InputBorder.none,
        //使用 GestureDetector 实现手势识别
        suffixIcon: GestureDetector(
          child: Offstage(
            child: Icon(Icons.clear),
            offstage: _username == '',
          ),
          //点击清除文本框内容
          onTap: () {
            this.setState(() {
              _username = '';
              _usernameController.clear();
            });
          },
        ),
      ),
      //使用 onChanged 完成双向绑定
      onChanged: (value) {
        this.setState(() {
          _username = value;
        });
      },
    );
  }

  Widget _getPasswordInput() {
    return _getInputTextField(
      TextInputType.text,
      obscureText: true,
      controller: _passwordController,
      decoration: InputDecoration(
        hintText: "输入密码",
        icon: Icon(
          Icons.lock_open,
          size: 20.0,
        ),
        suffixIcon: GestureDetector(
          child: Offstage(
            child: Icon(Icons.clear),
            offstage: _password == '',
          ),
          onTap: () {
            this.setState(() {
              _password = '';
              _passwordController.clear();
            });
          },
        ),
        border: InputBorder.none,
      ),
      onChanged: (value) {
        this.setState(() {
          _password = value;
        });
      },
    );
  }

  //省略了上述列举的代码

}

页面跳转

在上层面的登录按钮上,我们增加了一个点击事件,点击后再跳到登录页,按钮的响应代码如下所示。这是页面跳转的最简单的方式,使用 Navigator 导航器的 push方法实现页面跳转,后续会介绍如何通过路由实现页面跳转,那种方式更为优雅。


//...
onPressed: () {
  Navigator.of(context).push(
    MaterialPageRoute(builder: (context) => LoginPage()),
  );
},
//...

总结

从代码上看,功能虽然实现了,但是构建用户名和密码的代码十分相似,有没有办法进一步提高代码复用率,构建一个更为通用的表单组件呢?下篇我们将介绍如何来封装。

以上就是Flutter 开发一个登录页面的详细内容,更多关于Flutter 开发登录页面的资料请关注编程网其它相关文章!

--结束END--

本文标题: Flutter 开发一个登录页面

本文链接: https://www.lsjlt.com/news/127633.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flutter 开发一个登录页面
    目录业务逻辑图片圆形裁剪圆形扁平按钮TextField 文本框完整代码页面跳转总结业务逻辑 为了演示登录跳转,在分类浏览先做了一个简单的按钮,点击跳转到登录页面。实际的 App 中...
    99+
    2024-04-02
  • HTML、PHP实战:搭建一个网页登录页面。
    一、实验环境。 MySQL5.7.26 FTP0.9.60 Apache2.4.39 我这里用的是PHPstudy小皮一键搭建的。 数据库  二、登录页面。 登录页面前端代码 文件名:denglu.html '登录界面'用户名:密码: 登...
    99+
    2023-08-31
    php html apache 前端 数据库
  • 利用SpringBoot创建一个JSP登录页面
    这篇文章给大家介绍利用SpringBoot创建一个JSP登录页面,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。添加JSP配置pom.xml添加jsp解析引擎<dependency> <groupId...
    99+
    2023-05-31
    springboot jsp
  • Flutter 构建一个常用的页面框架
    目录图标准备BottomNavigationBar 简介构建项目页面结构简化入口代码复用 最终实现的结果如上图所示,顶部共用一个导航栏,底部有四个图标导航,点击对应的图标跳转到对应的...
    99+
    2024-04-02
  • 记录一次WIN11开机在登录页面循环的问题
    记录一次由于未进行win密码设置,导致开机后卡在登录界面无法登录进去的问题。最后完美解决了。 1. 背景 开机后,显示用户登录界面,但是和以往不同,没有了密码输入框,只有一个“登录”按钮孤零零地显示在屏幕中间,点击后也没有任何反应。 ...
    99+
    2023-08-21
    linux 服务器 macos
  • 怎么在SpringBoot利用Mybatis实现一个登录注册页面
    怎么在SpringBoot利用Mybatis实现一个登录注册页面?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。环境jdk8 : “1.8.0_281”Maven...
    99+
    2023-06-06
  • 利用django和mysql实现一个简单的web登录页面
    目录前言:一、使用pyacharm创建一个django项目二、启动django项目验证三、配置mysql数据库1、本地安装mysql数据库1)安装mysql数据库2)自己创建一个数据...
    99+
    2023-05-20
    django+mysql django实现登录功能 django实现web登录页面
  • vue实现登陆页面开发实践
    目录一、input的校验没有可说的,记住俩点,一个控制输入长度,一个控制格式。二、验证码逻辑:组件使用的是vant ui,具体用法可去官网看。 分几个部分考虑, 一、输入框input...
    99+
    2024-04-02
  • 基于Golang开发一个轻量级登录库/框架
    目录1.Enforcer2.Config3.Adapter4.Context5.Watcher6.Logger几乎每个项目都会有登录,退出等用户功能,而登录又不单仅仅是登录,我们要考...
    99+
    2023-05-19
    Golang开发登录库 Golang开发登录框架 Golang 登录
  • JavaWeb登录界面登录失败在同一页面进行提示的解决
    目录JavaWeb登录界面登录失败在同一页面进行提示方法JavaWeb项目登录注册失败错误提示问题JavaWeb登录界面登录失败在同一页面进行提示 方法 使用JSP 通过提交表单方式...
    99+
    2022-11-21
    JavaWeb登录界面 JavaWeb登录失败 登录界面登录失败
  • flutter开发技巧自定页面指示器PageIndicator详解
    目录一、来源二、效果三、源码实现1、flutter_swiper_null_safety 使用示例:2、PageIndicatorWidget 指示器源码:三、总结一、来源 项目中...
    99+
    2023-01-15
    flutter PageIndicator flutter自定页面指示器
  • 怎么用android做一个登录界面
    要使用Android创建一个登录界面,你需要以下步骤:1. 创建一个新的Android项目。在Android Studio中,选择“...
    99+
    2023-09-14
    android
  • Flask+Pycharm(专业版)+mysql编写一个简单登录注册页面
    1.首先,看一下项目的存放和数据库中的表 1.1 存放 1.2 数据库 博主建立了一个名为cat1的数据库,表名为students students中的具体内容如下:      2.下面是所有的源代码 model文件夹下的login...
    99+
    2023-10-27
    flask python 后端 mysql
  • 个人html空间登录页面怎么制作
    要制作个人html空间登录页面,可以按照以下步骤操作:1. 新建一个HTML文件,命名为“login.html”。2. 在文件中添加...
    99+
    2023-06-08
    html空间 空间
  • 小程序登录界面怎么开发
    这篇“小程序登录界面怎么开发”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“小程序登录界面怎么开发”文章吧。  小程序登录界面...
    99+
    2023-06-26
  • 平台开发开发一个全面的视角
    随着科技的不断发展,平台开发已经成为了现代社会中不可或缺的一部分。平台开发开发涉及到很多方面,包括技术、设计、市场营销等等。本文将从一个全面的视角来探讨平台开发开发。 一、平台开发开发的基本定义平台开发开发是指为特定目的而创建的软件系统,通...
    99+
    2023-11-23
    视角 平台
  • 五个基于JS实现的炫酷登录页面
    目录1、炫酷星空登录2、动态云层登录3、深海灯光水母登录4、炫酷蛛网登录5、彩色气泡登录1、炫酷星空登录 实现代码 <!DOCTYPE HTML> <html&g...
    99+
    2024-04-02
  • amazeui页面分析之怎么实现登录页面
    小编给大家分享一下amazeui页面分析之怎么实现登录页面,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、总结tpl命名空间:tpl命名空间的样式都是从app....
    99+
    2023-06-09
  • 亚马逊云服务器登录页面打不开
    检查您的浏览器是否正确设置,确保您使用了正确的浏览器版本和兼容性设置。 检查您的防火墙设置是否允许通过亚马逊云服务器连接到互联网。 确保您的云服务器上的网络连接正常,特别是防火墙和其他安全软件阻止连接的情况下。 检查您的云服务器是否处于运...
    99+
    2023-10-27
    亚马逊 打不开 页面
  • win7开机不显示登录页面怎么设置
    如果Win7开机时不显示登录页面,可以按照以下步骤进行设置:1. 打开“控制面板”,选择“用户账户”。2. 在用户账户页面,点击“更...
    99+
    2023-08-21
    win7
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作