From 559179fc0c16c8a2d74423ba7be08955554dcd81 Mon Sep 17 00:00:00 2001 From: mathru Date: Tue, 7 Feb 2023 23:38:21 +0900 Subject: [PATCH] fix: Changed to be able to track states managed by ScopedValueContainer. --- packages/katana_scoped/example/pubspec.lock | 16 +++---- .../katana_scoped/lib/src/scoped_ref.dart | 8 ++-- .../lib/src/scoped_value_container.dart | 46 +++++++++++++++++-- packages/katana_scoped/pubspec.lock | 15 +++--- packages/katana_scoped/test/scoped_test.dart | 4 +- 5 files changed, 62 insertions(+), 27 deletions(-) diff --git a/packages/katana_scoped/example/pubspec.lock b/packages/katana_scoped/example/pubspec.lock index 0855e6e88..e1bbc289e 100644 --- a/packages/katana_scoped/example/pubspec.lock +++ b/packages/katana_scoped/example/pubspec.lock @@ -348,12 +348,11 @@ packages: source: hosted version: "6.6.1" katana: - dependency: transitive + dependency: "direct overridden" description: - name: katana - sha256: "9a3ec047c35ec88e027139e88ce45202b022dd2111b38848c85159101b0028ce" - url: "https://pub.dev" - source: hosted + path: "../../katana" + relative: true + source: path version: "1.0.5" katana_scoped: dependency: "direct main" @@ -361,7 +360,7 @@ packages: path: ".." relative: true source: path - version: "1.7.8" + version: "1.7.9" lints: dependency: transitive description: @@ -579,10 +578,10 @@ packages: dependency: transitive description: name: tint - sha256: d856019547532d4ea24171f554b319081c004c37741e7946eae30cb09f24e1c7 + sha256: "9652d9a589f4536d5e392cf790263d120474f15da3cf1bee7f1fdb31b4de5f46" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" typed_data: dependency: transitive description: @@ -633,4 +632,3 @@ packages: version: "3.1.1" sdks: dart: ">=2.19.0 <4.0.0" - flutter: ">=2.0.0" diff --git a/packages/katana_scoped/lib/src/scoped_ref.dart b/packages/katana_scoped/lib/src/scoped_ref.dart index 1a117f113..b66ff2f61 100644 --- a/packages/katana_scoped/lib/src/scoped_ref.dart +++ b/packages/katana_scoped/lib/src/scoped_ref.dart @@ -1,6 +1,6 @@ part of katana_scoped; -/// ScopedValue] in the scope of the application. +/// [ScopedValue] in the scope of the application. /// /// Since there is no object to monitor the status, we only read [ScopedValue], but if we define the value globally, we can call it from any timing. /// @@ -17,7 +17,7 @@ part of katana_scoped; /// [scopedValueContainer]を指定すると独自の[ScopedValueContainer]を利用可能です。テスト等でご利用ください。 @immutable class AppRef implements Ref { - /// ScopedValue] in the scope of the application. + /// [ScopedValue] in the scope of the application. /// /// Since there is no object to monitor the status, we only read [ScopedValue], but if we define the value globally, we can call it from any timing. /// @@ -79,8 +79,8 @@ class AppRef implements Ref { /// すべてのアプリスコープの状態を破棄してクリアします。 /// /// ログアウト時など一旦アプリをリセットする場合にご利用ください。 - void dispose() { - _scopedValueContainer.dispose(); + void reset() { + _scopedValueContainer.reset(); } } diff --git a/packages/katana_scoped/lib/src/scoped_value_container.dart b/packages/katana_scoped/lib/src/scoped_value_container.dart index 13291bbd3..66a4faa2b 100644 --- a/packages/katana_scoped/lib/src/scoped_value_container.dart +++ b/packages/katana_scoped/lib/src/scoped_value_container.dart @@ -6,25 +6,48 @@ part of katana_scoped; /// /// A database of [ScopedValue] is maintained internally, and the corresponding [ScopedValueState] can be read and edited by [getScopedValueState]. /// +/// It inherits from [ChangeNotifier] and can monitor changes in its contents. +/// +/// The contents cannot be changed directly, but can be viewed at [data]. +/// /// [ScopedValue]を保存するためのコンテナオブジェクト。 /// /// 通常は[ScopedValueListener]を介して呼び出されます。 /// /// 内部に[ScopedValue]のデータベースを保持しており、[getScopedValueState]で[ScopedValue]に対応する[ScopedValueState]を読込み編集を加えることが可能です。 -class ScopedValueContainer { +/// +/// [ChangeNotifier]を継承しており、中身の変更を監視できます。 +/// +/// 中身は直接変更することができませんが[data]で中身を確認することが可能です。 +class ScopedValueContainer extends ChangeNotifier { /// Container object for storing [ScopedValue]. /// /// It is usually called via [ScopedValueListener]. /// /// A database of [ScopedValue] is maintained internally, and the corresponding [ScopedValueState] can be read and edited by [getScopedValueState]. /// + /// It inherits from [ChangeNotifier] and can monitor changes in its contents. + /// + /// The contents cannot be changed directly, but can be viewed at [data]. + /// /// [ScopedValue]を保存するためのコンテナオブジェクト。 /// /// 通常は[ScopedValueListener]を介して呼び出されます。 /// /// 内部に[ScopedValue]のデータベースを保持しており、[getScopedValueState]で[ScopedValue]に対応する[ScopedValueState]を読込み編集を加えることが可能です。 + /// + /// [ChangeNotifier]を継承しており、中身の変更を監視できます。 + /// + /// 中身は直接変更することができませんが[data]で中身を確認することが可能です。 ScopedValueContainer(); + /// It is possible to check the contents of [ScopedValueContainer]. + /// + /// [ScopedValueContainer]の中身を確認することが可能です。 + Map get data { + return Map.from(_data); + } + final Map _data = {}; /// By passing a callback that returns [TScopedValue] to [provider], it creates a state for that [ScopedValue] and performs the appropriate processing, returning [ScopedValueState]. @@ -65,6 +88,7 @@ class ScopedValueContainer { state._setValue(provider.call()); onInitOrUpdate?.call(state); found.didUpdateValue(oldValue); + notifyListeners(); return state; } else { final value = provider.call(); @@ -74,6 +98,7 @@ class ScopedValueContainer { onInitOrUpdate?.call(state); state.initValue(); _data[key] = state; + notifyListeners(); return state; } } @@ -119,17 +144,30 @@ class ScopedValueContainer { } } - /// Called when [ScopedValueContainer] is destroyed. + /// The contents of [ScopedValueContainer] are discarded and reset once. /// /// ScopedValueState.dispose] of the retained state is executed. /// - /// [ScopedValueContainer]が破棄される歳に呼ばれます。 + /// [ScopedValueContainer]の中身を破棄し一旦リセットします。 /// /// 保持している状態の[ScopedValueState.dispose]が実行されます。 - void dispose() { + void reset() { for (final val in _data.values) { val.dispose(); } _data.clear(); } + + /// Called when [ScopedValueContainer] is destroyed. + /// + /// ScopedValueState.dispose] of the retained state is executed. + /// + /// [ScopedValueContainer]が破棄される歳に呼ばれます。 + /// + /// 保持している状態の[ScopedValueState.dispose]が実行されます。 + @override + void dispose() { + super.dispose(); + reset(); + } } diff --git a/packages/katana_scoped/pubspec.lock b/packages/katana_scoped/pubspec.lock index 580ad9cab..b9544ba3f 100644 --- a/packages/katana_scoped/pubspec.lock +++ b/packages/katana_scoped/pubspec.lock @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: coverage - sha256: "961c4aebd27917269b1896382c7cb1b1ba81629ba669ba09c27a7e5710ec9040" + sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" url: "https://pub.dev" source: hosted - version: "1.6.2" + version: "1.6.3" crypto: dependency: transitive description: @@ -201,10 +201,9 @@ packages: katana: dependency: "direct main" description: - name: katana - sha256: "9a3ec047c35ec88e027139e88ce45202b022dd2111b38848c85159101b0028ce" - url: "https://pub.dev" - source: hosted + path: "../katana" + relative: true + source: path version: "1.0.5" lints: dependency: transitive @@ -439,10 +438,10 @@ packages: dependency: transitive description: name: tint - sha256: d856019547532d4ea24171f554b319081c004c37741e7946eae30cb09f24e1c7 + sha256: "9652d9a589f4536d5e392cf790263d120474f15da3cf1bee7f1fdb31b4de5f46" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" typed_data: dependency: transitive description: diff --git a/packages/katana_scoped/test/scoped_test.dart b/packages/katana_scoped/test/scoped_test.dart index 1a4918708..5eff61b2e 100644 --- a/packages/katana_scoped/test/scoped_test.dart +++ b/packages/katana_scoped/test/scoped_test.dart @@ -8,7 +8,7 @@ import 'package:test/test.dart'; import 'package:katana_scoped/katana_scoped.dart'; void main() { - test("Dispose Test", () async { + test("Reset Test", () async { WidgetsFlutterBinding.ensureInitialized(); final container = ScopedValueContainer(); final appRef = AppRef(scopedValueContainer: container); @@ -18,7 +18,7 @@ void main() { final n2 = appRef.watch((ref) => ValueNotifier(0)); expect(n2.value, 1); expect(n1 == n2, true); - appRef.dispose(); + appRef.reset(); final n3 = appRef.watch((ref) => ValueNotifier(2)); expect(n3.value, 2); expect(n1 != n3, true);