【问题标题】:I have a Dart problem when I use map in a stream在流中使用 map 时遇到 Dart 问题
【发布时间】:2020-07-10 12:59:11
【问题描述】:

我创建了一个简单的流,添加一些元素并监听流。但是当我在流上使用地图时出现问题。为简单起见,我只是将值映射到相同的值(我猜?)。

当我尝试运行程序时出现地图错误:

Uncaught Error: TypeError: Instance of '_MapStream<String, dynamic>': type '_MapStream<String, dynamic>' is not a subtype of type 'Stream<String>'
import 'dart:async';

void main() async {

  StreamController controller = StreamController<String>.broadcast();

  final StreamTransformer transformer = StreamTransformer<String, String>.fromHandlers(
    handleData: (data, EventSink sink) {
        sink.add(data);
    }
  );
 
  Stream stream = controller.stream;

  stream
    .map((value) => value) // <-- Problem in this line
    .transform(transformer)
    .listen(
      (data) {
        print('listen: $data');
      },
      onError: (err) => print(err));
  
  controller.add('foo');
  controller.add('baa');

  controller.close();
}

【问题讨论】:

    标签: dictionary dart stream


    【解决方案1】:

    您的问题是您从泛型类型中强制使用非泛型类型。如果您在不使用显式键入的情况下编写这样的代码:

    import 'dart:async';
    
    void main() async {
      final controller = StreamController<String>.broadcast(); // <-- fixed here
    
      final StreamTransformer transformer =
          StreamTransformer<String, String>.fromHandlers(
              handleData: (data, EventSink sink) {
        sink.add(data);
      });
    
      final stream = controller.stream;  // <-- fixed here
    
      stream
          .map((value) => value) // <-- Problem in this line
          .transform(transformer)
          .listen((data) {
        print('listen: $data');
      }, onError: (err) => print(err));
    
      controller.add('foo');
      controller.add('baa');
    
      controller.close();
    }
    

    然后,Dart 将自动确定类型是 StreamController&lt;String&gt;Stream&lt;String&gt;,而不是您正在强制执行的 StreamControllerStream

    当您删除类型的泛型部分时,您也删除了 Dart 猜测您正在调用的所有方法的类型的能力。

    如果使用显式类型,你应该写:

    import 'dart:async';
    
    void main() async {
      StreamController<String> controller = StreamController<String>.broadcast();
    
      final StreamTransformer transformer =
          StreamTransformer<String, String>.fromHandlers(
              handleData: (data, EventSink sink) {
        sink.add(data);
      });
    
      Stream<String> stream = controller.stream;
    
      stream
          .map((value) => value) // <-- Problem in this line
          .transform(transformer)
          .listen((data) {
        print('listen: $data');
      }, onError: (err) => print(err));
    
      controller.add('foo');
      controller.add('baa');
    
      controller.close();
    }
    

    【讨论】:

    • 感谢您的回答。只是一个评论。为什么错误只出现在地图行:.map((value) => value) //
    • 错误来自您的.transform(transformer)。您的transformer 被设为StreamTransformer&lt;String, String&gt; 类型,这意味着它需要String 并将其转换为String。但是因为map 无法确定value 的返回类型,所以大多数假设valuedynamic。所以map 返回一个与您的变压器不兼容的Stream&lt;dynamic&gt;
    • 我应该补充一点,你可以通过写.map&lt;String&gt;((value) =&gt; value) 告诉map 它将在运行时返回什么类型。这也将修复您的代码,但通常您不应该丢弃类型的通用部分。
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多