Newer
Older
flutterBaseApp / lib / ui / pages / user / user_login_page.dart
StephanieGitHub on 9 Feb 2021 8 KB first commit
import 'dart:async';

import 'package:base_app/common/common.dart';
import 'package:base_app/data/net/dio_util.dart';
import 'package:base_app/data/protocol/user_model.dart';
import 'package:base_app/data/repository/user_repository.dart';
import 'package:base_app/res/index.dart';
import 'package:base_app/res/styles.dart';
import 'package:base_app/ui/widgets/common/button/round_button_widget.dart';
import 'package:base_app/ui/widgets/common/dialog/loading_dialog_widget.dart';
import 'package:base_app/ui/widgets/login_page/login_item_widget.dart';
import 'package:base_app/utils/route_util.dart';
import 'package:base_app/utils/utils.dart';
import 'package:dio/dio.dart';
import 'package:fluintl/fluintl.dart';
import 'package:flustars/flustars.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';

// 登录页Widget
class UserLoginPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new LoginPageState();
  }
}

// 登录页State
class LoginPageState extends State<UserLoginPage> {
  // 用户仓库(调用后台)
  UserRepository userRepository = new UserRepository();
  @override
  initState() {
    super.initState();
    // 显示loding窗口
    Future.delayed(Duration.zero, () {
      // 1. 显示loading窗
      showDialog(
          context: context,
          barrierDismissible: false,
          builder: (BuildContext context) {
            return new LoadingDialog(
              text: "连接服务器中...",
            );
          });
      // 2. 连接后台服务器
      userRepository.baseConfig().then((result) {
        Navigator.pop(context); // 关闭弹窗
      }).catchError((onError) {
        Navigator.pop(context); // 关闭弹窗并提示错误信息
        showToast("连接服务器失败,请稍后退出重进~");
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      resizeToAvoidBottomInset: false,
      body: new Stack(
        children: <Widget>[
          new Image.asset(
            Utils.getImgPath("ic_login_bg"),
            width: double.infinity,
            height: double.infinity,
            fit: BoxFit.cover,
          ), // 背景图片
          new LoginBody()
        ],
      ),
    );
  }
}

// 登录BodyWidgegt
class LoginBody extends StatelessWidget {
  UserRepository userRepository = new UserRepository(); // 用户信息仓库

  TextEditingController _controllerPort = new TextEditingController(); // 地址
  TextEditingController _controllerName = new TextEditingController(); // 账户
  TextEditingController _controllerPwd = new TextEditingController(); // 密码

  FocusNode passwordFocusNode = FocusNode();

  @override
  Widget build(BuildContext context) {
    _controllerPort.text = SpUtil.getString(Constant.key_url);
    // UserModel userModel =
    //     SpUtil.getObj(BaseConstant.keyUserModel, (v) => UserModel.fromJson(v));
    // _controllerName.text = userModel?.username ?? "";
    MediaQueryData mq = MediaQuery.of(context);

    /// 登录
    void _userLogin() {
      String username = _controllerName.text.trim();
      String password = _controllerPwd.text.trim();
      if (username.isEmpty) {
        Utils.showSnackBar(context, "请输入用户名~");
        return;
      }
      if (password.isEmpty) {
        Utils.showSnackBar(context, "请输入密码~");
        return;
      }
      // 显示loading窗
      showDialog(
          context: context,
          barrierDismissible: false,
          builder: (BuildContext context) {
            return new LoadingDialog(
              text: "登录中…",
            );
          });

      // 调后台验证登录
      LoginReq req = new LoginReq(username, password);
      userRepository.login(req).then((UserModel model) {
        LogUtil.e("LoginResp: ${model.toString()}");
        Navigator.pop(context);
        showToast("登录成功~");
        Timer timer = new Timer(new Duration(milliseconds: 500), () {
          RouteUtil.goMain(context);
        });
        // });
      }).catchError((error) {
        Navigator.pop(context);
        if (error is String) {
          // Utils.showSnackBar(context, error.toString());
          showToast(error.toString());
        } else {
          showToast("未知异常,请退出后重试");
          LogUtil.e("LoginResp error: ${error.toString()}");
        }
      });
    }

    void openUrlSetting(context) {
      // 打开服务器配置弹窗
      showCupertinoDialog(
          context: context,
          builder: (context) {
            return Container(
                child: CupertinoAlertDialog(
                    title: Text('请输入后台服务器地址'),
                    content: new Container(
                        padding: EdgeInsets.only(top: 10.0),
                        child: new CupertinoTextField(
                          controller: _controllerPort,
                          minLines: 1,
                          maxLines: 2,
                          placeholder: "如:http://127.0.0.01:8080/",
                        )),
                    actions: <Widget>[
                  CupertinoDialogAction(
                    onPressed: () {
                      // 放弃返回主页
                      Navigator.pop(context);
                    },
                    child: Text('取消'),
                  ),
                  CupertinoDialogAction(
                    onPressed: () {
                      String url = _controllerPort.text;
                      // 如果没有末尾斜杠加上斜杠
                      if (url[url.length - 1] != '/') {
                        url = url + '/';
                      }
                      SpUtil.putString(Constant.key_url, url);
                      Options options = DioUtil.getDefOptions();
                      options.baseUrl = url;
                      HttpConfig config = new HttpConfig(options: options);
                      DioUtil().setConfig(config);
                      Navigator.pop(context);
                      showToast("保存成功");
                      connectServer(); // 重新连接服务器
                    },
                    child: Text('保存'),
                  )
                ]));
          });
    }

    return new Column(
      children: <Widget>[
        new Container(
          height: mq.size.height / 3,
          alignment: Alignment.center,
          child: Text(
            AppConfig.appName,
            style: TextStyle(color: Colors.white, fontSize: 22),
          ),
        ), // 标题
        new Expanded(
            child: new Container(
          margin: EdgeInsets.only(left: 20, top: 15, right: 20),
          child: new Column(
            children: <Widget>[
              // 用户名输入框
              LoginItem(
                textInputAction: TextInputAction.next,
                onEditingComplete: () =>
                    FocusScope.of(context).requestFocus(passwordFocusNode),
                // autoFocus: true,
                keyboardType: TextInputType.emailAddress,
                controller: _controllerName,
                prefixIcon: Icons.person,
                hintText: IntlUtil.getString(context, Ids.user_name),
              ),
              Gaps.vGap15,
              // 密码输入框
              LoginItem(
                textInputAction: TextInputAction.done,
                focusNode: passwordFocusNode,
                controller: _controllerPwd,
                prefixIcon: Icons.lock,
                hasSuffixIcon: true,
                hintText: IntlUtil.getString(context, Ids.user_pwd),
              ),
              // 服务器配置
              new Container(
                padding: EdgeInsets.only(top: Dimens.gap_dp15),
                alignment: Alignment.centerRight,
                child: new InkWell(
                  child: new Text(
                    IntlUtil.getString(context, Ids.server_url_set),
                    style: new TextStyle(
                        color: Colours.gray_99, fontSize: Dimens.font_sp14),
                  ),
                  onTap: () {
                    openUrlSetting(context);
                  },
                ),
              ),
              new RoundButton(
                text: "登录",
                margin: EdgeInsets.only(top: 20),
                onPressed: () {
                  _userLogin();
                },
              ),
              Gaps.vGap15,
            ],
          ),
        )),
      ],
    );
  }

  // 连接服务器
  connectServer() {
    userRepository.baseConfig().then((result) {
      showToast("连接服务器成功");
    }).catchError((onError) {
      showToast("连接服务器失败,请确认服务器地址是否填写正确");
    });
  }
}