Flutter中jsonDecode获取FlutterSession值初始化不加载,热重载后正常
Flutter Session数据初始化与空值问题解决
一、初始代码打印null的原因
你的初始代码里,_getSession()是异步函数,调用它不会阻塞initState的执行流程。initState执行完毕后立刻进入build方法,此时异步操作还没完成,logindata还没被赋值,所以打印null。
热重载时,之前的异步操作已经完成,logindata已经被赋值,所以热重载后build能输出正确值。而换成同步赋值(比如直接给logindata赋值字符串),initState里会立刻完成赋值,build执行时变量已经有值,所以能正常打印。
二、修改后访问logindata["shop_name"]报错的解决方法
你修改后的代码存在两个问题:
- 参数名覆盖成员变量:
then((logindata)里的logindata是局部参数,和类成员变量重名,导致setState里的赋值没真正更新类的logindata。 - 空值未处理:首次
build时logindata还是null,直接访问["shop_name"]会触发空指针错误。
修复后的代码示例:
class _dashboardState extends State<dashboard> { var logindata; @override void initState() { super.initState(); getSessionValue(); } Future<void> getSessionValue() async { // 先获取数据,再通过setState更新状态 final data = jsonDecode(await FlutterSession().get("login_data")); setState(() { logindata = data; }); } @override Widget build(BuildContext context) { // 使用前先判断logindata是否为空 if (logindata == null) { // 数据未加载完成时的占位UI,比如加载提示 return const CircularProgressIndicator(); } else { // 数据加载完成后正常使用 print(logindata["shop_name"]); return Text(logindata["shop_name"]); } } }
关键修复点:
- 避免参数名和成员变量重名,用临时变量存储异步获取的值,再通过
setState更新类的logindata。 - 在
build中先判断logindata是否为null,为空时显示加载状态,不为空再访问内部字段,避免空指针错误。 - 遵循规范,把
super.initState()放在initState的第一行。
内容的提问来源于stack exchange,提问作者JuniorJ
相关产品推荐
相关产品推荐

