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