如何在 Flutter 中使用 Streams 更新时间?

And*_*son 3 datetime stream dart flutter

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

这是我到目前为止的代码。如果我对控制器和订阅使用 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

p2h*_*ari 6

正如@pskink提到的,你可以使用Stream.periodic。

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

    timer.listen((data)=> print(data));
Run Code Online (Sandbox Code Playgroud)