如何使用Flutter中的流更新时间?

我一直在研究流的使用,因为我认为这将是我的应用程序的最佳解决方案。我希望能够按特定的时间间隔检查时间,然后根据太阳是否升起或落下来自动更改地图的主题。我有主题,也有sun代码,但是我需要将它们结合在一起。

到目前为止,这是我的代码。如果我对控制器和订阅使用double并只是生成一个随机数,那么一切都很好。我每秒都会得到一个不同的随机生成的数字。

但是,使用下面的代码只是简单地显示了同一时间。

有人可以以此指向我正确的方向吗?

import 'dart:async';
import 'dart:core';

import 'package:flutter/material.dart';

void main() => runApp(StreamTest());

class StreamTest extends StatefulWidget {
  @override
  _StreamTestState createState() => _StreamTestState();
}

class _StreamTestState extends State<StreamTest> {
  StreamController<DateTime> controller =
      StreamController<DateTime>.broadcast();
  StreamSubscription<DateTime> streamSubscription;
  DateTime currentTime = DateTime.now();

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Stream Demo",home: Scaffold(
        body: Center(
          child: Row(
            mainAxisSize: MainAxisSize.min,children: <Widget>[
              MaterialButton(
                color: Colors.yellow,child: Text("Subscribe"),onpressed: () async {
                  getTime().listen((value) {
                    print('CURRENT TIME $currentTime');
                  });
                },),MaterialButton(
                child: Text('Unsubscribe'),color: Colors.red[200],onpressed: () {
                  streamSubscription.cancel();
                },],);
  }
}

Stream<DateTime> getTime() async* {
  DateTime currentTime = DateTime.now();
  while (true) {
    await Future.delayed(Duration(seconds: 1));
    yield currentTime;
  }
}

谢谢

beijing000001 回答:如何使用Flutter中的流更新时间?

while(true)循环中,您将产生与之前设置的变量相同的变量。如果将其更改为yield DateTime.now(),它将在每次迭代时生成新值。

还可以在 print 调用中将变量更改为 value print('CURRENT TIME $value');

要稍后取消订阅,请存储 listen 方法返回的值:

streamSubscription = getTime().listen((value) {

结果:

I/flutter ( 5716): CURRENT TIME 2019-11-14 13:50:34.318898
I/flutter ( 5716): CURRENT TIME 2019-11-14 13:50:35.323906
I/flutter ( 5716): CURRENT TIME 2019-11-14 13:50:36.328085
I/flutter ( 5716): CURRENT TIME 2019-11-14 13:50:37.332919
,

如@pskink所述,您可以使用Stream.periodic。

DateTime current = DateTime.now();
Stream timer = Stream.periodic( Duration(seconds: 1),(i){
       current = current.add(Duration(seconds: 1));
      return current;
    });

    timers.listen((data)=> print(data));
本文链接:https://www.f2er.com/3102203.html

大家都在问