Flutter根据新老用户跳转页面异常:旧用户短暂显示注册页求解决
问题原因分析
嘿,我来帮你搞定这个问题~你的核心问题出在异步操作的时序差上:
- 初始化时
_userName默认是空字符串,所以第一次执行build方法时,会直接触发_userName == ""的分支,打印新用户日志并渲染Register页面。 - 而
_getUserName是带await的异步方法,它需要等待SharedPreferences读取完成才会更新_userName的状态,这中间的短暂间隙就导致了注册页闪屏和错误日志的问题。
修复方案
我们可以加一个加载状态标记,在异步操作完成前显示加载界面,避免提前渲染错误页面。具体修改如下:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'Register.dart'; import 'HomePage.dart'; class Authenticate extends StatefulWidget { @override _AuthenticateState createState() => _AuthenticateState(); } class _AuthenticateState extends State<Authenticate> { String _userName = ""; // 新增加载状态标记,初始为true表示正在读取用户信息 bool _isLoading = true; @override void initState() { super.initState(); _getUserName(); } _getUserName() async { SharedPreferences pref = await SharedPreferences.getInstance(); setState(() { _userName = pref.getString('userName') ?? ""; // 异步读取完成,标记加载结束 _isLoading = false; }); } Widget build(BuildContext context) { // 加载中时显示加载组件(这里用系统默认的圆形进度条,你也可以换成自定义加载页) if (_isLoading) { return const Scaffold( body: Center( child: CircularProgressIndicator(), ), ); } // 加载完成后再判断用户类型 if (_userName == "") { print('name : $_userName , NEW user'); return Register(); } else { print('name : $_userName , OLD user'); // 可以加上旧用户日志方便调试 return HomePage(_userName); } } }
关键改动说明
- 新增
_isLoading变量,初始为true,用来标识用户信息是否读取完成。 - 在
_getUserName的setState中把_isLoading设为false,通知框架异步操作已完成。 build方法优先判断加载状态,加载中时显示居中的进度条,等读取完用户信息后,再根据_userName决定跳转注册页还是首页。
这样修改后,旧用户打开应用时会先看到加载界面,不会再闪显注册页,也不会错误打印新用户日志啦~
内容的提问来源于stack exchange,提问作者Kartik Bhanderi
相关产品推荐
相关产品推荐

