simple_builder.dart
1.46 KB
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
import 'dart:collection';
import 'package:flutter/widgets.dart';
import 'get_state.dart';
// It's a experimental feature
class SimpleBuilder extends StatefulWidget {
final Widget Function(BuildContext) builder;
const SimpleBuilder({Key key, @required this.builder})
: assert(builder != null),
super(key: key);
@override
_SimpleBuilderState createState() => _SimpleBuilderState();
}
class _SimpleBuilderState extends State<SimpleBuilder> {
final HashSet<Disposer> disposers = HashSet<Disposer>();
@override
void dispose() {
super.dispose();
disposers.forEach((element) => element());
}
@override
Widget build(BuildContext context) {
return TaskManager.instance
.exchange(disposers, setState, widget.builder, context);
}
}
class TaskManager {
TaskManager._();
static TaskManager _instance;
static TaskManager get instance => _instance ??= TaskManager._();
StateSetter _setter;
HashSet<Disposer> _remove;
notify(HashSet<StateSetter> _updaters) {
if (_setter != null) {
if (!_updaters.contains(_setter)) {
_updaters.add(_setter);
_remove.add(() => _updaters.remove(_setter));
}
}
}
Widget exchange(
HashSet<Disposer> disposers,
StateSetter setState,
Widget Function(BuildContext) builder,
BuildContext context,
) {
_remove = disposers;
_setter = setState;
final result = builder(context);
_remove = null;
_setter = null;
return result;
}
}