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)
谢谢
正如@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)