构建 request
registration_request.dart
class RegistrationRequest extends BaseRequest {
@override
bool needLogin() {
return false;
}
@override
String path() {
return '/uapi/user/registration';
}
@override
HttpMethod httpMethod() {
return HttpMethod.POST;
}
}
login_request.dart
class LoginRequest extends BaseRequest {
@override
bool needLogin() {
return false;
}
@override
String path() {
return '/uapi/user/login';
}
@override
HttpMethod httpMethod() {
return HttpMethod.POST;
}
}
封装注册、登录请求
LoginDao.dart
对注册、登录接口请求封装,登录成功后缓存用户标识。
class LoginDao {
static final String BOARDING_PASS = "auth_token";
/// 登录
static login(String userName, String password) {
return _send(userName, password);
}
// 注册
static registration(
String userName, String password, String imoocId, String orderId) {
return _send(userName, password, imoocId: imoocId, orderId: orderId);
}
/// 请求数据接口 返回请求数据
static _send(String userName, String password, {imoocId, orderId}) async {
// 构建 request 对象
BaseRequest request;
if (imoocId != null && orderId != null) {
request = RegistrationRequest();
} else {
request = LoginRequest();
}
// 添加请求参数
request
.add('userName', userName)
.add('password', password)
.add('imoocId', imoocId)
.add('orderId', orderId);
// 发送网络请求
var result = await HiNet.getInstance().fire(request);
// 请求接口成功
if (result['code'] == 0 && result['data'] != null) {
// 缓存用户标识
HiCache.getInstance().setString(BOARDING_PASS, result['data']);
}
return result;
}
/**
* 获取登录令牌
*/
static getBoardingPass() {
return HiCache.getInstance().get(BOARDING_PASS);
}
}
添加 Header
base_request.dart
在构建 url 时判断接口是否需要登录,如果需要则添加用户登录标识到 header。
// 如果需要登录,则添加登录令牌到 header
if (needLogin()) {
addHeader(LoginDao.BOARDING_PASS, LoginDao.getBoardingPass());
}
编写注册、登录页面
registration_page.dart
class RegistrationPage extends StatefulWidget {
// 跳转回调
final VoidCallback onJumpToLogin;
const RegistrationPage({Key key, this.onJumpToLogin}) : super(key: key);
@override
_RegistrationPageState createState() => _RegistrationPageState();
}
class _RegistrationPageState extends State<RegistrationPage> {
bool protect = false;
bool loginEnable = false;
String userName;
String password;
String rePassword;
String imoocId;
String orderId;
@override
Widget build(BuildContext context) {
return Scaffold(
// 点击 appbar 右侧【登录】跳转登录页面
appBar: appBar("注册", "登录", widget.onJumpToLogin),
body: Container(
child: ListView(
children: [
LoginEffect(protect: protect),
LoginInput(
"用户名",
"请输入用户名",
onChanged: (text) {
userName = text;
checkInput();
},
),
LoginInput(
"密码",
"请输入密码",
lineStretch: true,
obscureText: true, // 是否启用安全模式
onChanged: (text) {
password = text;
checkInput();
},
// 焦点改变回调
focusChanged: (focus) {
this.setState(() {
protect = focus;
});
},
),
LoginInput(
"确认密码",
"请输入确认密码",
lineStretch: true,
obscureText: true, // 是否启用安全模式
onChanged: (text) {
rePassword = text;
checkInput();
},
// 焦点改变回调
focusChanged: (focus) {
this.setState(() {
protect = focus;
});
},
),
LoginInput(
"慕课网ID",
"请输入你的慕课网用户ID",
keyboardType: TextInputType.number, // 数字键盘
onChanged: (text) {
imoocId = text;
checkInput();
},
),
LoginInput(
"课程订单号",
"请输入课程订单号后四位",
keyboardType: TextInputType.number, // 数字键盘
lineStretch: true,
onChanged: (text) {
orderId = text;
checkInput();
},
),
Padding(
padding: EdgeInsets.only(top: 20, left: 20, right: 20),
child: LoginButton(
title: '注册',
enable: loginEnable,
onPressed: checkParams,
),
), // 注册按钮
],
),
),
);
}
/// 检测输入状态,是否启用注册按钮
void checkInput() {
bool enable;
if (isNotEmpty(userName) &&
isNotEmpty(password) &&
isNotEmpty(rePassword) &&
isNotEmpty(imoocId) &&
isNotEmpty(orderId)) {
enable = true;
} else {
enable = false;
}
// 设置 loginEnable 状态
setState(() {
loginEnable = enable;
});
}
/// 发送注册请求
void send() async {
try {
var result =
await LoginDao.registration(userName, password, imoocId, orderId);
if (result['code'] == 0) {
// 注册成功
showToast('注册成功');
if (widget.onJumpToLogin != null) {
widget.onJumpToLogin(); // 跳转登录页面
}
} else {
showWarnToast(result['msg']);
}
} on NeedAuth catch (e) {
showWarnToast(e.message);
} on HiNetError catch (e) {
showWarnToast(e.message);
}
}
void checkParams() {
String tips;
if (password != rePassword) {
tips = '两次密码不一致!';
} else if (orderId.length != 4) {
tips = '请输入订单号后四位';
}
if (tips != null) {
print(tips);
return;
}
// 注册用户
send();
}
}
login_page.dart
class LoginPage extends StatefulWidget {
// 跳转回调
final VoidCallback onJumpToLogin;
const LoginPage({Key key, this.onJumpToLogin}) : super(key: key);
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
bool protect = false;
bool loginEnable = false;
String userName;
String password;
String rePassword;
String imoocId;
String orderId;
@override
Widget build(BuildContext context) {
return Scaffold(
// 点击 appbar 右侧【登录】跳转登录页面
appBar: appBar("登录", "注册", () {}),
body: Container(
child: ListView(
children: [
LoginEffect(protect: protect),
LoginInput(
"用户名",
"请输入用户名",
onChanged: (text) {
userName = text;
checkInput();
},
),
LoginInput(
"密码",
"请输入密码",
obscureText: true, // 是否启用安全模式
onChanged: (text) {
password = text;
checkInput();
},
// 焦点改变回调
focusChanged: (focus) {
this.setState(() {
protect = focus;
});
},
),
Padding(
padding: EdgeInsets.only(top: 20, left: 20, right: 20),
child: LoginButton(
title: '登录',
enable: loginEnable,
onPressed: send,
),
), // 注册按钮
],
),
),
);
}
/// 检测输入状态,是否启用注册按钮
void checkInput() {
bool enable;
if (isNotEmpty(userName) && isNotEmpty(password)) {
enable = true;
} else {
enable = false;
}
// 设置 loginEnable 状态
setState(() {
loginEnable = enable;
});
}
/// 发送登录请求
void send() async {
try {
var result = await LoginDao.login(userName, password);
if (result['code'] == 0) {
showToast('登录成功');
if (widget.onJumpToLogin != null) {
widget.onJumpToLogin(); // 跳转首页
}
} else {
showToast(result['msg']);
}
} on NeedAuth catch (e) {
showToast(e.message);
} on HiNetError catch (e) {
showToast(e.message);
}
}
}