flutter - 出现错误时返回字符串:输入“未来”' 不是类型 'String' 的子类型
问题描述
我不知道如何从 Dart(Flutter 应用程序)中的函数返回字符串。
我正在使用 SharedPreferences 来捕获用户的输入。我有两个功能,一个是保存首选项:
save(key, value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(key, value);
print('saved $value');
}
和一个阅读偏好:
read(key) async {
final prefs = await SharedPreferences.getInstance();
final value = prefs.getString(key) ?? 0;
print('$value');
}
这是可行的,但是当我尝试用返回替换打印行时:
read(key) async {
final prefs = await SharedPreferences.getInstance();
final value = prefs.getString(key) ?? 0;
return('$value');
}
要返回该值的字符串,它会引发错误:
“未来”类型不是“字符串”类型的子类型
我试过用很多不同的方式来称呼它,但无法弄清楚我认为是一个非常基本的问题。我在一些帖子中注意到这是一个建议的解决方案,它可以打印出值,但我不想打印它,我希望它作为一个字符串变量:
read(mykey).then((value) => '$value');
我需要将该值与其他一些其他字符串值组合并进行一些小的操作(因此打印它没有帮助)
更新
我已经按照@Stijn2210 的建议定义了该函数,但在获取我需要的输出时仍然遇到问题。
Future<String> read(key) async {
final prefs = await SharedPreferences.getInstance();
final value = await 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);
它正在打印:
“未来”的实例
而我希望 myvalue 成为“狗”......感谢任何见解!
非常感谢您的回答@Stijn2202
解决方案是编辑方法定义:
Future<void> onDragEnd(DraggableDetails details, User user) async
然后从方法中调用 read 函数:
final String myvalue = await read(user.imgUrl);
解决方案
getString
是一个未来,你可以通过使用来处理它,await
或者像你正在做的那样,使用then
但是,在我看来,使用await
是您更好的选择。这看起来像这样:
Future<String> getMyString() async {
final prefs = await SharedPreferences.getInstance();
final value = await prefs.getString(key) ?? '';
// Don't use 0, since it isnt an int what you want to return
return value;
}
编辑:
根据您的代码片段,这就是您应该如何调用您的read
方法:
Future<void> onDragEnd(DraggableDetails details, User user) async {
final minimumDrag = 100;
if (details.offset.dx > minimumDrag) {
user.isSwipedOff = true;
save(user.imgUrl, 'Dog');
}
final String myvalue = await read(user.imgUrl);
print(myvalue);
}
现在我不确定是否onDragEnd
真的允许Future<void>
,但如果不是,请告诉我
推荐阅读
- xamarin.forms - Dynamically hiding Xamarin Forms ListView item and setting the height of invisible item to 0 not working on iOS
- python - selenium and lxml - how to set html?
- swift - SKSpriteNode 在其物理体为动态时不会出现
- javascript - 如何在 jsx 中使用 tabIndex?
- eclipse - Eclipse (atollic) Pre-Build 命令格式
- docker - 启动 Hasura GraphQL 引擎 Docker 镜像
- xml - `elementFormDefault` 有时不起作用
- r - gganimate 包:参数“fps”必须是 100 的因子
- javascript - 在第一个下拉菜单中选择不同选项后,如何重置第三个动态下拉菜单?
- c - 试图用一些散列来篡改我的可执行文件,但遇到一些意外和未知的编译器行为