Flutter中readToken()返回Instance of 'Future<Object>'如何解决
问题根因
调用readToken()时未添加await关键字,是导致返回Instance of 'Future<Object>'的直接原因。
所有带async标记的Dart函数返回值都是Future类型,如果不等待Future执行完成就直接获取返回值,拿到的永远是Future对象实例本身,和是否提前调用create函数没有直接关联。你感知到“先调create就正常”,大概率是调用create时误加了await、或时序巧合让你误判了因果关系。
现存代码问题
你贴出的实现有两个明确缺陷:
- 返回类型定义为
Future<Object>过于宽泛:成功时返回String类型的文件内容,报错时返回int类型的0,类型不统一会提升后续调用的类型判断成本,极易出bug - 代码末尾多了一个冗余的闭合大括号
},会直接触发编译错误
修正方案
- 优化
readToken函数实现,统一返回类型,增加文件存在性判断,减少非必要异常:
Future<String> readToken() async { try { final file = await _localFile; // 文件不存在时直接返回空字符串,不走异常分支 if (!await file.exists()) { return ''; } final contents = await file.readAsString(); return contents; } catch (e) { // 异常场景同样返回字符串类型,和成功分支类型保持一致 return ''; } }
- 所有调用
readToken()的位置,必须通过await或.then()方式获取实际结果,禁止直接使用函数返回值:
// 错误写法:永远拿到Future实例 // String token = readToken(); // 正确写法1:在async上下文中用await获取结果 void loadToken() async { final token = await readToken(); // 此处拿到的才是实际存储的token字符串 debugPrint(token); } // 正确写法2:通过then回调接收执行结果 readToken().then((token) { debugPrint(token); });
注意:哪怕你提前调用了create函数,只要调用readToken时不加await,依然会拿到Future类型的实例,和文件是否存在无关。
内容的提问来源于stack exchange,提问作者Naman Khurana
相关产品推荐
相关产品推荐

