-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
cache.dart
67 lines (58 loc) · 2.02 KB
/
cache.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import 'package:flutter/material.dart';
import 'package:katana_scoped/katana_scoped.dart';
/// Provides an extension method for [Ref] to perform caching.
///
/// キャッシュを行うための[Ref]用の拡張メソッドを提供します。
extension RefCacheExtensions on Ref {
/// Caches and stores the value returned by [callback].
///
/// If [keys] is passed a value different from the previous value, [callback] is executed again and the value is updated.
///
/// If [name] is specified, it is saved as a separate type. If [keys] is changed, the previous state is discarded, but if [name] is changed, it is kept as a separate state.
///
/// [callback]で返される値をキャッシュして保存します。
///
/// [keys]が前の値と違う値が渡された場合、再度[callback]が実行され値が更新されます。
///
/// [name]を指定すると別のタイプとして保存されます。[keys]を変えた場合は以前の状態は破棄されますが、[name]を変えた場合は別々の状態として保持されます。
T cache<T>(
T Function() callback, {
List<Object> keys = const [],
String? name,
}) {
return getScopedValue<T, _CacheValue<T>>(
() => _CacheValue<T>(callback: callback, keys: keys),
listen: false,
name: name,
);
}
}
@immutable
class _CacheValue<T> extends ScopedValue<T> {
const _CacheValue({
required this.callback,
required this.keys,
});
final T Function() callback;
final List<Object> keys;
@override
ScopedValueState<T, ScopedValue<T>> createState() => _CacheValueState<T>();
}
class _CacheValueState<T> extends ScopedValueState<T, _CacheValue<T>> {
_CacheValueState();
late T _value;
@override
void initValue() {
super.initValue();
_value = value.callback();
}
@override
void didUpdateValue(_CacheValue<T> oldValue) {
super.didUpdateValue(oldValue);
if (!equalsKeys(value.keys, oldValue.keys)) {
_value = value.callback();
}
}
@override
T build() => _value;
}