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----登陆页面的简单demon -> 正文阅读

[移动开发]Flutter----登陆页面的简单demon

效果图
在这里插入图片描述
功能
1:输入用户名按下键盘的回车按键,能够根据用户名进行查询对应的仓库,仓库下拉框默认选中第一条记录。
2.当查询到仓库后,光标自动从用户名那边跳转到密码框。
3.点击登陆按钮,判断是否内容都不为空,然后访问服务端验证用户名密码是否正确,正确的情况下查询用户的权限,并且记录用户名和密码。然后跳转到主页。

以下是主要的俩个页面。Global是一个存全局变量的一个类,而Services就是一个统一管网络访问的一个类,主要功能就是访问对应的接口,并返回查询到的数据。数据类型是BaseResult

mian.dart

import 'package:flutter/material.dart';
import 'home.dart';
import 'login.dart';


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

}

class MyApp extends StatelessWidget { //整个APP的设置
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      initialRoute: "login" ,//设置默认的首页面(对本app而言,是登陆页)
      theme: ThemeData(
        primarySwatch: Colors.blue, //设置主题为蓝色
      ),

      //在路由表注册路由,对应的字符对应哪个route
      routes: {"login":(context)=> LoginRoute(),
        "home":(context)=>HomeRoute()
      },
    );
  }
}

login.dart

import 'dart:collection';
import 'package:app_flutter/common/obj_util.dart';
import 'package:app_flutter/models/userinfo.dart';
import 'package:app_flutter/models/warehouse.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'common/global.dart';
import 'common/services.dart';
import 'models/function_obj.dart';

class LoginRoute extends StatefulWidget{
  const LoginRoute({Key? key}) : super(key: key);

  @override
  State<LoginRoute> createState() =>_LoginRouteState();
}

class _LoginRouteState extends State<LoginRoute>{

  //输入框控制器
  late TextEditingController _userController;
  late TextEditingController _passwordController;
  FocusNode _passwordFocusNode=FocusNode();
  String userId="";
  String? dropdownValue=null;
  List<WareHouse>? wareList= <WareHouse>[];
   //根据用户名去获取仓库
  void _getWareHouse(String userId) async {
    //获取查询结果
    var _params=LinkedHashMap<String,dynamic>();
    _params['userId']=userId;
    _params['methodName']='getWareHouse';
    var _result =await Services.getWarehouse(_params);

    if(_result.code==Global.SUCCESS){
      setState(() {
          wareList=_result.data;
          dropdownValue=wareList?[0].warehouseId;
          FocusScope.of(context).requestFocus(_passwordFocusNode);
      });
    }else{
       Global.showCenterCodeToast(_result.code,_result.msg);
    }
  }

  //根据用户和密码进行登陆
  void _login() async{
    var _params=LinkedHashMap<String,dynamic>();

    if(_userController.text.isEmpty){//如果用户为空
      Global.showCenterToast("请输入账号");
    }else if(_passwordController.text.isEmpty){
      Global.showCenterToast("请输入密码");
    }else if(ObjUtil.isEmpty(dropdownValue)){
      Global.showCenterToast("请选择仓库");
    }

    _params['userId']=_userController.text;
    _params['password']=_passwordController.text;
    _params['methodName']='doLogin';
    var _result =await Services.doLogin(_params);
    if(_result.code==Global.SUCCESS) {//查询成功了

      UserInfo? _userInfo=_result.data?[0];

      //存到持久化里面去 下次登陆可以用
      SharedPreferences _prefs = await SharedPreferences.getInstance();
      _prefs.setString('userId', _userInfo?.userId??'');
      _prefs.setString('password',_passwordController.text);
      Global.roleId=_userInfo?.roleId??'';
      Global.userId=_userController.text;
      Global.warehouseId=dropdownValue??'';
      _getFunction();
    }else{//失败
       Global.showCenterCodeToast(_result.code,_result.msg);
    }

  }

   //获取权限
  void _getFunction() async{
    var _result =await Services.getFunction({'methodName':'getFunction','userID':_userController.text});
    if(_result.code==Global.SUCCESS) { //查询成功了
      List<FunctionObj>? _functionList=_result.data;
       _functionList?.forEach((element) {
       Global.functionMap.addAll(element.toJson());//赋值给全局变量 之后可以用
      });
      Navigator.pushNamed(context, "home");
    }else{
      Global.showCenterCodeToast(_result.code,_result.msg);
    }
  }


  @override
  void initState() {
    super.initState();
    _userController = TextEditingController();
    _userController.addListener(() {
      userId=_userController.text;
    });
    _passwordController = TextEditingController();
  }

  @override
  void dispose() {
    _userController.dispose();
    _passwordController.dispose();
    super.dispose();
  }



