StreamBuilder 更新性能(一个与多个)

Kak*_*ime 3 performance dart flutter stream-builder

更新具有多个子级的单个父级小部件与单独更新每个子级小部件之间的性能差异是什么?

哪个性能更高以及性能提高了多少:

StreamBuilder(
  stream:sameStream,
  builder(ctx,snapshot){
    return Column(
      children:[
       Text("1"),
       Text("2"),
       Text("3")
      ]
    ) 
  }
)
Run Code Online (Sandbox Code Playgroud)

或者

Column(
  children:[
    StreamBuilder(
      stream:sameStream,
      builder(ctx,snapshot){
        return  Text("1"):
      }
    ),
    StreamBuilder(
      stream:sameStream,
      builder(ctx,snapshot){
        return  Text("2"):
      }
    ),
    StreamBuilder(
      stream:sameStream,
      builder(ctx,snapshot){
        return  Text("3"):
      }
    )
  ]
)
Run Code Online (Sandbox Code Playgroud)

另一个问题:如果我们将子窗口部件缩放到 100 会发生什么?性能有变化吗?

7ma*_*ada 6

拥有更多相同Stream(或任何其他状态)的侦听器会降低性能。添加监听器时检查此基准

值通知器基准: https: //github.com/knaeckeKami/changenotifier_benchmark

ChangeNotifier 基准:https://github.com/flutter/flutter/pull/62330

拥有一个只有一个监听器的昂贵小部件列表也会降低性能(当它们全部重建时)。

无论如何,如果您对多个子级使用同一个 Stream,则应该只使用一个侦听器,因为当状态更改时,无论它们位于同一个侦听器上还是其中任何一个侦听器都有侦听器,它们都会收到重建调用,但在第二种情况下当状态改变时,流必须做更多的工作来通知它拥有的每个监听器。

我遇到了你的问题,当你有一个(状态)列表时就会发生这种情况,是的,如果你可以有一个监听器,当状态发生变化时通知会更快,但重建所有他们不知道的孩子也可能会很广泛没有任何更新。

这种情况的解决方案是使用可用于覆盖特定小部件或使用方法的另一个提供程序的 ProviderScope表单。Riverpod.select