【问题标题】:returning a String when getting error: type 'Future<dynamic>' is not a subtype of type 'String'出现错误时返回字符串:类型“Future<dynamic>”不是“String”类型的子类型
【发布时间】:2021-09-27 06:40:55
【问题描述】:

我不知道如何从 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;
  }

当我从我的应用程序调用这个函数时(这是一个简化的 sn-p):

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&lt;void&gt; onDragEnd(DraggableDetails details, User user) async 然后从方法中调用读取函数:

final String myvalue = await read(user.imgUrl);

【问题讨论】:

    标签: flutter dart sharedpreferences


    【解决方案1】:

    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;
    }
    

    编辑:

    根据您的代码 sn-p,这就是您应该如何调用 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&lt;void&gt;,但如果不是,请告诉我

    【讨论】:

    • 非常感谢您的快速回复,并感谢 Future 的建议。我不再收到错误消息,但是如何将此“Future”转换为可以使用的“String”变量?当我尝试使用它时,我只看到“'Future'的实例”
    • 啊,是的,我应该提到你需要在你调用它的代码中等待你的函数。你能在你调用read(key)的地方添加一个sn-p代码吗?
    • 谢谢@Stijn2210 我已经用更多信息更新了这个问题......
    • 欣赏它,伙计!
    • 完美!!我也只需要在函数中添加一个异步......@Stijn2210 非常感谢......说真的,伙计......我已经被困了几个小时,所以非常感谢你的专业知识!祝你一切顺利!
    【解决方案2】:

    等待价值。它将返回 Dog 而不是 Future 的实例。

    String someName=await myvalue;

    由于值为Future,await关键字会等到任务完成后返回值

    【讨论】:

    • onDragEnd 必须标记为 async 并且必须是 Future&lt;void&gt; 类型
    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2021-12-01
    • 2020-12-09
    • 2023-01-10
    相关资源
    最近更新 更多