buildWithChild method
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();
},
);
},
);
}