收到错误时返回字符串:类型 'Future<dynamic>' 不是类型 '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');
}

为了返回值的字符串,它抛出一个错误:

类型"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关键字将等待任务完成并返回值

相关内容

  • 没有找到相关文章

最新更新