沒(méi)有包裹的話(huà)鸦难,就是空
RxInterface.proxy
T get value {
RxInterface.proxy?.addListener(subject);
return _value;
}
RxInterface.proxy?是空.
如果是obx包裹呆细,則 RxInterface.proxy 有值最盅。
就是ObxWidget 的observer:
ObxWidget:
final _observer = RxNotifier();
build:
Widget build(BuildContext context) =>
RxInterface.notifyChildren(_observer, widget.build);
1葵蒂、注冊(cè)回調(diào)
void initState() {
super.initState();
subs = _observer.listen(_updateTree, cancelOnError: false);
}
void _updateTree(_) {
if (mounted) {
setState(() {});
}
}
StreamSubscription<T> listen(
void Function(T) onData, {
Function? onError,
void Function()? onDone,
bool? cancelOnError,
}) =>
subject.listen(
onData,
onError: onError,
onDone: onDone,
cancelOnError: cancelOnError ?? false,
);
LightSubscription<T> listen(void Function(T event) onData,
{Function? onError, void Function()? onDone, bool? cancelOnError}) {
final subs = LightSubscription<T>(
removeSubscription,
onPause: onPause,
onResume: onResume,
onCancel: onCancel,
)
..onData(onData)
..onError(onError)
..onDone(onDone)
..cancelOnError = cancelOnError;
addSubscription(subs);
onListen?.call();
return subs;
}
2担敌、添加監(jiān)聽(tīng)對(duì)象
T get value {
RxInterface.proxy?.addListener(subject);
return _value;
}
void addListener(GetStream<T> rxGetx) {
if (!_subscriptions.containsKey(rxGetx)) {
final subs = rxGetx.listen((data) {
if (!subject.isClosed) subject.add(data);
});
final listSubscriptions =
_subscriptions[rxGetx] ??= <StreamSubscription>[];
listSubscriptions.add(subs);
}
}
3、修改value
set value(T val) {
if (subject.isClosed) return;
sentToStream = false;
if (_value == val && !firstRebuild) return;
firstRebuild = false;
_value = val;
sentToStream = true;
subject.add(_value);
}
void add(T event) {
assert(!isClosed, 'You cannot add event to closed Stream');
_value = event;
_notifyData(event);
}
void _notifyData(T data) {
_isBusy = true;
for (final item in _onData!) {
if (!item.isPaused) {
item._data?.call(data);
}
}
_isBusy = false;
}
總結(jié):
- state持有obs對(duì)象辞槐。
- controller 持有state掷漱,controller作用就是調(diào)用state。修改state中的obs對(duì)象值榄檬,達(dá)到刷新界面的作用卜范。
- obs對(duì)象只有在obx包裹下,調(diào)用obs.value賦值才會(huì)刷新obx widget鹿榜。否則只是讀一個(gè)變量值而已海雪。
- obx包裹的build方法中,需要調(diào)用obs對(duì)象舱殿,否則obx包裹沒(méi)有作用奥裸。
思考:
父widget, controller怀薛。state
子widget刺彩,controller迷郑,state
父子widget共享state的同一個(gè)obs對(duì)象枝恋,當(dāng)obs修改,父widget先刷新還是子widget先刷新嗡害? 還是只有父widget刷新焚碌?
mixin NotifyManager<T> {
void addListener(GetStream<T> rxGetx) {
if (!_subscriptions.containsKey(rxGetx)) {////不存在,創(chuàng)建
final subs = rxGetx.listen((data) {
if (!subject.isClosed) subject.add(data);
});
final listSubscriptions =
_subscriptions[rxGetx] ??= <StreamSubscription>[];
listSubscriptions.add(subs); ///listSubscriptions 多個(gè)霸妹,添加
}////存在了
}
}
_subscriptions[rxGetx] ??= <StreamSubscription>[];
bool containsKey(Object? key);
class RxNotifier<T> = RxInterface<T> with NotifyManager<T>;
final _observer = RxNotifier();