话不多说,直接上代码(表单页面代码就不贴了,自己怎么喜欢怎么来,直接贴实现方法代码)
class LoginPage extends StatefulWidget {
final arguments;
LoginPage({Key key, this.arguments}) : super(key: key);
_LoginPageState createState() => _LoginPageState(this.arguments);
}
class _LoginPageState extends State<LoginPage> {
final arguments;
_LoginPageState(this.arguments);
@override
void initState() {
super.initState();
}
//监听登录页面销毁事件
@override
dispose () {
super.dispose();
//事件广播,当登录后返回上一页时,上一页不会执行initState方法,需要用到这个个方法
eventBus.fire(new UserEvent("登录成功"));
}
//定义用户名和密码两个变量接收输入的值
String username = ""; //电话号
String password = ""; //密码
//登录方法,在需要用到的地方把方法引入即可
doLogin () async {
if (this.username == "") {
Fluttertoast.showToast(
msg: "请输入用户名",
gravity: ToastGravity.CENTER,
timeInSecForIos: 3
);
} else if (password == "") {
Fluttertoast.showToast(
msg: "请输入密码",
gravity: ToastGravity.CENTER,
timeInSecForIos: 3
);
} else {
//这里用的get方法发送数据,用post发送也可以,看个人喜好
var api = "${Config.domain}user/loginUser?username=" + this.username+"&password="+this.password;
var response = await Dio().get(api);
if (response.data["success"]) {
Fluttertoast.showToast(
msg: "${response.data["message"]}",
gravity: ToastGravity.CENTER,
timeInSecForIos: 3
);
//登录成功后将用户信息保存到storage中,可以在其他需要用到验证登录信息的地方用到
Storage.setString("userInfo", json.encode(response.data["data"]));
Navigator.of(context).pop();
} else {
Fluttertoast.showToast(
msg: "${response.data["message"]}",
gravity: ToastGravity.CENTER,
timeInSecForIos: 3
);
}
}
}
}
当登录成功后返回上一页需要监听广播事件,首先下载依赖https://pub.dev/packages/event_bus,然后新建一个EventBus.dart用来定义要监听的事件,拿这个登录举例
import 'package:event_bus/event_bus.dart';
//事件广播,改变页面状态
EventBus eventBus = new EventBus();
class UserEvent {
String str;
UserEvent (String str) {
this.str = str;
}
}
然后在登录后返回的上一页监听广播事件
class HahaPage extends StatefulWidget {
HahaPage Page({Key key}) : super(key: key);
_HahaPageState createState() => _HahaPageState PageState();
}
class _HahaPageState extends State<HahaPage> {
//用来验证登录状态
//判断是否登录,默认给个false
bool isLogin = false;
//用户信息,默认为空
List userInfo = [];
_getUserInfo () async {
var isLogin = await UserService.getUserLoginState();
var userInfo = await UserService.getUserInfo();
setState(() {
this.userInfo = userInfo;
this.isLogin = isLogin;
});
}
@override
void initState() {
super.initState();
//监听登录页面改变的事件
eventBus.on<UserEvent>().listen((event){
print(event); //不出意外你的控制台会输出:登录成功
//获取用户登录信息
_getUserInfo();
});
}
}
新建UserService.dart,实现验证登录状态和获取用户信息方法,项目中需要这两个家伙的地方很多
import 'package:cso_app/services/Storage.dart';
import 'dart:convert';
class UserService {
//获取用户信息
static getUserInfo () async {
List _userinfo;
try {
//从登录后存入storage中的信息获取用户信息
List userInfoData = json.decode(await Storage.getString("userInfo"));
_userinfo = userInfoData;
} catch (e) {
_userinfo = [];
}
return _userinfo;
}
//获取用户登录状态
static getUserLoginState () async {
var userInfo = await UserService.getUserInfo();
if (userInfo.length > 0 && userInfo[0]["username"] != "") {
return true;
}
return false;
}
//直接在这里把退出登录实现了吧,将storage中存储的信息清除即可
static logOut () {
Storage.remove("userInfo");
}
}