  @override
  Widget build(BuildContext context) {

    //该界面输入框的外框样式(用户框,密码框)
    final  OutlineInputBorder outlineInputBorder=  OutlineInputBorder(borderRadius:  BorderRadius.circular(40.0),borderSide: BorderSide(
        color: Color(0xFFFFFFFF)
    ) );


    return Scaffold(
      resizeToAvoidBottomInset: false,
      body: ConstrainedBox(
        constraints: BoxConstraints(
            minWidth:double.infinity,
            minHeight: double.infinity
        ),
        child: DecoratedBox(
            decoration: BoxDecoration(
              image: DecorationImage(
                  fit: BoxFit.fill ,
                  image: AssetImage("images/bg.jpg")
              ),
            ),
            child:Column(
              children: [
                Expanded( // 1/3空间
                  flex: 1,
                  child: Center(
                    child: Image.asset('images/hzlogo.png'),
                  ),
                ),
                Expanded( // 1/3空间
                  flex: 1,
                  child: Column(
                    children: [
                      Padding(
                          padding:EdgeInsets.symmetric(vertical: 2.0,horizontal: 30.0),
                          child:  TextField(
                            controller: _userController,
                            onChanged:(String value)=> {
                            setState( () {
                            wareList=<WareHouse>[];
                            dropdownValue=null;
                            })
                            } ,
                            onSubmitted: (String value)=>_getWareHouse(value),
                            autofocus:true,
                            decoration: InputDecoration(
                                border: outlineInputBorder,
                                focusedBorder: outlineInputBorder,
                                enabledBorder: outlineInputBorder,
                                fillColor:Colors.white ,
                                filled: true,
                                hintText: "用户名",
                                prefixIcon: Icon(Icons.person)
                            ),
                          ),
                      )
                      ,
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 2.0,horizontal: 30.0),
                        child: TextField(
                          controller: _passwordController,
                          cursorRadius: Radius.circular(20.0),
                          obscureText: true,
                          autofocus:true ,
                          focusNode: _passwordFocusNode,
                          decoration: InputDecoration(
                            border: outlineInputBorder,
                            focusedBorder: outlineInputBorder,
                            enabledBorder: outlineInputBorder,
                            fillColor:Colors.white ,
                            filled: true,
                            hintText: "密码",
                            prefixIcon: Icon(Icons.lock),
                          ),
                        ),
                      ),
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 2.0,horizontal: 30.0),
                        child:DecoratedBox(
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(40.0),
                            shape: BoxShape.rectangle,
                            color: Colors.white
                          ),
                          child: ConstrainedBox(
                            constraints:BoxConstraints(minWidth: double.infinity,minHeight: 60.0) ,
                            child: Padding(
                              padding: EdgeInsets.fromLTRB(46.0, 12.0, 40.0, 0.0),
                              child: DropdownButton<String>(
                                value:dropdownValue,
                                icon: const Icon(Icons.arrow_downward,color: Colors.black,),
                                iconSize: 24,
                                style: const TextStyle(color: Colors.black,
                                  fontSize: 16.0
                                ),
                                underline:Container(
                                  height: 0,
                                  color: Colors.deepPurpleAccent,
                                ) ,
                                onChanged: (String? newValue) {
                                  setState(() {
                                    print(newValue);
                                    dropdownValue = newValue!;
                                  });
                                },
                                items: wareList?.map<DropdownMenuItem<String>>((WareHouse value) {
                                  return DropdownMenuItem<String>(
                                    value: value.warehouseId,
                                    child: Text(value.warehouseId),
                                  );
                                }).toList(),
                              ),
                            )
                        )

                      )
                      ),
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 6.0),
                        child:ElevatedButton(
                          onPressed: _login,
                          style:ButtonStyle(
                            minimumSize: MaterialStateProperty.all<Size>(Size(150.0, 50.0)),
                            //背景色
                            backgroundColor: MaterialStateProperty.all<Color>(Colors.blueAccent),
                            //前景色 字体颜色
                            foregroundColor:MaterialStateProperty.all<Color>(Colors.white),
                            textStyle: MaterialStateProperty.all<TextStyle>(TextStyle(fontSize: 20.0)),
                            shape: MaterialStateProperty.all<OutlinedBorder>(RoundedRectangleBorder(borderRadius: BorderRadius.circular(40.0))),
                          ),
                          child: Text("登陆"),
                        ) ,)

                    ],
                  ),
                ),
                Expanded( // 1/3空间
                  flex: 1,
                  child: Row(

                  ),
                ),
              ],
            )
        ),
      )
    );

  }

}

BaseResult是用来接收所有返回结果的。主要是code 代码,msg 详细信息,data就是查询的结果。futter中泛型的使用方法https://blog.csdn.net/K_Hello/article/details/115525018

import 'package:json_annotation/json_annotation.dart';
part 'bas_result.g.dart';
@JsonSerializable(genericArgumentFactories: true)
class BaseResult<T>{
  int code;
  String msg;
  List<T>? data;
  BaseResult(this.code,this.msg,this.data);
  factory BaseResult.fromJson(Map<String, dynamic> json, T Function(dynamic json) fromJsonT) => _$BaseResultFromJson(json, fromJsonT);

  Map<String, dynamic> toJson(Object? Function(T value) toJsonT) =>
      _$BaseResultToJson(this, toJsonT);
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:09:56  更:2021-08-19 12:11:29 
 
开发: 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/23 9:54:24-

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