fix: notify state changed after set state

This commit is contained in:
appflowy 2022-09-20 16:57:51 +08:00
parent ba3f2f3c02
commit ca89fd93f3
2 changed files with 23 additions and 16 deletions

View File

@ -201,9 +201,9 @@ class _FieldNameTextFieldState extends State<_FieldNameTextField> {
void listenOnPopoverChanged(BuildContext context) { void listenOnPopoverChanged(BuildContext context) {
if (_popoverCallback != null) { if (_popoverCallback != null) {
widget.popoverMutex.removePopoverStateListener(_popoverCallback!); widget.popoverMutex.removePopoverListener(_popoverCallback!);
} }
_popoverCallback = widget.popoverMutex.listenOnPopoverStateChanged(() { _popoverCallback = widget.popoverMutex.listenOnPopoverChanged(() {
if (focusNode.hasFocus) { if (focusNode.hasFocus) {
final node = FocusScope.of(context); final node = FocusScope.of(context);
node.unfocus(); node.unfocus();

View File

@ -5,14 +5,14 @@ import 'popover.dart';
/// If multiple popovers are exclusive, /// If multiple popovers are exclusive,
/// pass the same mutex to them. /// pass the same mutex to them.
class PopoverMutex { class PopoverMutex {
final ValueNotifier<PopoverState?> _stateNotifier = ValueNotifier(null); final _PopoverStateNotifier _stateNotifier = _PopoverStateNotifier();
PopoverMutex(); PopoverMutex();
void removePopoverStateListener(VoidCallback listener) { void removePopoverListener(VoidCallback listener) {
_stateNotifier.removeListener(listener); _stateNotifier.removeListener(listener);
} }
VoidCallback listenOnPopoverStateChanged(VoidCallback callback) { VoidCallback listenOnPopoverChanged(VoidCallback callback) {
listenerCallback() { listenerCallback() {
callback(); callback();
} }
@ -21,24 +21,31 @@ class PopoverMutex {
return listenerCallback; return listenerCallback;
} }
void close() { void close() => _stateNotifier.state?.close();
_stateNotifier.value?.close();
}
PopoverState? get state => _stateNotifier.value; PopoverState? get state => _stateNotifier.state;
set state(PopoverState? newState) { set state(PopoverState? newState) => _stateNotifier.state = newState;
if (_stateNotifier.value != null && _stateNotifier.value != newState) {
_stateNotifier.value?.close();
}
_stateNotifier.value = newState;
}
void removeState() { void removeState() {
_stateNotifier.value = null; _stateNotifier.state = null;
} }
void dispose() { void dispose() {
_stateNotifier.dispose(); _stateNotifier.dispose();
} }
} }
class _PopoverStateNotifier extends ChangeNotifier {
PopoverState? _state;
PopoverState? get state => _state;
set state(PopoverState? newState) {
if (_state != null && _state != newState) {
_state?.close();
}
_state = newState;
notifyListeners();
}
}