using Unity.UIWidgets.foundation; using Unity.UIWidgets.ui; using Unity.UIWidgets.widgets; namespace Unity.UIWidgets.DevTools { public delegate void SetState(R value); public delegate VoidCallback DeferredStartListening( InheritedContext context, SetState setState, T controller, R value ); class DeferredInheritedProvider : InheritedProvider { public DeferredInheritedProvider( Key key = null, Create create = null, Dispose dispose = null, DeferredStartListening startListening = null, UpdateShouldNotify updateShouldNotify = null, bool? lazy = null, TransitionBuilder builder = null, Widget child = null ) : base( key: key, child: child, lazy: lazy, builder: builder, _delegate: new _CreateDeferredInheritedProvider( create: create, dispose: dispose, updateShouldNotify: updateShouldNotify, startListening: startListening )) { } public DeferredInheritedProvider( Key key = null, T value = default, DeferredStartListening startListening = null, UpdateShouldNotify updateShouldNotify = null, bool? lazy = null, TransitionBuilder builder = null, Widget child = null ): base(key: key, lazy: lazy, builder: builder, _delegate: new _ValueDeferredInheritedProvider( value, updateShouldNotify, startListening ), child: child) { } } class _CreateDeferredInheritedProvider : _DeferredDelegate { public _CreateDeferredInheritedProvider( Create create = null, Dispose dispose = null, UpdateShouldNotify updateShouldNotify = null, DeferredStartListening startListening = null ) : base(updateShouldNotify, startListening) { this.create = create; this.dispose = dispose; } public readonly Create create; public readonly Dispose dispose; public _CreateDeferredInheritedProviderElement createState() { // [attention] override return new _CreateDeferredInheritedProviderElement(); } } class _CreateDeferredInheritedProviderElement : _DeferredDelegateState> { } public abstract class _DeferredDelegate : _Delegate { public _DeferredDelegate(UpdateShouldNotify updateShouldNotify, DeferredStartListening startListening) { this.updateShouldNotify = updateShouldNotify; this.startListening = startListening; } public readonly UpdateShouldNotify updateShouldNotify; public readonly DeferredStartListening startListening; public override _DelegateState> createState() { return null; // [attention] this function has no body in flutter } } public abstract class _DeferredDelegateState : _DelegateState where W : _DeferredDelegate { public VoidCallback _removeListener; R _value; public new R value { get { // element._isNotifyDependentsEnabled = false; // _removeListener ??= delegate.startListening( // element, // setState, // controller, // _value, // ); // element._isNotifyDependentsEnabled = true; // D.assert(element.hasValue, ''' // The callback "startListening" was called, but it left DeferredInhertitedProviderElement<$T, $R> // in an unitialized state. // // It is necessary for "startListening" to call "setState" at least once the very // first time "value" is requested. // // To fix, consider: // // DeferredInheritedProvider( // ..., // startListening: (element, setState, controller, value) { // if (!element.hasValue) { // setState(myInitialValue); // TODO replace myInitialValue with your own // } // ... // } // ) // '''); // D.assert(_removeListener != null); return _value; } } } public class _ValueDeferredInheritedProvider : _DeferredDelegate { public _ValueDeferredInheritedProvider( T value, UpdateShouldNotify updateShouldNotify, DeferredStartListening startListening ) : base(updateShouldNotify, startListening) { this.value = value; } public readonly T value; public _ValueDeferredInheritedProviderState createState() { // [attention] override return new _ValueDeferredInheritedProviderState(); } public override void debugFillProperties(DiagnosticPropertiesBuilder properties) { base.debugFillProperties(properties); properties.add(new DiagnosticsProperty("controller", value)); } } public class _ValueDeferredInheritedProviderState : _DeferredDelegateState< T, R, _ValueDeferredInheritedProvider> { public override bool willUpdateDelegate(_ValueDeferredInheritedProvider oldDelegate) { if (true) { // [attention] _delegate.value != oldDelegate.value if (_removeListener != null) { _removeListener(); _removeListener = null; } return true; } return false; } public new T controller { get { return _delegate.value; } } public override void debugFillProperties(DiagnosticPropertiesBuilder properties) { base.debugFillProperties(properties); if (_removeListener != null) { properties.add(new DiagnosticsProperty("value", value)); } else { properties.add( new FlagProperty( "value", value: true, showName: true, ifTrue: "" ) ); } } } }