Flutter仿Boss-3.登录页

效果

介绍

在Flutter应用程序中创建登录页面对于用户认证和参与至关重要。登录页面作为用户访问应用程序功能的入口。它应该提供无缝的体验,同时确保安全和隐私。这里仿Boss应用设计的登录页面,我们将创建一个登录页面,允许用户使用手机号码登录或注册。

小插曲

首先,让我们设置Flutter项目并创建一个登录页面组件。我们将使用GetX进行状态管理和UI更新。确保您在开发环境中安装了Flutter和GetX。

实现

1. 依赖项

确保您在pubspec.yaml文件中具有必要的依赖项:

dependencies:
  flutter:
    sdk: flutter
  get: ^4.6.2
2. 登录页小部件

创建一个名为login_page.dart的新文件,并定义LoginPage小部件。此小部件将包含登录页面的UI元素:

// login_page.dart
class LoginPage extends StatelessWidget {
  const LoginPage({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    final logic = Get.find<LoginLogic>();
    return Scaffold(
      body: Container(
        padding: EdgeInsets.fromLTRB(24.w, 60.w, 24.w, 24.w),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              "手机号登录/注册",
              style: TextStyle(
                fontWeight: FontWeight.w500,
                fontSize: 30.sp,
                color: RC.text1Color,
              ),
            ),
            SizedBox(height: 6.w),
            Text(
              "首次验证通过即注册BOSS直聘账号",
              style: TextStyle(
                fontWeight: FontWeight.w500,
                fontSize: 14.sp,
                color: RC.text2Color,
              ),
            ),
            SizedBox(height: 10.w),
            Row(
              children: [
                Text(
                  "+86",
                  style: TextStyle(
                    fontSize: 16.sp,
                    color: Colors.black,
                  ),
                ),
                Icon(
                  Icons.keyboard_arrow_down,
                  size: 25.w,
                  color: Colors.black.withAlpha(70),
                ),
                Expanded(
                  child: TextField(
                    controller: logic.controller,
                    keyboardType: TextInputType.phone,
                    inputFormatters: [
                      FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
                    ],
                    style: TextStyle(color: Colors.black, fontSize: 18.sp),
                    onChanged: (value) {
                      logic.state.phoneNum.value = value;
                    },
                    decoration: InputDecoration(
                      hintText: '请输入您的手机号码',
                      // 设置 hintText
                      hintStyle: TextStyle(color: Colors.grey, fontSize: 18.sp),
                      // 设置 hintText 的颜色
                      border: InputBorder.none,
                      // 取消底部下划线
                      enabledBorder: const OutlineInputBorder(
                        borderSide: BorderSide(
                            color: Colors.transparent), // 取消输入框选中时的边框颜色
                      ),
                      focusedBorder: const OutlineInputBorder(
                        borderSide: BorderSide(
                            color: Colors.transparent), // 取消输入框获取焦点时的边框颜色
                      ),
                    ),
                  ),
                ),
              ],
            ),
            Divider(
              height: 1.w,
              color: Colors.grey,
            ),
            SizedBox(height: 16.w),
            Obx(
              () => InkWell(
                onTap: () {
                  logic.state.isAgree.value = !logic.state.isAgree.value;
                },
                child: Row(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Padding(
                      padding: const EdgeInsets.only(top: 5),
                      child: Icon(
                        logic.state.isAgree.value
                            ? Icons.check_circle
                            : Icons.circle_outlined,
                        size: 18.r,
                        color: logic.state.isAgree.value
                            ? RC.themeColor
                            : Colors.grey,
                      ),
                    ),
                    SizedBox(width: 5.w),
                    Expanded(
                      child:
                      RichText(
                        text: TextSpan(
                          text: '已阅读并同意',
                          style: const TextStyle(
                              color: Colors.black, fontSize: 16),
                          children: [
                            TextSpan(
                              text: '《BOSS直聘用户协议》',
                              style: const TextStyle(color: RC.themeColor),
                              recognizer: TapGestureRecognizer()
                                ..onTap = () {
                                  ToastUtil.show(msg: "跳转到BOSS直聘用户协议");
                                },
                            ),
                            const TextSpan(
                              text: ' 和 ',
                              style:
                                  TextStyle(color: Colors.black, fontSize: 16),
                            ),
                            TextSpan(
                              text: '《隐私政策》',
                              style: const TextStyle(color: RC.themeColor),
                              recognizer: TapGestureRecognizer()
                                ..onTap = () {
                                  ToastUtil.show(msg: "跳转到隐私政策");
                                },
                            ),
                            const TextSpan(
                              text: ',允许BOSS直聘统一管理本人账号信息',
                              style:
                                  TextStyle(color: Colors.black, fontSize: 16),
                            ),
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
            Obx(
              () => InkWell(
                onTap: () {
                  logic.next(context);
                },
                child: Container(
                  height: 50.w,
                  alignment: Alignment.center,
                  margin: EdgeInsets.only(top: 20.w, bottom: 30.w),
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.all(Radius.circular(8.r)),
                      color: logic.state.phoneNum.isNotEmpty
                          ? RC.themeColor
                          : RC.themeColor.withAlpha(50)),
                  child: Text(
                    "下一步",
                    style: TextStyle(
                      fontSize: 20.sp,
                      fontWeight: FontWeight.w600,
                      color: Colors.white,
                    ),
                  ),
                ),
              ),
            ),
            Text(
              "接受不到短信",
              style: TextStyle(
                fontSize: 14.sp,
                color: Colors.grey,
              ),
            ),
            Expanded(
              child: Align(
                alignment: Alignment.bottomCenter,
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  mainAxisAlignment: MainAxisAlignment.end,
                  children: [
                    Text(
                      "或通过以下方式登录",
                      style: TextStyle(
                        fontSize: 14.sp,
                        color: Colors.grey,
                      ),
                    ),
                    SizedBox(height: 20.w),
                    InkWell(
                      onTap: () {
                        logic.wxLogin();
                      },
                      child: Image.asset(
                        R.login_wx_png,
                        width: 50.w,
                        height: 50.w,
                      ),
                    ),
                    SizedBox(height: 35.w),
                    Text(
                      "服务热线 举报监督电话 资质证照",
                      style: TextStyle(
                        fontSize: 14.sp,
                        color: Colors.grey,
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
3. 登录页逻辑

为登录页面创建一个逻辑类,用于处理业务逻辑和状态管理。定义处理用户输入和交互的方法:

// logic.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'util/toast_util.dart';

class LoginLogic extends GetxController {
  final LoginState state = LoginState();
  final TextEditingController controller = TextEditingController();

  void wxLogin() {
    ToastUtil.show(msg: '微信登录');
  }

  void next(BuildContext context) {
    if (!state.isAgree.value) {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: RichText(
              text: TextSpan(
                text: '请阅读并同意',
                style: const TextStyle(color: Colors.black, fontSize: 16),
                children: [
                  TextSpan(
                    text: '《BOSS直聘用户协议》',
                    style: const TextStyle(color: RC.themeColor),
                    recognizer: TapGestureRecognizer()
                      ..onTap = () {
                        ToastUtil.show(msg: "跳转到BOSS直聘用户协议");
                      },
                  ),
                  const TextSpan(
                    text: ' 和 ',
                    style: TextStyle(color: Colors.black, fontSize: 16),
                  ),
                  TextSpan(
                    text: '《隐私政策》',
                    style: const TextStyle(color: RC.themeColor),
                    recognizer: TapGestureRecognizer()
                      ..onTap = () {
                        ToastUtil.show(msg: "跳转到隐私政策");
                      },
                  ),
                  const TextSpan(
                    text: ',允许BOSS直聘统一管理本人账号信息',
                    style: TextStyle(color: Colors.black, fontSize: 16),
                  ),
                ],
              ),
            ),
            actions: <Widget>[
              TextButton(
                onPressed: () {
                  Navigator.of(context).pop();
                },
                child: const Text(
                  '拒绝',
                  style: TextStyle(
                    fontSize: 16,
                    color: RC.themeColor,
                  ),
                ),
              ),
              TextButton(
                onPressed: () {
                  state.isAgree.value = true;
                  Navigator.of(context).pop();
                },
                child: const Text(
                  '同意',
                  style: TextStyle(
                    fontSize: 16,
                    color: RC.themeColor,
                  ),
                ),
              ),
            ],
          );
        },
      );
      return;
    }
    ToastUtil.show(msg: '下一步');
  }
}

class LoginState {
  RxString phoneNum = "".obs;
  RxBool isAgree = false.obs;
}
4. 主程序入口

在您的主文件中,将登录页面添加到应用程序的路由中:

// main.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'login_page.dart';
import 'logic.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: LoginPage(),
      initialBinding: BindingsBuilder(() {
        Get.lazyPut<LoginLogic>(() => LoginLogic());
      }),
    );
  }
}

结论

通过以上步骤,我们已经完成了Boss登录页面的UI效果。
详情可见:https://github.com/yixiaolunhui/flutter_project

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/511091.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意

Photoshop 2024是一款功能强大的图像处理软件&#xff0c;以其卓越的性能和广泛的应用领域&#xff0c;赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具&#xff0c;让用户能够轻松进行图片编辑、合成、校色、抠图等操作&#xff0c;实…

网站官网-首页源码html+css+js

网页设计与网站建设作业htmlcssjs 预览 说明 单页面&#xff0c;轮播图 获取&#xff1a;https://hpc.baicaitang.cn/2080.html

部署项目遇到的各种问题总结

文章目录 前言一、后端问题 jar包运行出现错误宝塔面板使用jdk17二、数据库问题 版本问题三、前端问题 连不上后端总结 前言 在做完项目之后&#xff0c;为了让别人访问到自己的网站&#xff0c;就需要部署前端后端以及数据库&#xff0c;但是在部署的过程中出现了各种问题和困…

Vue-Next-Admin:适配手机、平板、PC的开源后台管理模板

摘要&#xff1a;随着移动设备和PC的普及&#xff0c;为了满足不同设备的需求&#xff0c;开发一个能够自适应手机、平板和PC的后台管理系统变得至关重要。本文将介绍一个基于Vue3.x、Typescript、Vite、Element Plus等技术的开源模板库——Vue-Next-Admin&#xff0c;帮助开发…

界面组件DevExpress WinForms v23.2 - 进一步增强HTML CSS支持

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

CMakeLists.txt编写简单介绍:CMakeLists.txt同时编译.cpp和.cu

关于CMakeLists.txt的相关介绍,这里不赘诉,本人的出发点是借助于CMakeLists.txt掌握基本的C++构建项目流程,下面是本人根据网络资料以及个人实践掌握的资料。 CMakeList.txt构建C++项目 下图是一个使用CUDA实现hello world的项目,一般来说,一个标准的C++项目包括三个文件…

VScode debug python(服务器)

方法一&#xff1a; 创建launch.json文件&#xff1a; launch.json文件地址&#xff1a; launch.json文件内容&#xff1a; {"version": "0.2.0", //指定了配置文件的版本"configurations": [{"name": "Python: Current File&…

使用tcpdump和wireshark进行服务器抓包分析

目录 前言 1.tcpdump简介 2.Wireshark简介 3.实际案例 4.代码示例 5.总结 前言 服务器抓包分析是一种非常常见和有效的网络故障排查和性能优化手段。通过捕获服务器上的网络流量&#xff0c;可以帮助我们深入了解服务器与其它设备之间的通信情况&#xff0c;发现问题并进…

探索Flutter混淆在提高应用安全性方面的作用

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

AWS入门实践-S3对象存储的基本用法

AWS S3(Simple Storage Service)是亚马逊云服务提供的一种高度可扩展、安全且经济高效的对象存储服务。它允许用户在任何位置存储和检索任意数量的数据,非常适合存储和分发静态文件、备份数据以及作为数据湖的存储层。 一、S3上传和下载文件&#xff08;AWS门户&#xff09; …

【zlm】音视频流与音频流合并的设计

目录 设想一 设想二 方案三 关键技术 测试语句 测试脚本 参考文档 设想一 //开始录制_option.mp4_save_path custom_path;_option.mp4_max_second max_second;vector<Track::Ptr> mytracks getTracks();auto src MediaSource::find( DEFAULT_VHOST, "1&quo…

RN实现全局数据共享(非Redux,使用原生内置的方法实现)

下面这个方法是在RN使用全局数据共享的,使用原生React的方式搞得,相对于Redux配置相对简单,适合小型项目 项目内创建MyContext.js // MyContext.jsimport React from react;const MyContext React.createContext();export default MyContext;App.js引入 // App.jsimport Rea…

浏览器工作原理与实践--WebAPI:XMLHttpRequest是怎么实现的

在上一篇文章中我们介绍了setTimeout是如何结合渲染进程的循环系统工作的&#xff0c;那本篇文章我们就继续介绍另外一种类型的WebAPI——XMLHttpRequest。 自从网页中引入了JavaScript&#xff0c;我们就可以操作DOM树中任意一个节点&#xff0c;例如隐藏/显示节点、改变颜色、…

github 仓库 修改开源协议

记录一下如何修改协议。 然后commit到你想要的主干或者分支就可以了。

视频汇聚/安防监控/EasyCVR平台播放器EasyPlayer更新:新增【性能面板】

视频汇聚/安防监控/视频存储平台EasyCVR基于云边端架构&#xff0c;可以在复杂的网络环境中快速、灵活部署&#xff0c;平台视频能力丰富&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云…

什么是Redis共享Session?

如图所示&#xff0c;一个分布式部署的Web服务器将用户的Session信息&#xff08;例如用户登录信息&#xff09;&#xff0c;保存在各自服务器内部。这样会造成一个问题&#xff0c;在分布式部署多个Web服务器时&#xff0c;我们通常会采用负载均衡算法&#xff0c;将多个用户的…

探索设计模式的魅力:AI大模型如何赋能C/S模式,开创服务新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;探索设计模式的魅力&#xff1a;AI大模型…

全能视频下载工具:支持 100+ 网站 | 开源日报 No.212

KurtBestor/Hitomi-Downloader Stars: 18.6k License: NOASSERTION Hitomi-Downloader 是一个桌面实用程序&#xff0c;可以从各种网站下载图片/视频/音乐/文本等。 该项目的主要功能、关键特性和核心优势包括&#xff1a; 简单清晰的用户界面下载加速单个任务支持 24 个线程…

数据库之迁移常规操作(Postgresql篇)

一、docker安装postgresql 1. 拉取postgres docker pull postgres2. 创建容器 注&#xff1a;默认登录账户postgres, 密码123456, 对外暴露端口5432, 卷映射&#xff1a;可在物理机修改数据库配置文件 引用文章查看&#x1f440; docker run --name postgres -e POSTGRES_P…

Linux提权!!!

上一篇文章讲了Windows的提权&#xff0c;那么这篇文章就来讲一下Linux的提权 1.SUID提权 suid权限 作用&#xff1a;让普通用户临时拥有该文件的属主的执行权限&#xff0c;suid权限只能应用在二进制可执行文件&#xff08;命令&#xff09;上&#xff0c;而且suid权限只能设置…