diff --git a/packages/a2ui_core/lib/a2ui_core.dart b/packages/a2ui_core/lib/a2ui_core.dart index ebb88d0f2..4ca0acd27 100644 --- a/packages/a2ui_core/lib/a2ui_core.dart +++ b/packages/a2ui_core/lib/a2ui_core.dart @@ -18,8 +18,6 @@ export 'src/core/messages.dart'; export 'src/core/minimal_catalog.dart'; export 'src/core/surface_group_model.dart'; export 'src/core/surface_model.dart'; -// Primitives. -export 'src/listenable/notifiers.dart'; export 'src/primitives/cancellation.dart'; export 'src/primitives/data_path.dart'; export 'src/primitives/errors.dart'; diff --git a/packages/a2ui_core/lib/src/listenable/notifiers.dart b/packages/a2ui_core/lib/src/listenable/notifiers.dart index eea188281..31fec16d1 100644 --- a/packages/a2ui_core/lib/src/listenable/notifiers.dart +++ b/packages/a2ui_core/lib/src/listenable/notifiers.dart @@ -65,7 +65,7 @@ abstract class GenUiValueListenable extends GenUiListenable { /// /// This class should not be modified, because it is temporary and should be /// replaced with dash-wide alternative. -mixin class GenUiChangeNotifier implements GenUiListenable { +mixin class ChangeNotifier implements GenUiListenable { int _count = 0; // The _listeners is intentionally set to a fixed-length _GrowableList instead // of const []. @@ -84,8 +84,8 @@ mixin class GenUiChangeNotifier implements GenUiListenable { int _reentrantlyRemovedListeners = 0; bool _debugDisposed = false; - /// Used by subclasses to assert that the [GenUiChangeNotifier] has not - /// yet been disposed. + /// Used by subclasses to assert that the [ChangeNotifier] has not yet been + /// disposed. /// /// {@tool snippet} /// The [debugAssertNotDisposed] function should only be called inside of an @@ -103,7 +103,7 @@ mixin class GenUiChangeNotifier implements GenUiListenable { // This is static and not an instance method because too many people try to // implement ChangeNotifier instead of extending it (and so it is too breaking // to add a method, especially for debug). - static bool debugAssertNotDisposed(GenUiChangeNotifier notifier) { + static bool debugAssertNotDisposed(ChangeNotifier notifier) { assert(() { if (notifier._debugDisposed) { throw ListenableErrorReporting.createError( @@ -150,7 +150,7 @@ mixin class GenUiChangeNotifier implements GenUiListenable { /// (e.g. in response to a notification), it will still be called again. If, /// on the other hand, it is removed as many times as it was registered, then /// it will no longer be called. This odd behavior is the result of the - /// [GenUiChangeNotifier] not being able to determine which listener is being + /// [ChangeNotifier] not being able to determine which listener is being /// removed, since they are identical, therefore it will conservatively still /// call all the listeners when it knows that any are still registered. /// @@ -165,7 +165,7 @@ mixin class GenUiChangeNotifier implements GenUiListenable { /// the list of closures that are notified when the object changes. @override void addListener(VoidCallback listener) { - assert(GenUiChangeNotifier.debugAssertNotDisposed(this)); + assert(ChangeNotifier.debugAssertNotDisposed(this)); if (_count == _listeners.length) { if (_count == 0) { @@ -269,7 +269,7 @@ mixin class GenUiChangeNotifier implements GenUiListenable { /// listeners or not immediately before disposal. @mustCallSuper void dispose() { - assert(GenUiChangeNotifier.debugAssertNotDisposed(this)); + assert(ChangeNotifier.debugAssertNotDisposed(this)); if (_notificationCallStackDepth > 0) { throw ListenableErrorReporting.createError( 'The "dispose()" method on $this was called during the call to ' @@ -304,7 +304,7 @@ mixin class GenUiChangeNotifier implements GenUiListenable { @visibleForTesting @pragma('vm:notify-debugger-on-exception') void notifyListeners() { - assert(GenUiChangeNotifier.debugAssertNotDisposed(this)); + assert(ChangeNotifier.debugAssertNotDisposed(this)); if (_count == 0) { return; } @@ -403,16 +403,16 @@ class _MergingListenable extends GenUiListenable { } } -/// A [GenUiChangeNotifier] that holds a single value. +/// A [ChangeNotifier] that holds a single value. /// /// Dart replica of Flutter's [ValueNotifier](https://api.flutter.dev/flutter/foundation/ValueNotifier-class.html) /// /// This class should not be modified, because it is temporary and should be /// replaced with dash-wide alternative. -class GenUiValueNotifier extends GenUiChangeNotifier +class ValueNotifier extends ChangeNotifier implements GenUiValueListenable { - /// Creates a [GenUiChangeNotifier] that wraps this value. - GenUiValueNotifier(this._value); + /// Creates a [ChangeNotifier] that wraps this value. + ValueNotifier(this._value); /// The current value stored in this notifier. /// diff --git a/packages/a2ui_core/test/listenable/listenable_test.dart b/packages/a2ui_core/test/listenable/listenable_test.dart index 96f0dab67..9976303ee 100644 --- a/packages/a2ui_core/test/listenable/listenable_test.dart +++ b/packages/a2ui_core/test/listenable/listenable_test.dart @@ -7,7 +7,7 @@ import 'package:a2ui_core/src/listenable/notifiers.dart'; import 'package:a2ui_core/src/listenable/primitives.dart'; import 'package:test/test.dart'; -class TestNotifier extends GenUiChangeNotifier { +class TestNotifier extends ChangeNotifier { void notify() { notifyListeners(); } @@ -15,7 +15,7 @@ class TestNotifier extends GenUiChangeNotifier { bool get isListenedTo => hasListeners; } -class HasListenersTester extends GenUiValueNotifier { +class HasListenersTester extends ValueNotifier { HasListenersTester(super.value); bool get testHasListeners => hasListeners; } @@ -27,7 +27,7 @@ class A { } } -class B extends A with GenUiChangeNotifier { +class B extends A with ChangeNotifier { B(); @override @@ -37,7 +37,7 @@ class B extends A with GenUiChangeNotifier { } } -class Counter with GenUiChangeNotifier { +class Counter with ChangeNotifier { Counter(); int get value => _value; @@ -378,7 +378,7 @@ void main() { }); test('Value notifier', () { - final notifier = GenUiValueNotifier(2.0); + final notifier = ValueNotifier(2.0); final log = []; void listener() { @@ -513,11 +513,11 @@ void main() { test('Calling debugAssertNotDisposed works as intended', () { final testNotifier = TestNotifier(); - expect(GenUiChangeNotifier.debugAssertNotDisposed(testNotifier), isTrue); + expect(ChangeNotifier.debugAssertNotDisposed(testNotifier), isTrue); testNotifier.dispose(); ListenableError? error; try { - GenUiChangeNotifier.debugAssertNotDisposed(testNotifier); + ChangeNotifier.debugAssertNotDisposed(testNotifier); // ignore: avoid_catching_errors } on ListenableError catch (e) { error = e; diff --git a/packages/a2ui_core/test/listenable/smoke_test.dart b/packages/a2ui_core/test/listenable/smoke_test.dart index 033919fe2..90e9d1960 100644 --- a/packages/a2ui_core/test/listenable/smoke_test.dart +++ b/packages/a2ui_core/test/listenable/smoke_test.dart @@ -7,7 +7,7 @@ import 'package:a2ui_core/src/listenable/primitives.dart'; import 'package:test/test.dart'; // ignore: unused_element, tests that ValueNotifier can be implemented. -class _ValueNotifierImplementation implements GenUiValueNotifier { +class _ValueNotifierImplementation implements ValueNotifier { @override void addListener(VoidCallback listener) {} @@ -31,12 +31,12 @@ class _ValueNotifierImplementation implements GenUiValueNotifier { } // ignore: unused_element, tests that ValueNotifier can be extended. -class _ValueNotifierExtension extends GenUiValueNotifier { +class _ValueNotifierExtension extends ValueNotifier { _ValueNotifierExtension(super.value); } // ignore: unused_element, tests that ChangeNotifier can be implemented. -class _ChangeNotifierImplementation implements GenUiChangeNotifier { +class _ChangeNotifierImplementation implements ChangeNotifier { @override void addListener(VoidCallback listener) {} @@ -54,11 +54,11 @@ class _ChangeNotifierImplementation implements GenUiChangeNotifier { } // ignore: unused_element, tests that ChangeNotifier can be extended. -class _ChangeNotifierExtention extends GenUiChangeNotifier {} +class _ChangeNotifierExtention extends ChangeNotifier {} void main() { test('ValueNotifier basic functionality is working', () { - final GenUiValueNotifier notifier = GenUiValueNotifier(1); + final ValueNotifier notifier = ValueNotifier(1); addTearDown(notifier.dispose); var count = 0; notifier.addListener(() => count++); @@ -73,7 +73,7 @@ void main() { }); test('ChangeNotifier basic functionality is working', () { - final notifier = GenUiChangeNotifier(); + final notifier = ChangeNotifier(); addTearDown(notifier.dispose); var count = 0; notifier.addListener(() => count++); diff --git a/packages/genui/lib/src/primitives/flutter_listenable.dart b/packages/genui/lib/src/primitives/flutter_listenable.dart deleted file mode 100644 index 283f80266..000000000 --- a/packages/genui/lib/src/primitives/flutter_listenable.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2025 The Flutter Authors. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:a2ui_core/a2ui_core.dart'; -import 'package:flutter/foundation.dart'; - -/// Extension to convert [GenUiListenable] to [Listenable]. -/// -/// Enables using [GenUiListenable] with Flutter widgets -/// that accept [Listenable]. -extension FlutterListenable on GenUiListenable { - Listenable listenable() { - return FlutterListenableAdapter(this); - } -} - -/// Extensions to convert GenUi value listenables to Flutter value listenables. -extension GenUiValueListenableFlutterExtension on GenUiValueListenable { - /// Converts this [GenUiValueListenable] to a Flutter [ValueListenable]. - ValueListenable valueListenable() => - FlutterValueListenableAdapter(this); -} - -class FlutterListenableAdapter implements Listenable { - FlutterListenableAdapter(this._listenable); - - final GenUiListenable _listenable; - - @override - void addListener(VoidCallback listener) { - _listenable.addListener(listener); - } - - @override - void removeListener(VoidCallback listener) { - _listenable.removeListener(listener); - } -} - -class FlutterValueListenableAdapter extends FlutterListenableAdapter - implements ValueListenable { - FlutterValueListenableAdapter(GenUiValueListenable super.listenable); - - GenUiValueListenable get _valueListenable => - _listenable as GenUiValueListenable; - - @override - T get value => _valueListenable.value; -} diff --git a/packages/genui/pubspec.yaml b/packages/genui/pubspec.yaml index 4262b6f57..69c80c62d 100644 --- a/packages/genui/pubspec.yaml +++ b/packages/genui/pubspec.yaml @@ -16,7 +16,6 @@ environment: resolution: workspace dependencies: - a2ui_core: ^0.0.1-dev001 audioplayers: ^6.6.0 collection: ^1.19.1 flutter: diff --git a/packages/genui/test/primitives/flutter_listenable_test.dart b/packages/genui/test/primitives/flutter_listenable_test.dart deleted file mode 100644 index b7a92bf98..000000000 --- a/packages/genui/test/primitives/flutter_listenable_test.dart +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2025 The Flutter Authors. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:a2ui_core/a2ui_core.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:genui/src/primitives/flutter_listenable.dart'; - -class TestGenUiListenable extends GenUiListenable { - int addListenerCount = 0; - int removeListenerCount = 0; - VoidCallback? lastAddedListener; - VoidCallback? lastRemovedListener; - - @override - void addListener(VoidCallback listener) { - addListenerCount++; - lastAddedListener = listener; - } - - @override - void removeListener(VoidCallback listener) { - removeListenerCount++; - lastRemovedListener = listener; - } -} - -class TestGenUiValueListenable extends TestGenUiListenable - implements GenUiValueListenable { - TestGenUiValueListenable(this.value); - - @override - T value; -} - -void main() { - group('FlutterListenable', () { - test('adapter registers and unregisters listeners correctly', () { - final listenable = TestGenUiListenable(); - final Listenable adapter = listenable.listenable(); - - expect(adapter, isA()); - expect(adapter, isA()); - - void listener() {} - - adapter.addListener(listener); - expect(listenable.addListenerCount, 1); - expect(listenable.lastAddedListener, listener); - - adapter.removeListener(listener); - expect(listenable.removeListenerCount, 1); - expect(listenable.lastRemovedListener, listener); - }); - - test('valueListenable adapter works correctly', () { - final valueListenable = TestGenUiValueListenable(42); - final ValueListenable adapter = valueListenable.valueListenable(); - - expect(adapter, isA>()); - expect(adapter, isA>()); - - expect(adapter.value, 42); - - void listener() {} - - adapter.addListener(listener); - expect(valueListenable.addListenerCount, 1); - expect(valueListenable.lastAddedListener, listener); - - adapter.removeListener(listener); - expect(valueListenable.removeListenerCount, 1); - expect(valueListenable.lastRemovedListener, listener); - }); - }); -}