Flutter Provider - 在值更改时调用函数而不调用 build()

Posted

技术标签:

【中文标题】Flutter Provider - 在值更改时调用函数而不调用 build()【英文标题】:Flutter Provider - Call function on value change without calling build() 【发布时间】:2022-01-22 01:05:58 【问题描述】:

我想知道是否可以观察 initState 中的值变化,然后简单地调用一个函数?

考虑到我正在使用 Provider 观察的类的状态,我基本上需要启动和停止计时器(听:真),并且希望有一些回调功能可以触发,而不是每次都调用 build()?

例如类似..

void initState() 
  super.initState();
  Provider.of<MyService>(context, listen: true).serviceRunning =>  
     //do stuff (start/stop my local timer)
     if(serviceRunning) 
       serviceRunning()
      else 
       serviceStopped()
     
  


void serviceRunning() 
  //start local timer and other bits


void serviceStopped() 
  //stop local timer and other bits


Widget build(BuildContext context) 
  ..

我不记得 Provider 能够做到这一点,所以如果有任何关于如何实现这一点的建议,我将不胜感激。如上所述,我只是想避免不必要地调用 build()。

【问题讨论】:

【参考方案1】:

这里不是提供者用户(bloc fan),但您应该能够使用服务公开的 ValueNotifier 做您想做的事。在您的 initState 中,您将向通知程序添加一个侦听器。

而且我相信你可以通过使用context.select&lt;T, R&gt;(R cb(T value)) 来避免构建调用,它允许小部件只监听 T 的一小部分。 提供者文档摘录:

Widget build(BuildContext context) 
  final name = context.select((Person p) => p.name);
  return Text(name);

但我不确定这是否有必要。

如果您找到更简洁的解决方案,请分享,学习在 Flutter 社区的其他部分有效的方法总是很好。

【讨论】:

以上是关于Flutter Provider - 在值更改时调用函数而不调用 build()的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - Provider - 如何根据 Provider 的值更改 UI?

Flutter - Provider 变量更改时触发导航

Flutter:如何在 Flutter 中使用 Switch 更改主题 - 我已经使用 Provider 实现了这个明暗主题,但不能使用 switch 更改

更改一个 Provider 中的属性会将另一个 Provider 中的属性更改为 List Flutter

如何在flutter的build方法中调用provider中的方法?

使用上下文和观察更改模型时,Flutter Provider 不会触发重建