buildWithChild method

  1. @override
Widget buildWithChild(
  1. BuildContext context,
  2. Widget? child
)
override

A build method that receives an extra child parameter.

This method may be called with a child different from the parameter passed to the constructor of SingleChildStatelessWidget. It may also be called again with a different child, without this widget being recreated.

Implementation

@override
Widget buildWithChild(BuildContext context, Widget? child) {
  return ViewModelBinding<PVM, Tuple2<PVM, VM>>(
    selector: (context, pvm) => Tuple2(pvm, create(context, pvm)),
    shouldRebuild: (previous, next) {
      return !const DeepCollectionEquality()
          .equals(previous.item2, next.item2);
    },
    child: child,
    builder: (context, value, isBinding, child) {
      return ListenableProvider.value(
        value: value.item2,
        child: child,
        builder: (context, child) {
          final buildWidget = () {
            if (isBinding) {
              bindViewModel?.call(context, value.item1, value.item2);
            }
            return builder?.call(context, value.item1, value.item2, child) ??
                child ??
                const SizedBox();
          };
          if (initViewModel != null ||
              initFrame != null ||
              disposeViewModel != null ||
              changeViewModel != null) {
            return LifecycleBuilder<VM>(
              create: (context) => context.viewModel<VM>(),
              initState: (_) =>
                  initViewModel?.call(context, value.item1, value.item2),
              initFrame: (_, __) =>
                  initFrame?.call(context, value.item1, value.item2),
              dispose: (_, __) =>
                  disposeViewModel?.call(context, value.item1, value.item2),
              didChangeDependencies: (context, oldValue) {
                if (!const DeepCollectionEquality()
                    .equals(oldValue, value.item2)) {
                  changeViewModel?.call(
                      context, value.item1, value.item2, oldValue);
                }
              },
              child: child,
              builder: (context, setState, value, child) => buildWidget(),
            );
          }
          return buildWidget();
        },
      );
    },
  );
}