IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter开发之——getX-用户登陆示例(06) -> 正文阅读

[移动开发]Flutter开发之——getX-用户登陆示例(06)

一 用户登陆界面展示

没有勾选同意用户名错误密码错误成功去登陆

二 项目结构说明

2.1 项目由来

  • 最近学习了getX的相关知识点,getX可以简化项目书写和项目解藕(逻辑和界面展示分离)
  • 看到CSDN-Flutter-登录界面实战,作为getX练手

2.2 项目结构

说明:

  • Login:登陆界面,只负责与用户交互的界面内容展示
  • LoginController:逻辑控制文件,负责处理,登陆按钮点击和隐私协议勾选

三 项目示例说明

3.1 LoginController(逻辑文件)

class LoginController extends GetxController {
  //登陆按钮点击事件
  login(TextEditingController userNameController, TextEditingController passWordController) {
    var userName = userNameController.text;
    var passWord = passWordController.text;

    //1-用户协议是否勾选
    if(!isChecked.value){
      Get.snackbar('用户协议未选中', '请勾选用户协议',snackPosition: SnackPosition.BOTTOM);
      return;
    }
    //2-用户名判断
    if(userName.isEmpty){
      Get.snackbar('用户名异常', '用户名为空',snackPosition: SnackPosition.BOTTOM);
      return;
    }
    //3-密码判断
    if(passWord.isEmpty){
      Get.snackbar('密码异常', '密码为空',snackPosition: SnackPosition.BOTTOM);
      return;
    }
    Get.snackbar('用户名、密码正确', '去登陆',snackPosition: SnackPosition.BOTTOM);
    print("用户名:$userName,密码:$passWord");
  }

  //用户协议勾选事件
  var isChecked = false.obs;

  void changeChecked(bool value) {
    isChecked.value = value;
  }
}

说明(LoginController包含两个方法调用和一个属性变量):

  • login方法:处理登陆按钮事件,分别对用户协议勾选、用户名、密码进行判断及处理
  • changeChecked方法:用户协议勾选事件
  • isChecked:保存用户协议勾选结果,并在界面中通过Obx(()=>Checkbox(value: controller.isChecked.value显示

3.2 Login登陆界面

void main() => runApp(GetMaterialApp(home: Login()));

late LoginController controller = Get.put(LoginController());

//登陆界面
class Login extends StatelessWidget {
  var userNameController = TextEditingController();
  var passWordController = TextEditingController();

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text('登陆'),
      ),
      body: Padding(
        padding: EdgeInsets.symmetric(horizontal: 16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const SizedBox(height: 80),  //距离顶部距离
            buildTopWidget(), //设置登陆欢迎
            const SizedBox(height: 20), //距离上一个View距离
            buildAccountInputWidget(userNameController), //用户名
            const SizedBox(height: 20),//距离上一个View距离
            buildPasswordInputWidget(passWordController), //密码
            const SizedBox(height: 10,),//距离上一个View距离
            buildPrivacyWidget(), //隐私政策
            const SizedBox(height: 10,),//距离上一个View距离
            buildLoginButton(), //登陆按钮
          ],
        ),
      ),
    );
  }

//Widget-Top
  Widget buildTopWidget() {
    return const Text(
      "你好,欢迎登陆",
      style: TextStyle(fontSize: 28, fontWeight: FontWeight.w800),
    );
  }

//手机号
  Widget buildAccountInputWidget(TextEditingController? userNameController) {
    return TextField(
      controller: userNameController,
      decoration: InputDecoration(labelText: "用户名"),
      style: TextStyle(fontSize: 16),
      keyboardType: TextInputType.phone,
    );
  }

//密码
  Widget buildPasswordInputWidget(TextEditingController? passWordController) {
    return TextField(
      controller: passWordController,
      obscureText: true,
      decoration: InputDecoration(labelText: "用户密码"),
      style: TextStyle(fontSize: 16),
    );
  }
//登陆按钮
  Widget buildLoginButton() {
    return SizedBox(
      child: RaisedButton(
        child: new Text("登录"),
        color: Colors.blue,
        textColor: Colors.white,
        onPressed: ()=>controller.login(userNameController, passWordController),
        disabledColor: Colors.grey,
        disabledTextColor: Colors.white,
        disabledElevation: 4,
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)), //圆角大小
      ),
      width: double.infinity,
    );
  }
  //隐私协议
  Widget buildPrivacyWidget() {
    return Row(
      children: [
        Obx(()=>Checkbox(value: controller.isChecked.value, onChanged: (value) =>controller.changeChecked(value!))),
        Text('同意', style: TextStyle(fontSize: 14)),
        Text('<服务协议>', style: TextStyle(fontSize: 14, color: Colors.blue)),
        Text('<隐私政策>', style: TextStyle(fontSize: 14, color: Colors.blue))
      ],
    );
  }
}

说明:

  • 通过Get.put(LoginController())获取LoginController
  • Widget之间的间距通过SizedBox设置
  • 登陆界面中的每个Widget,单独剥离出来进行设置
  • 登陆按钮和用户协议的勾选事件调用,通过LoginController来完成

四 参考

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 11:10:03  更:2022-05-06 11:10:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 22:57:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码