因此,我正在使用Sparkline库进行抖动来创建折线图,当我使用静态列表Eg时,它可以工作。 ([0,10,20,20,30])。但是我想做到这一点,以便每说10秒就会增加一个值,现在可以是任何东西,但是以后我想从firebase中提取该值。
我已经看过其他人尝试多次运行函数的其他示例,但是它不起作用。我知道我需要重新绘制小部件,但是我认为我做的不正确,或者我遗漏了一些东西。
class BikeState extends State<BikeScreen> {
Timer timer;
List<double> speedList = new List();
Sparkline speedChart1 = Sparkline(data: [0],);
void updateChart(Timer timer){
speedChart1 = Sparkline(data: speedList,);
speedList.add(10);
speedChart1 = Sparkline(data: speedList,);
}
@override
void initState() {
super.initState();
timer = Timer.periodic(Duration(seconds: 15), updateChart);
}
@override
void dispose() {
timer?.cancel();
super.dispose();
}
运行它时发生的所有事情就是,我得到的图形只有在声明它时就将值传递给它,而没有任何改变。
答案 0 :(得分:0)
Flutter不会自行为您重新绘制或重建任何小部件。在您的情况下,您已经有一个有状态的小部件,这是正确的方法,但是您还需要告诉flutter您的状态已更改。这是通过使用setState
这样的方法完成的:
void updateChart(Timer timer) {
setState(() {
speedChart1 = Sparkline(data: speedList,);
speedList.add(10);
speedChart1 = Sparkline(data: speedList,);
});
}
另外,根据您的build
方法的外观,我认为您应该从状态中删除Sparkline窗口小部件,并纯粹在构建过程中使用它,如下所示:
class BikeState extends State<BikeScreen> {
Timer timer;
List<double> speedList = new List();
void updateChart(Timer timer){
setState(() {
speedList.add(10);
});
}
@override
void initState() {
super.initState();
timer = Timer.periodic(Duration(seconds: 15), updateChart);
}
@override
void dipose() {
timer?.dipose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Sparkline(data: speedList);
}
}