doBuild method

Widget doBuild(
  1. Widget build(),
  2. void markNeedsBuild()
)

Implementation

Widget doBuild(Widget Function() build, void Function() markNeedsBuild) {
  late Widget result;

  nonTracking(() {
    final (signals, widget) = recordSignals(build);

    final newSignals = signals.where((it) => !subscriptions.containsKey(it));
    final unusedSignals = subscriptions.keys.where((it) => !signals.contains(it)).toList();

    for (final signal in unusedSignals) {
      subscriptions[signal]!.cancel();
      subscriptions.remove(signal);
    }

    for (final signal in newSignals) {
      subscriptions[signal] = (signal.sync ?? signal.stream).listen((_) => markNeedsBuild());
    }

    result = widget;
  });

  return result;
}