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 ViewModelBinding0<ValueListenable<VM>>(
    selector: (context) => create(context),
    child: child,
    builder: (context, value, isBinding, child) {
      return ValueListenableBuilder<VM>(
        valueListenable: value,
        child: child,
        builder: (context, model, child) {
          return ListenableProvider<VM>.value(
            value: model,
            child: child,
            builder: (context, child) {
              final buildWidget = () {
                if (isBinding) {
                  bindViewModel?.call(context, model);
                }
                return builder?.call(context, model, child) ??
                    child ??
                    const SizedBox();
              };
              if (initViewModel != null ||
                  disposeViewModel != null ||
                  changeViewModel != null) {
                return LifecycleBuilder<VM>(
                  create: (context) => context.viewModel<VM>(),
                  initState: (_) => initViewModel?.call(context, model),
                  initFrame: (_, __) => initFrame?.call(context, model),
                  dispose: (_, __) => disposeViewModel?.call(context, model),
                  didChangeDependencies: (_, oldValue) {
                    if (!const DeepCollectionEquality()
                        .equals(oldValue, model)) {
                      changeViewModel?.call(context, model, oldValue);
                    }
                  },
                  child: child,
                  builder: (context, setState, model, child) => buildWidget(),
                );
              }
              return buildWidget();
            },
          );
        },
      );
    },
  );
}