Flutter读取应用本地colors.txt文件始终返回null该如何解决
问题根因
你的问题出在异步逻辑执行顺序错误,和文件是否被系统删除无关:
initState本身是同步方法,你在内部定义的匿名async函数执行时,遇到await关键字会立刻返回Future,不会阻塞后续代码执行。也就是说print语句运行时,pf.readColor()的异步读取操作还没有完成,colorRead变量还没被赋值,所以拿到的始终是null。- 按照你的
readColor逻辑,就算文件不存在、读取报错,也会返回固定的错误字符串,不可能返回null,完全可以排除文件被系统删除的可能性。
修复方案
你只需要把所有依赖读取结果的逻辑,放到异步操作完成后的回调里即可,这里提供两种常用写法:
写法1:用.then回调处理
@override void initState() { super.initState(); Pathfinder pf = Pathfinder(); pf.readColor().then((colorRead) { // 所有依赖colorRead的逻辑都写在回调内部 print("Color in initState: $colorRead"); // 如果需要更新UI,调用setState赋值状态变量 setState(() { // your state code }); }); }
写法2:封装独立异步初始化方法
@override void initState() { super.initState(); _loadColorData(); } Future<void> _loadColorData() async { Pathfinder pf = Pathfinder(); String colorRead = await pf.readColor(); // 异步操作完成后再执行后续逻辑 print("Color in initState: $colorRead"); // 需要更新UI的话调用setState setState(() { // your state code }); }
注意事项
所有依赖异步方法返回值的逻辑,必须放在await关键字之后,或者.then/whenComplete的回调内部,不能在同步流程中直接读取异步赋值的变量。
内容的提问来源于stack exchange,提问作者Finley Adams
相关产品推荐
相关产品推荐

