我不知道如何从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');
}
为了返回值的字符串,它抛出一个错误:
类型"Future"不是类型"String"的子类型
我试过用很多不同的方法来称呼它,但我不知道我认为这是一个非常基本的问题。我在一些帖子中注意到,这是一个建议的解决方案,可以打印出值,但我不想打印它,我希望它作为字符串变量:
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);
正在打印:
"未来"的实例
尽管我希望我的值是"狗"。。。感谢您的真知灼见!!
非常感谢您的回答@Stijn2202
解决方案是编辑方法定义:Future<void> onDragEnd(DraggableDetails details, User user) async
然后从方法中调用读取函数,方法如下:
final String myvalue = await read(user.imgUrl);
getString
是一个Future,您可以使用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>
,但如果它不是,请告诉我
只需等待值。它将返回Dog而不是Future的实例。
String someName=await myvalue;
由于值为Future,wait关键字将等待任务完成并返回值