You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中jsonDecode获取FlutterSession值初始化不加载,热重载后正常

Flutter Session数据初始化与空值问题解决

一、初始代码打印null的原因

你的初始代码里,_getSession()是异步函数,调用它不会阻塞initState的执行流程。initState执行完毕后立刻进入build方法,此时异步操作还没完成,logindata还没被赋值,所以打印null。

热重载时,之前的异步操作已经完成,logindata已经被赋值,所以热重载后build能输出正确值。而换成同步赋值(比如直接给logindata赋值字符串),initState里会立刻完成赋值,build执行时变量已经有值,所以能正常打印。

二、修改后访问logindata["shop_name"]报错的解决方法

你修改后的代码存在两个问题:

  1. 参数名覆盖成员变量:then((logindata)里的logindata是局部参数,和类成员变量重名,导致setState里的赋值没真正更新类的logindata。
  2. 空值未处理:首次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:15:36