在我的Flatter应用程序中,我想每10秒判断一次api.我发现每x时间运行一个函数需要this post次,并执行了以下操作:

class _MainPage extends State<MainPage> {
  int starter = 0;

  void checkForNewSharedLists(){
    // do request here
    setState((){
      // change state according to result of request
    });

  }

  Widget build(BuildContext context) {
    Timer.periodic(Duration(seconds: 15), (Timer t) => checkForNewSharedLists());
  }
} 

不幸的是,请求堆积起来:在第一轮重启应用程序后,有两个对API的请求,第二轮是4个请求,第三轮是8个请求,依此类推……

有人知道怎么解决这个问题吗?

推荐答案

build()可以并且通常会被多次调用,并且每次创建新的Timer.periodic时都会调用.

你需要把代码移出build(),比如

Timer? timer;

@override
void initState() {
  super.initState();
  timer = Timer.periodic(Duration(seconds: 15), (Timer t) => checkForNewSharedLists());
}

@override
void dispose() {
  timer?.cancel();
  super.dispose();
}

更好的做法是将这些代码完全从API层或类似的小部件中移出,并使用StreamBuilder更新视图,以防数据更新.

Flutter相关问答推荐

如何在WidgetRef引用外部的函数中使用Riverpod刷新数据

如何在Ffltter Chrome应用程序中使用webview_fltter_web显示自定义html而不是外部uri?

有没有一种正确的方法可以通过上下滑动在两个小部件(在我的情况下是应用程序栏)之间切换?

如何知道当前屏幕是否处于抖动状态?

flutter -当使用SingleChildScrollView包装我的列小部件时,它不会填充整个高度

将图标呈现在Flutter 克牌小工具的角落上

如何创建这样的按钮

无法将新文物与Flutter 项目集成在一起

如何在 Dart/Flutter 中克隆 Future

Flutter Web Dio XMLHttpRequest 上传大文件时出错

如何使用 Material3 创建带有高度的完美白色提升按钮?

自定义类提供程序 Riverpod Flutter 中的可变变量

Flutter - firebase_auth_web 5.4.0 依赖于 intl ^0.17.0 但我必须使用更高版本 (intl ^0.18.0)

Flutter 判断 Uint8List 是否有效 Image

Flutter 自定义对齐

Flutter 构建方法使用的是旧版本的变量?

为什么 orientation == Orientation.portrait 总是正确的,尽管我的设备已经处于横向

如何在dart中编写多个条件?

从 Uint8List 或图像对象创建 InputImageData 用于 Google ML Kit 人脸检测

如何从圆角go 除背景 colored颜色