Android :实现登录功能的思绪

打印 上一主题 下一主题

主题 1006|帖子 1006|积分 3018

android的登录功能和前端一样,需要保存登录的用户信息。

  • 创建一个工具类
  1. // 用户工具类,用于管理用户登录状态和用户信息
  2. object AppUserUtil {
  3.     // 常量定义
  4.     private const val LOGGED_FLAG = "logged_flag" // 登录状态的键名
  5.     private const val USER_INFO = "user_info"     // 用户信息的键名
  6.     private const val TAG = "AppUserUtil"         // 日志标签
  7.     // 登录状态属性
  8.     var isLogged: Boolean
  9.         // 获取登录状态,默认值为 false
  10.         get() = DataStoreUtils.readBooleanData(LOGGED_FLAG, false)
  11.         // 设置登录状态,并同步保存到 DataStore
  12.         set(value) = DataStoreUtils.saveSyncBooleanData(LOGGED_FLAG, value = value)
  13.     // 用户信息属性
  14.     var userInfo: UserInfo?
  15.         // 获取用户信息,从 DataStore 中读取并反序列化为 UserInfo 对象
  16.         get() = DataStoreUtils.readStringData(USER_INFO).fromJson()
  17.         // 设置用户信息,并同步保存到 DataStore
  18.         set(value) = DataStoreUtils.saveSyncStringData(USER_INFO, value = value?.toJson() ?: "")
  19.     // 登录方法
  20.     fun onLogin(userInfo: UserInfo) {
  21.         isLogged = true               // 设置登录状态为 true
  22.         this.userInfo = userInfo      // 保存用户信息
  23.         Log.d(TAG, "onLogin: $userInfo") // 打印登录日志
  24.     }
  25.     // 登出方法
  26.     fun onLogOut() {
  27.         isLogged = false              // 设置登录状态为 false
  28.         this.userInfo = null          // 清空用户信息
  29.     }
  30. }
复制代码

  • 发起登录哀求,登录成功,则调用工具类的onLgoin方法
  1. private fun login() {
  2.         viewModelScope.launch {
  3.             flow {
  4.                 emit(service.login(viewStates.account.trim(), viewStates.password.trim()))
  5.             }.map {
  6.                 if (it.errorCode == 0) {
  7.                     if (it.data != null) {
  8.                         HttpResult.Success(it.data!!)
  9.                     } else {
  10.                         throw Exception("the result of remote's request is null")
  11.                     }
  12.                 } else {
  13.                     throw Exception(it.errorMsg)
  14.                 }
  15.             }.onEach {
  16.                 AppUserUtil.onLogin(it.result)
  17.                 _viewEvents.send(LoginViewEvent.PopBack)
  18.             }.catch {
  19.                 _viewEvents.send(LoginViewEvent.ErrorMessage(it.message ?: ""))
  20.             }.collect()
  21.         }
  22.     }
复制代码

  • 一些页面,如果未登录,是不能使用的,这个时间我们可以取出isLogged 属性进行判断。
  1. @ExperimentalFoundationApi
  2. @Composable
  3. fun CollectPage(
  4.     navCtrl: NavHostController,
  5.     scaffoldState: ScaffoldState,
  6.     viewModel: CollectViewModel = hiltViewModel()
  7. ) {
  8.     val viewStates = viewModel.viewStates
  9.     val collectPaging = viewStates.pagingData?.collectAsLazyPagingItems()
  10.     val webUrls = viewStates.urlList
  11.     val titles = viewStates.titles
  12.     val isRefreshing = viewStates.isRefreshing
  13.     val listState =
  14.         if ((collectPaging?.itemCount ?: 0) > 0) viewStates.listState else LazyListState()
  15.     DisposableEffect(Unit) {
  16.         Log.i("debug", "onStart")
  17.         viewModel.dispatch(CollectViewAction.OnStart)
  18.         onDispose {
  19.         }
  20.     }
  21.     Column(
  22.         modifier = Modifier
  23.             .fillMaxSize()
  24.             .padding(bottom = BottomNavBarHeight)
  25.     ) {
  26.         AppToolsBar(title = "我的收藏")
  27.         if (!AppUserUtil.isLogged) {
  28.             EmptyView(
  29.                 tips = "点击登录",
  30.                 imageVector = Icons.Default.Face
  31.             ) {
  32.                 RouteUtils.navTo(navCtrl, RouteName.LOGIN)
  33.             }
  34.         } else {
  35.             collectPaging?.let {
  36.                 RefreshList(it, listState = listState, isRefreshing = isRefreshing, onRefresh = {
  37.                     viewModel.dispatch(CollectViewAction.Refresh)
  38.                 }) {
  39.                     if (!webUrls.isNullOrEmpty()) {
  40.                         stickyHeader {
  41.                             ListTitle(title = titles[1].text)
  42.                         }
  43.                         item {
  44.                             FlowRow(
  45.                                 modifier = Modifier.padding(10.dp)
  46.                             ) {
  47.                                 webUrls?.forEachIndexed { index, website ->
  48.                                     LabelTextButton(
  49.                                         text = website.name ?: "标签",
  50.                                         modifier = Modifier.padding(end = 10.dp, bottom = 10.dp),
  51.                                         onClick = {
  52.                                             RouteUtils.navTo(
  53.                                                 navCtrl,
  54.                                                 RouteName.WEB_VIEW,
  55.                                                 WebData(website.name, website.link!!)
  56.                                             )
  57.                                         }
  58.                                     )
  59.                                 }
  60.                             }
  61.                         }
  62.                     }
  63.                     stickyHeader {
  64.                         ListTitle(title = titles[0].text)
  65.                     }
  66.                     if (collectPaging.itemCount > 0) {
  67.                         items(collectPaging) { collectItem ->
  68.                             CollectListItemView(
  69.                                 collectItem!!,
  70.                                 onClick = {
  71.                                     RouteUtils.navTo(
  72.                                         navCtrl,
  73.                                         RouteName.WEB_VIEW,
  74.                                         WebData(collectItem.title, collectItem.link)
  75.                                     )
  76.                                 })
  77.                         }
  78.                     }
  79.                 }
  80.             }
  81.         }
  82.     }
  83. }
复制代码
参考资料:

  • https://github.com/RicardoJiang/wanandroid-compose

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表