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(); } }
可选优化:增加加载状态
避免学生数据加载过程中页面出现空白,可增加加载状态提示:
- 新增状态变量
bool isLoadingAluno = false;
- 改造
_isAluno方法控制加载状态
Future _isAluno() async { setState(() { isLoadingAluno = true; }); AlunoModel aluno = await getAluno(); setState(() { nomeAluno = aluno.NM_ENTIDADE_ENT; isLoadingAluno = false; }); }
- 调整渲染逻辑
// 替换原有的nomeAluno显示Text组件 isLoadingAluno ? const Center(child: CircularProgressIndicator()) : Text( nomeAluno, textAlign: TextAlign.center, ),
其他注意事项
你的代码中请求头的Content-Type拼写错误,正确写法是application/json,原代码少写了一个字母p,可能会导致部分接口请求异常,建议一并修改。
内容的提问来源于stack exchange,提问作者David Almeida
相关产品推荐
相关产品推荐

