Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振率限值/去抖器设计实现_Flutter_Dart - Fatal编程技术网

Flutter 颤振率限值/去抖器设计实现

Flutter 颤振率限值/去抖器设计实现,flutter,dart,Flutter,Dart,我正在为一个朋友开发一个小应用程序,他正在尝试购买经常售罄的鞋子,这个应用程序使用一个web刮板加载一个网站,并每隔一段时间检查其部分内容作为状态检查(不想频繁点击) 我注意到的问题是,所有这些操作都是在小部件的构建阶段完成的。正如你可能看到的,这不是一个好的选择。当我在桌面上重新调整应用程序的大小时,会多次快速调用build方法,这会导致多次调用来刮取不需要的网站 以下是代码的现状: //我想应该移到控制器中 //或者至少在某个地方在每次重建期间“消除”网络刮伤 Stream productC

我正在为一个朋友开发一个小应用程序,他正在尝试购买经常售罄的鞋子,这个应用程序使用一个web刮板加载一个网站,并每隔一段时间检查其部分内容作为状态检查(不想频繁点击)

我注意到的问题是,所有这些操作都是在小部件的构建阶段完成的。正如你可能看到的,这不是一个好的选择。当我在桌面上重新调整应用程序的大小时,会多次快速调用build方法,这会导致多次调用来刮取不需要的网站

以下是代码的现状:

//我想应该移到控制器中
//或者至少在某个地方在每次重建期间“消除”网络刮伤
Stream productChecker(持续时间最小间隔,持续时间最大间隔)异步*{
断言(最大间隔>最小间隔);
//开始不断地检查
做{
//发出我们再次检查的信号
无效产量;
//构造调用之间等待的持续时间
Duration waitTime=minInterval+Duration(毫秒:math.Random().nextInt((maxInterval-minInterval.in毫秒));
bool loaded=wait scraper.loadWebPage(未编码路径);
bool-isInStock=false;
如果(已加载){
final inStockElements=scraper.getElement(cartButtonId,[]);
断言(inStockElements.isNotEmpty);
最终inStockElement=inStockElements[0];
isInStock=inStockElement['title']!=cartButtonInStockContent;
打印(“库存:$isInStock”);
}
已加载产量?isInStock:假;
打印(${DateTime.now().toIso8601String()}:等待${waitTime.unseconds}秒);
等待未来。延迟(等待时间);
}虽然(正确);
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:productChecker(5秒,30秒),
生成器:(上下文,异步快照){
if(snapshot.hasData){
返回snapshot.data!=null?
snapshot.data!?提升按钮(按下时:()=>launch(baseUrl+unencodedPath),子项:'In Stock'。text.make()):
“缺货”。text.make():
循环前进指示器();
}否则{
返回循环ProgressIndicator();
}
},
);
}
所以我的问题是:


我应该如何实现一个控制器来跟踪网站最后一次被刮取的时间,以及在冷却期间忽略刮取请求的冷却时间?

这是一个更广泛的答案,但对于像Flatter这样的反应式框架,您确实希望将业务逻辑与视图逻辑分开。您的问题是,您的业务逻辑位于构建函数中,该函数纯粹用于视图逻辑。我不太熟悉StreamBuilder,但我认为您可以利用有状态小部件中的普通构建功能来实现您想要的功能

一个小部件会让你的刮板进入
initState()
/
dispose()
函数。设置一些包含视图所需信息的值,然后根据isInStock的状态,构建将包含3个显示。 *记住当您更改isInStock以使用该函数时
setState((){isInStock=true;})
setState确保更新状态后视图重建

  • 如果为空,则表示刮板仍在等待数据,显示 加载视图
  • 如果为true,则显示启动按钮
  • 如果为false,则显示缺货文本
重建不会触发业务逻辑,因为它在构建之外,所以现在您需要做的就是担心业务逻辑,然后视图将反映它的结果