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

Flutter Scaffold从REST API同步数据后界面不自动更新问题求助

问题原因
  • 你在_lerPref的setState回调中调用了异步方法_isAluno,首次触发页面重绘时这个异步请求还未完成,nomeAluno仍为空值
  • _isAluno方法中完成接口请求给nomeAluno赋值后,没有调用setState通知Flutter框架状态变更,框架不会触发界面重绘,所以赋值后页面不会自动更新
  • 热重载会强制重建当前页面,此时已经完成赋值的nomeAluno才会被渲染,就出现了你遇到的保存后才显示内容的问题
修复方案

第一步:修改_isAluno方法,赋值后调用setState

Future _isAluno() async {
  AlunoModel aluno = await getAluno();
  setState(() {
    nomeAluno = aluno.NM_ENTIDADE_ENT;
  });
  print(nomeAluno);
}

第二步:调整_lerPref的逻辑,不要把异步方法放在setState回调内

setState回调中只处理同步的状态更新,异步逻辑移到外部:

_lerPref() async {
  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
  setState(
    () {
      role = sharedPreferences.getString('role').toString();
      DS_LOGIN = sharedPreferences.getString('DS_LOGIN').toString();
      print(role);
    },
  );
  if (role == 'aluno') {
    _isAluno();
  }
}
可选优化:增加加载状态

避免学生数据加载过程中页面出现空白,可增加加载状态提示:

  1. 新增状态变量
bool isLoadingAluno = false;
  1. 改造_isAluno方法控制加载状态
Future _isAluno() async {
  setState(() {
    isLoadingAluno = true;
  });
  AlunoModel aluno = await getAluno();
  setState(() {
    nomeAluno = aluno.NM_ENTIDADE_ENT;
    isLoadingAluno = false;
  });
}
  1. 调整渲染逻辑
// 替换原有的nomeAluno显示Text组件
isLoadingAluno 
  ? const Center(child: CircularProgressIndicator())
  : Text(
      nomeAluno,
      textAlign: TextAlign.center,
    ),
其他注意事项

你的代码中请求头的Content-Type拼写错误,正确写法是application/json,原代码少写了一个字母p,可能会导致部分接口请求异常,建议一并修改。

内容的提问来源于stack exchange,提问作者David Almeida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:45:03