Flutter中如何确保Async/Await与init函数内状态变量已赋值?
解决异步函数执行后状态变量可用的问题
问题原因
你在initState里调用getValues()后立刻执行configValue(),但async函数调用后不会阻塞后续代码——getValues()里的异步操作(加载JSON)还没完成时,configValue()就已经执行了,这时候values还是初始的空数组。另外json.decode是同步方法,不需要加await。
方案一:在异步流程结束后调用configValue()
直接在getValues()的异步操作完成、setState赋值结束后调用configValue(),确保values已经有值:
late List values = []; @override void initState() { super.initState(); getValues(); // 仅调用此方法,configValue在内部触发 } getValues() async { final String response = await rootBundle.loadString('assets/values.json'); final vals = json.decode(response)['values']; // 移除多余的await setState(() { values = vals; }); configValue(); // 此时values已完成赋值 } void configValue() { // 先判断非空,避免数组越界 if (values.isNotEmpty) { // 安全访问values[0] print(values[0]); } }
方案二:直接传递解析结果给configValue()
如果不需要依赖setState更新后的状态,可以先把解析结果传给configValue(),再更新状态,这样更高效:
late List values = []; @override void initState() { super.initState(); getValues(); } getValues() async { final String response = await rootBundle.loadString('assets/values.json'); final vals = json.decode(response)['values']; configValue(vals); // 直接传递解析后的结果 setState(() { values = vals; }); } // 修改configValue接收参数 void configValue(List vals) { if (vals.isNotEmpty) { print(vals[0]); } }
额外提醒
- 无论哪种方案,都要先判断数组是否为空,避免出现数组越界异常。
initState本身不能被标记为async,所以不能在initState里直接await getValues(),但可以在内部调用异步函数并处理后续流程。
内容的提问来源于stack exchange,提问作者PrimeTimeTran
相关产品推荐
相关产品推荐

