【问题标题】:Streambuilder not receiving some snapshot dataStreambuilder 没有收到一些快照数据
【发布时间】:2019-01-13 14:30:16
【问题描述】:

我只是在测试来自 GPS 的一些流。我可以直接插入 gps 流,但我想暂时将其分开。所以我可以将 StreamBuilder 与我自己创建的流一起使用。

这一切似乎都在工作,但 Streambuilder 似乎“错过”了某些快照,这让我感到困惑。难道不应该保证从流中接收所有数据(如果它不是广播)?还是我错误地使用了流?

如果您查看添加/接收的数据,我可以看到计数 5 和 7 都已添加,但从未收到。如果我只是在没有 StreamBuilder 的情况下“收听”数据,所有数据似乎都会出现。

Streambuilder 代码:

Widget build(BuildContext context) {

    final ApplicationBloc bloc = BlocProvider.of<ApplicationBloc>(context);

    return StreamBuilder<Map<String, dynamic>>(
        stream: bloc.gps.stream,
        builder: (BuildContext context, AsyncSnapshot<Map<String, dynamic>> snapshot){
          if( snapshot.hasData ) {
            print("Receiving ${snapshot.data['count']}");
            return Text("${snapshot.data['timestamp']}\n${snapshot.data['latitude']},${snapshot.data['longitude']}\n",
              style: Theme.of(context).textTheme.display1,);
          } else {
            return Text('waiting for GPS...', style: Theme.of(context).textTheme.display1,);
          }
        }
    );

  }

添加到流代码:

var locationOptions = LocationOptions(accuracy: LocationAccuracy.bestForNavigation, distanceFilter: 0, timeInterval: 1, forceAndroidLocationManager: false);

    final Geolocator geoLocator = new Geolocator();
    geoLocator.getPositionStream( locationOptions ).listen(
            (Position position) {
              _count++;
              Map<String, dynamic> listenerCurrentLocation = {
                'latitude'  : position.latitude,
                'longitude' : position.longitude,
                'speed'     : position.speed,
                'accuracy'  : position.accuracy,
                'altitude'  : position.altitude,
                'timestamp' : position.timestamp,
                'count'     : _count,
              };
              print( "Adding: $listenerCurrentLocation");
              gpsController.sink.add( listenerCurrentLocation );
            });

运行控制台的输出

I/flutter (16345): Receiving 2
I/flutter (16345): Adding: {latitude: 50.829798333333336, longitude: -0.18484833333333334, speed: 0.0, accuracy: 20.0, altitude: 11.7, timestamp: 2019-01-13 14:21:02.000Z, count: 3}
I/flutter (16345): Receiving 3
I/flutter (16345): Adding: {latitude: 50.829798333333336, longitude: -0.18484833333333334, speed: 0.0, accuracy: 20.0, altitude: 11.7, timestamp: 2019-01-13 14:21:03.000Z, count: 4}
I/flutter (16345): Receiving 4
I/flutter (16345): Adding: {latitude: 50.829798333333336, longitude: -0.18484833333333334, speed: 0.0, accuracy: 20.0, altitude: 11.7, timestamp: 2019-01-13 14:21:04.000Z, count: 5}
I/flutter (16345): Adding: {latitude: 50.829798333333336, longitude: -0.18484833333333334, speed: 0.0, accuracy: 20.0, altitude: 0.0, timestamp: 2019-01-13 14:21:04.000Z, count: 6}
I/flutter (16345): Receiving 6
I/flutter (16345): Adding: {latitude: 50.829798333333336, longitude: -0.18484833333333334, speed: 0.0, accuracy: 20.0, altitude: 11.7, timestamp: 2019-01-13 14:21:05.000Z, count: 7}
I/flutter (16345): Adding: {latitude: 50.829798333333336, longitude: -0.18484833333333334, speed: 0.0, accuracy: 20.0, altitude: 0.0, timestamp: 2019-01-13 14:21:05.000Z, count: 8}
I/flutter (16345): Receiving 8

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    这是预期的行为。

    与使用stream.listen 不同,StreamBuilder 仅在请求新框架时调用其构建器。

    这很好,因为应该使用StreamBuilder 来构建布局,在这种情况下,即使错过了值也没关系。

    如果不希望出现这种行为,请考虑改为手动收听:

    Stream stream;
    StreamSubscription sub;
    
    initState() {
      super.initState();
      sub = stream.listen((value) {
        // do something with `value`
      });
    }
    
    
    dispose() {
      sub.cancel();
      super.dispose();
    }
    

    【讨论】:

    • 什么决定了何时请求新帧,我认为这是新数据到达的时间?我试图了解用户是否会在显示器上没有重要信息。我没有在任何地方调用 setState,所以它根本不会显示。我认为 StreamBuilder 的想法是避免调用 setState ?
    • 这取决于所使用的设备,例如屏幕的刷新率或其性能。在 30 fps 的情况下,您的 StreamBuilder 将被最多每秒调用 30 次。
    • StreamBuilder 内部调用setState
    猜你喜欢
    • 2021-07-01
    • 2023-02-11
    • 2020-04-16
    • 2023-03-29
    • 2021-10-21
    • 2021-09-30
    • 2019-09-19
    • 2021-08-08
    • 2021-12-06
    相关资源
    最近更新 更多