要想实现自动登录,就必须记住登录状态,我们可以通过shared_preferences比较轻量的插件实现数据持久化
打开pubspec.yaml文件,dependencies模块底下加入shared_preferences: ^0.5.12,加载完依赖后新建一个dart文件,并保存登录状态
import 'package:shared_preferences/shared_preferences.dart';
class LoginMsg{
//获取数据
static Future<bool> getIsLogin() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool isLogin = (prefs.getBool('isLogin') ?? false);
return isLogin;
}
//设置数据
static Future<void> setIsLogin(bool isLogin) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLogin', isLogin);
}
}
在登录后保存设置登录状态为true,并将登录数据保存到数据库中(数据库的方法在此就不写了)
bool isTrue = await LoginServer.login(userInfo);
if (!isTrue){
EasyLoading.showToast("用户名或密码错误");
return;
}
UserInfoDao userInfoDao = UserInfoDao();
int i = await userInfoDao.instert(userInfo);
if (i > 0) {
await LoginMsg.setIsLogin(true);
Navigator.of(context).pushReplacementNamed("/tabs");
EasyLoading.dismiss();
}
为了实现自动登录,需要在启动时判断登录状态,此时,需要在main方法如下所示
void main() {
// 开启布局线
debugPaintSizeEnabled = false;
// 实例化dio
ApplicationDioUtils.dioUtil = DioUtil();
// 确保WidgetsFlutterBinding被初始化,使同步方法运行
WidgetsFlutterBinding.ensureInitialized();
realRunApp();
}
进入初始化页面的方法:
void realRunApp() async{
// 判断用户之前是否登录
bool isLogin = await LoginMsg.getIsLogin();
if(isLogin){
// 重走登录逻辑
isLogin = await login();
}
runApp(MaterialApp(
title: 'Flutter测试app',
// 定义全局navigatorKey(导航键)
navigatorKey: navigatorKey,
// 初始化路由
initialRoute: isLogin ? "/tabs" : "/login",
routes: <String, WidgetBuilder>{
//注册后不走路由生成钩子方法
"/": (BuildContext context) => LoginPage(),
'/tabs': (BuildContext context) => TabsPage(),
'/login': (BuildContext context) => LoginPage(),
},
));
}
获取数据调用登录方法:
Future<bool> login() async{
UserInfo userInfo = await queryAll();
bool isLogin = await LoginServer.login(userInfo);
LoginMsg.setIsLogin(isLogin);
return isLogin;
}
/// 获取当前登录用户数据
Future<UserInfo> queryAll() async {
UserInfoDao userInfoDao = UserInfoDao();
List<UserInfo> list = await userInfoDao.getUserInfoList();
return list[list.length - 1];
}
到此,自动登录的逻辑就全部实现了