如果是两个相邻的 widget,可以通过回调的方式,将数据传递给父 widget,然后父 widget 再传递给另一个子 widget,也可以用 bloc 来实现。一般默认的情况下,一级一级传递 bloc 也能实现,只要 bloc 更新了数据,页面上的 UI 就会更新。
Bloc 不起作用了
但是这次遇到的情况不一样,万能使用的 bloc 也不起作用了。这次的情况是,在一个页面上使用了 showAppModalBottomSheet,在这个弹出的页面上,我使用了 bloc 来更新数据,但是页面上的 UI 并没有更新。
原因就是,这个 bloc 是点击按钮的时候弹出 widget 传过来的,这个时候如果原来的 bloc 进行了更新,弹出的 widget 并不会更新。(这个是我自己的理解,可能不准确)
使用绝招全局 Provider
一般情况不是两个直接关系的 widget,而是跨 widget 的数据更新,这时候可以使用Provider或者Riverpod及EventBus来实现。
这次我使用全局 Provider来实现跨 widget 的数据更新。
之前一直挺好的,我在页面上使用了Consumer
来更新。
这次我加了 provider 的 Listener,发现页面上的数据更新了,但是出现了恼人的错误 flutter出现这个错误,'_lifecycleState != _ElementLifecycle.defunct': is not true.
这个错误就空洞了,没有具体的含义,只能靠自己的经验来猜测解决,尝试了很多方法,最后理解了。
最后解决
最后发现是 showAppModalBottomSheet 这个 calendar,因为一次性更新了所有的记录数据,导致其他月份的数据也更新了,但是页面上的 UI 只是停留在当前的月份,其他月份相当于已经销毁了,所以就出现了这个错误。
把 calendar 初始化的时候指定了当前的月份,就解决了这个问题。