【问题标题】:how do I work with file streams in dart/flutter?如何在 dart/flutter 中处理文件流?
【发布时间】:2021-09-03 12:48:14
【问题描述】:

我是 dart/flutter 编程的新手。我一直在尝试分析文件的内容并返回结果但不能。该代码实际上在 main 函数中有效,但是一旦我将其取出,它就不再有效了。我已经阅读了有关 futures、async、await 和流的 dart 教程以及观看了 YouTube 视频,但仍然无法解决问题。我相信我的问题围绕着这些概念。这是我的代码:

Future<String> r(String name) async {
  var f = File(name);
  var lines = f.readAsLines();

  await lines
      .then((line) => line.forEach((element) {
            if (element.contains(RegExp(r'^hello'))) {
              return element;
            }
          }))
      .onError((error, stackTrace) => 'An error occured');
}

我遇到了 2 个错误:

  1. 函数名“r”有下划线:
The body might complete normally, causing 'null' to be returned, but the return type is a potentially non-nullable type.
Try adding either a return or a throw statement at the end.
  1. 变量“元素”有下划线:
The return type 'String' isn't a 'void', as required by the closure's context.

谢谢。

【问题讨论】:

  • forEach 不会返回任何内容,并且从其回调中返回值也不会做任何事情。 Prefer using a normal for loop.
  • @jamesdlin。太感谢了。这很有帮助。

标签: flutter dart asynchronous stream future


【解决方案1】:

您的第一个错误是“无论发生什么,您都必须返回一个字符串”

您的第二个错误表明您正在尝试在 void 函数中返回一个字符串,如您所见 List。 Foreach 是一个 void 函数,您不能只在其中返回某些内容,因为 return 语句与最接近的函数匹配

所以我重写了你的代码如下

Future<String> r(String name) async {
  try {
    var f = File(name);
    var lines = await f.readAsLines();
    for (var element in lines)
      if (element.contains(RegExp(r'^hello'))) {
        return element;
      }
    return "not found";
  } catch (e) {
    return 'An error occurred: $e';
  }
}

由于您使用的是 File 和 File.readAsLines,我认为将所有内容都包装在 try catch 块中会更好。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2020-06-24
    • 2020-09-12
    • 2021-03-02
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2020-05-27
    • 2021-01-03
    相关资源
    最近更新 更多