要想实现自动登录,就必须记住登录状态,我们可以通过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];
}

到此,自动登录的逻辑就全部实现了

项目地址:flutterBase: flutter基础环境

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