首页 > 解决方案 > 出现错误时返回字符串:输入“未来”' 不是类型 '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);

标签: flutterdartsharedpreferences

解决方案


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>,但如果不是,请告诉我


推荐阅读