【问题标题】:convert Stream<List<String>> to List<String> in flutter在颤动中将 Stream<List<String>> 转换为 List<String>
【发布时间】:2020-09-15 04:13:30
【问题描述】:

我正在尝试在颤振中转换 Stream&lt;List&lt;String&gt;&gt; to List&lt;String&gt; 这是我的代码

Stream<List<String>> _currentEntries;

/// A stream of entries that should be displayed on the home screen.
Stream<List<String>> get categoryEntries => _currentEntries;

_currentEntries 正在填充来自数据库的数据。 我想将_currentEntries 转换为List&lt;String&gt;

我尝试了以下代码但不起作用:

List<List<String>> categoryList () async  {
  return await _currentEntries.toList();
}

我收到以下错误:

List&lt;List&lt;String&gt;&gt; 类型的值无法从方法 categoryList 返回,因为它的返回类型为 List&lt;List&lt;String&gt;&gt;

有人可以帮助解决这个问题并将Stream&lt;List&lt;String&gt; 转换为List&lt;String&gt; 吗?

【问题讨论】:

  • 能否分享一下从数据库返回的数据以及您希望如何格式化?
  • @SanjaySharma 问题中解释了数据库中的数据类型。

标签: flutter dart


【解决方案1】:

正如标题所说,问题是如何将某些项目的流转换为项目。所以克里斯托弗的回答是可以的,但前提是你想从流中获取第一个值。由于流是异步的,它们可以在任何时间点为您提供一个值,您应该处理来自流的所有事件(不仅仅是第一个事件)。

假设您正在观看来自数据库的流。您将在每次数据库数据修改时从数据库中收到新值,并且您可以根据新收到的值自动更新 GUI。但如果您只是从流中获取第一个值,则不会,它只会在第一次更新。

您可以通过在流上使用listen() 方法来获取任何值并处理它(“转换它”)。你也可以在 Medium 上查看这个写得很好的tutorial。干杯!

 Stream<List<String>> _currentEntries = watchForSomeStream();

 _currentEntries.listen((listOfStrings) {
    // From this point you can use listOfStrings as List<String> object
    // and do all other business logic you want

    for (String myString in listOfStrings) {
      print(myString);
    }
 });

【讨论】:

  • 这个解决方案非常适合转换。
【解决方案2】:

我不知道 Stream 可以 等待 来自服务器的 API 调用,在我的情况下,我使用 BLOC 模式并使用 Future&lt;List&lt;String&gt;&gt; getCategoryList async () {...} 并获取我将要使用的列表这个:

Future<List<String>> getCategory() async {
    var result = await http.get();
    //Some format and casting code for the String type here
    return result;
}

希望有帮助

【讨论】:

    【解决方案3】:

    问题似乎与categoryList 的返回类型有关。当Stream 仅包含一层List 时,您将以List 的Lists 的身份返回。返回类型应为Future&lt;List&lt;String&gt;&gt;。

    除了await 之外,使用.first、.last 或.single 只获取一个元素,并且应该删除toList()。

    Future<List<String>> categoryList () async  {
      return await _currentEntries.first;
    }
    

    还有一个快速提示:Dart 会自动为所有字段生成 getter 和 setter,因此您显示的 getter 方法不是必需的。

    【讨论】:

    • 嗨克里斯托弗,谢谢你的回答。我面临一个小问题是我正在调用 categoryList 函数并将其分配给 List 例如 List lit = bloc.categoryList();这会产生错误:future> 的值不能分配给变量 List。我该如何解决这个问题?
    • @yoohoo 你必须await Future。 List&lt;String&gt; lit = await bloc.categoryList(); 也是如此
    • 教科书解决方案有效List&lt;int&gt;? _audioStreamList = await _audioStreamCast?.first;
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2021-07-22
    • 2019-09-10
    • 2021-09-26
    • 2021-01-13
    相关资源
    最近更新 更多