Flutter开发中Dart异步函数返回字符串时出现Future与String类型不匹配错误的解决问询
最近在开发Flutter应用时踩了个SharedPreferences的小坑——明明想从读取函数返回字符串,结果却总是拿到Future类型,折腾了好一会儿才搞定,把整个过程记录下来,希望能帮到遇到同样问题的朋友。
问题场景
我用SharedPreferences存储用户相关数据,写了两个核心函数:
- 保存函数
save,逻辑正常,能成功存储数据:
save(key, value) async { final prefs = await SharedPreferences.getInstance(); prefs.setString(key, value); print('saved $value'); }
- 读取函数
read,最初只是打印读取结果时一切正常:
read(key) async { final prefs = await SharedPreferences.getInstance(); final value = prefs.getString(key) ?? 0; print('$value'); }
但当我把打印语句改成返回语句,想拿到字符串值用于后续处理时,直接抛出错误:
type 'Future<dynamic>' is not a subtype of type 'String'
我尝试过用read(mykey).then((value) => '$value')的方式调用,虽然能在回调里打印出正确值,但没法把这个值存成String变量用来做字符串拼接等后续操作。
第一次调整(未解决问题)
后来按照@Stijn2210的建议,给read函数明确了返回类型:
Future<String> read(key) async { final prefs = await SharedPreferences.getInstance(); final value = prefs.getString(key) ?? ''; return value; }
但调用时还是没有得到期望的结果,我的调用代码片段如下:
void onDragEnd(DraggableDetails details, User user) { final minimumDrag = 100; Future<String> myvalue; if (details.offset.dx > minimumDrag) { user.isSwipedOff = true; save(user.imgUrl, 'Dog'); } myvalue = read(user.imgUrl); print(myvalue); }
此时控制台输出的是Instance of 'Future',而我期望的是存储的字符串'Dog'。
最终解决方法
在@Stijn2202的帮助下,我终于找到问题根源:async函数默认返回Future类型,必须在async环境下用await来获取实际的返回值。
修改步骤如下:
- 给调用函数
onDragEnd添加async关键字,同时修改返回类型为Future<void>:
Future<void> onDragEnd(DraggableDetails details, User user) async
- 调用
read函数时使用await关键字获取实际字符串值:
final String myvalue = await read(user.imgUrl); print(myvalue); // 现在能正确输出'Dog'了
这样就完美解决了问题,终于可以把读取到的值用于后续的字符串处理逻辑中。
内容的提问来源于stack exchange,提问作者Calamari
相关产品推荐
相关产品推荐

