2024-12-15 對(duì)getx 的obx理解

沒(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();

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末十电,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹃骂,老刑警劉巖台盯,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異畏线,居然都是意外死亡静盅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)寝殴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒿叠,“玉大人,你說(shuō)我怎么就攤上這事蚣常∈醒剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵抵蚊,是天一觀(guān)的道長(zhǎng)施绎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泌射,這世上最難降的妖魔是什么粘姜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮熔酷,結(jié)果婚禮上孤紧,老公的妹妹穿的比我還像新娘。我一直安慰自己拒秘,他們只是感情好号显,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著躺酒,像睡著了一般押蚤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羹应,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天揽碘,我揣著相機(jī)與錄音,去河邊找鬼园匹。 笑死雳刺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裸违。 我是一名探鬼主播掖桦,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼供汛!你這毒婦竟也來(lái)了枪汪?” 一聲冷哼從身側(cè)響起涌穆,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雀久,沒(méi)想到半個(gè)月后宿稀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赖捌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年原叮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡蘸。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奋隶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悦荒,到底是詐尸還是另有隱情唯欣,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布搬味,位于F島的核電站境氢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碰纬。R本人自食惡果不足惜萍聊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悦析。 院中可真熱鬧寿桨,春花似錦、人聲如沸强戴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)骑歹。三九已至预烙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間道媚,已是汗流浹背扁掸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最域,地道東北人谴分。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像羡宙,于是被迫代替她去往敵國(guó)和親狸剃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掐隐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容