久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Flutter跨組件通信實(shí)戰(zhàn):EventBus發(fā)布訂閱模式從原理到避坑指南

Flutter跨組件通信實(shí)戰(zhàn):EventBus發(fā)布訂閱模式從原理到避坑指南 1. 跨組件通信的痛點(diǎn)與EventBus的定位Flutter 開(kāi)發(fā)到一定階段必然會(huì)遇到一個(gè)繞不開(kāi)的問(wèn)題兩個(gè)毫不相干的 Widget 之間怎么傳數(shù)據(jù)。比如用戶在“個(gè)人中心”頁(yè)面點(diǎn)了退出登錄結(jié)果“首頁(yè)”“消息頁(yè)”“訂單頁(yè)”都得同步刷新?tīng)顟B(tài)又比如一個(gè)全局的購(gòu)物車角標(biāo)散落在四五個(gè) Tab 里任何一個(gè)地方加減商品其他位置都得跟著變。這種場(chǎng)景用setState顯然不現(xiàn)實(shí)用InheritedWidget或各種狀態(tài)管理庫(kù)又顯得殺雞用牛刀尤其是當(dāng)通信雙方在組件樹上隔了十萬(wàn)八千里、根本沒(méi)有父子關(guān)系的時(shí)候。EventBus 就是在這個(gè)縫隙里生長(zhǎng)出來(lái)的方案。它的本質(zhì)是一個(gè)全局的發(fā)布訂閱中心一個(gè)地方發(fā)事件任意多個(gè)地方監(jiān)聽(tīng)事件發(fā)布者和訂閱者互相不認(rèn)識(shí)、不依賴、不耦合。你可以把它想象成小區(qū)樓下的公告欄——物業(yè)貼一張停水通知誰(shuí)路過(guò)誰(shuí)看不需要物業(yè)挨家挨戶敲門也不需要住戶之間互相轉(zhuǎn)告。Flutter 生態(tài)里最常用的實(shí)現(xiàn)是event_bus這個(gè)包代碼量極小核心就一個(gè)EventBus類加一個(gè)EventBusSubscriber注解但用好了能省下大量樣板代碼。這篇文章適合三類人看一是剛接觸 Flutter、被跨組件通信折磨過(guò)的新手二是用setState和回調(diào)傳參傳到崩潰、想找個(gè)輕量方案的中級(jí)開(kāi)發(fā)者三是已經(jīng)在用狀態(tài)管理庫(kù)、但想搞清楚 EventBus 到底該不該引入、什么時(shí)候引入的老手。我會(huì)從設(shè)計(jì)思路講到源碼級(jí)細(xì)節(jié)再給出一套可以直接抄的實(shí)操方案最后把踩過(guò)的坑和排查技巧全盤托出。全程不堆砌術(shù)語(yǔ)盡量用生活化的類比把原理講透。2. 為什么是EventBus方案選型背后的取舍邏輯2.1 跨組件通信的幾種主流方案對(duì)比在決定用 EventBus 之前得先搞清楚它在整個(gè)方案譜系里的位置。Flutter 里跨組件通信大致有這么幾條路InheritedWidget及其衍生、Provider/Riverpod這類狀態(tài)管理、GlobalKey、回調(diào)函數(shù)層層傳遞、以及 EventBus。它們不是互相替代的關(guān)系而是各有各的適用半徑。方案耦合度適用距離學(xué)習(xí)成本典型場(chǎng)景回調(diào)傳參高父子/近親低簡(jiǎn)單父子通信InheritedWidget中祖先-后代中主題、配置下發(fā)Provider/Riverpod中全局中高復(fù)雜狀態(tài)共享GlobalKey高任意低調(diào)用子組件方法EventBus極低任意極低事件通知、狀態(tài)廣播從表里能看出來(lái)EventBus 最大的特點(diǎn)是耦合度極低和學(xué)習(xí)成本極低。它不關(guān)心組件樹結(jié)構(gòu)不要求發(fā)布者和訂閱者有血緣關(guān)系甚至不要求它們?cè)谕粋€(gè)頁(yè)面。代價(jià)是什么呢代價(jià)是它不管理狀態(tài)只傳遞事件。這句話很關(guān)鍵很多人用 EventBus 用出問(wèn)題就是因?yàn)榘阉?dāng)狀態(tài)管理用了。2.2 EventBus解決的核心問(wèn)題解耦與廣播我舉個(gè)實(shí)際項(xiàng)目里的例子。某電商 App 有一個(gè)“加入購(gòu)物車”的按鈕散落在商品詳情頁(yè)、搜索結(jié)果頁(yè)、推薦流里。每點(diǎn)一次底部 Tab 的購(gòu)物車角標(biāo)要 1購(gòu)物車頁(yè)面如果已經(jīng)打開(kāi)要刷新列表個(gè)人中心里的“待結(jié)算”數(shù)量也要變。如果用回調(diào)你得從按鈕一路把回調(diào)傳到 Tab 欄中間隔了七八層 Widget代碼會(huì)臟得沒(méi)法看。如果用 Provider你得把購(gòu)物車狀態(tài)提升到全局然后每個(gè)消費(fèi)點(diǎn)都去watch邏輯上沒(méi)問(wèn)題但對(duì)于“點(diǎn)一下加一”這種簡(jiǎn)單事件來(lái)說(shuō)有點(diǎn)重。EventBus 的做法是按鈕點(diǎn)擊時(shí)EventBus.instance.fire(CartChangedEvent())然后 Tab 欄、購(gòu)物車頁(yè)、個(gè)人中心各自onCartChangedEvent()監(jiān)聽(tīng)。發(fā)布者不知道誰(shuí)在聽(tīng)訂閱者不知道誰(shuí)發(fā)的雙方只認(rèn)事件類型。這種發(fā)布訂閱模式帶來(lái)的解耦是 EventBus 最核心的價(jià)值。它特別適合“一件事發(fā)生了多個(gè)地方需要知道”的廣播型場(chǎng)景。2.3 什么時(shí)候不該用EventBus這里必須潑一盆冷水。EventBus 不是銀彈濫用它會(huì)帶來(lái)兩個(gè)嚴(yán)重問(wèn)題事件流難以追蹤和內(nèi)存泄漏。當(dāng)項(xiàng)目里到處是fire和on你很難搞清楚一個(gè)事件發(fā)出去之后到底觸發(fā)了哪些邏輯調(diào)試時(shí)像在黑暗中摸象。而且如果訂閱者忘記取消訂閱EventBus 會(huì)一直持有它的引用導(dǎo)致頁(yè)面銷毀后依然被回調(diào)輕則報(bào)錯(cuò)重則內(nèi)存泄漏。我的經(jīng)驗(yàn)判斷標(biāo)準(zhǔn)是這樣的如果兩個(gè)組件是明確的父子關(guān)系優(yōu)先用回調(diào)和setState如果是需要共享的狀態(tài)比如用戶信息、主題用 Provider 或 Riverpod只有當(dāng)通信雙方?jīng)]有穩(wěn)定關(guān)系、且傳遞的是一次性事件登錄成功、網(wǎng)絡(luò)斷開(kāi)、刷新指令時(shí)才考慮 EventBus。把它當(dāng)成“廣播喇叭”而不是“數(shù)據(jù)庫(kù)”。3. EventBus核心機(jī)制與源碼級(jí)細(xì)節(jié)拆解3.1 發(fā)布訂閱模式的三個(gè)角色EventBus 的實(shí)現(xiàn)再簡(jiǎn)單也逃不開(kāi)發(fā)布訂閱模式的三個(gè)基本角色事件Event、發(fā)布者Publisher、訂閱者Subscriber。事件是一個(gè)普通的 Dart 對(duì)象通常是個(gè)空類或者帶數(shù)據(jù)的類發(fā)布者調(diào)用fire方法把事件丟進(jìn)總線訂閱者通過(guò)on方法注冊(cè)一個(gè)回調(diào)聲明自己關(guān)心哪種類型的事件。總線內(nèi)部維護(hù)的是一個(gè)MapType, ListFunction結(jié)構(gòu)key 是事件類型value 是回調(diào)列表。當(dāng)fire被調(diào)用時(shí)總線根據(jù)事件的運(yùn)行時(shí)類型找到對(duì)應(yīng)的回調(diào)列表挨個(gè)執(zhí)行。這個(gè)設(shè)計(jì)非常輕量沒(méi)有中間件、沒(méi)有隊(duì)列、沒(méi)有異步調(diào)度就是同步遍歷調(diào)用。理解這一點(diǎn)很重要因?yàn)樗鼪Q定了 EventBus 的行為特征同步執(zhí)行、順序調(diào)用、無(wú)緩沖。3.2 event_bus包的源碼結(jié)構(gòu)event_bus這個(gè)包的源碼短到可以一口氣讀完。核心就兩個(gè)文件event_bus.dart和event_bus_subscriber.dart。EventBus類里有一個(gè)_streamController類型是StreamControllerdynamic.broadcast()。對(duì)它底層用的是 Dart 的Stream 廣播流。onT()方法本質(zhì)上是在這個(gè)廣播流上做where過(guò)濾只保留類型為 T 的事件然后監(jiān)聽(tīng)。fire()方法就是往流里add一個(gè)事件。這個(gè)實(shí)現(xiàn)方式帶來(lái)幾個(gè)關(guān)鍵特性。第一因?yàn)槭菑V播流所以支持多個(gè)訂閱者同時(shí)監(jiān)聽(tīng)同一事件。第二因?yàn)槭?Stream所以它天然支持StreamSubscription的取消機(jī)制這就是為什么訂閱后必須cancel。第三fire是同步的事件會(huì)立即分發(fā)給所有訂閱者不會(huì)等到下一個(gè)事件循環(huán)。如果你需要異步得自己在回調(diào)里做處理。3.3 泛型與事件類型的設(shè)計(jì)要點(diǎn)事件類型的設(shè)計(jì)是 EventBus 使用中最容易被忽視、也最容易出問(wèn)題的地方。因?yàn)榭偩€是按運(yùn)行時(shí)類型匹配的所以事件類的繼承關(guān)系會(huì)直接影響匹配結(jié)果。舉個(gè)例子如果你定義了一個(gè)基類BaseEvent然后LoginEvent extends BaseEvent那么onBaseEvent()能不能收到LoginEvent呢答案是不能。因?yàn)閣here過(guò)濾用的是精確類型匹配LoginEvent的運(yùn)行時(shí)類型是LoginEvent不等于BaseEvent。這個(gè)坑我踩過(guò)。當(dāng)時(shí)想做一個(gè)統(tǒng)一的事件基類結(jié)果發(fā)現(xiàn)子類事件根本收不到。解決辦法有兩個(gè)要么每個(gè)事件類型單獨(dú)監(jiān)聽(tīng)要么在fire的時(shí)候顯式指定類型。我個(gè)人的建議是事件類盡量扁平不要搞繼承體系一個(gè)事件一個(gè)類名字起清楚比如UserLoginEvent、UserLogoutEvent、CartUpdatedEvent。這樣雖然類多了點(diǎn)但匹配邏輯清晰不會(huì)出意外。4. 從零搭建一套可復(fù)用的EventBus方案4.1 依賴引入與基礎(chǔ)封裝第一步當(dāng)然是引入依賴。在pubspec.yaml里加上event_bus版本用當(dāng)前穩(wěn)定版即可。然后我建議不要直接在業(yè)務(wù)代碼里到處EventBus()而是做一個(gè)全局單例封裝。原因很簡(jiǎn)單如果每個(gè)地方都new EventBus()那就是多個(gè)獨(dú)立的總線A 發(fā)的消息 B 根本收不到。全局單例能保證整個(gè) App 共用一條總線。// event_bus_manager.dart import package:event_bus/event_bus.dart; class EventBusManager { EventBusManager._internal(); static final EventBusManager _instance EventBusManager._internal(); factory EventBusManager() _instance; final EventBus _bus EventBus(); void fireT(T event) _bus.fire(event); StreamT onT() _bus.onT(); }這個(gè)封裝很薄但好處是以后想換實(shí)現(xiàn)比如換成自定義的 StreamController只需要改這一個(gè)文件。另外我加了一個(gè)onT()返回 Stream 的方法方便配合StreamBuilder使用后面會(huì)講。4.2 事件類的定義規(guī)范事件類怎么定義直接決定了代碼的可維護(hù)性。我的規(guī)范是三條命名帶 Event 后綴、只放必要數(shù)據(jù)、盡量不可變。比如購(gòu)物車變化事件只需要帶上變化后的數(shù)量不需要把整個(gè)購(gòu)物車對(duì)象塞進(jìn)去因?yàn)橛嗛喺呖赡苤魂P(guān)心數(shù)量。class CartUpdatedEvent { final int totalCount; const CartUpdatedEvent(this.totalCount); } class UserLoginEvent { final String userId; const UserLoginEvent(this.userId); } class RefreshHomeEvent { const RefreshHomeEvent(); }注意const構(gòu)造函數(shù)能讓事件對(duì)象在編譯期確定減少運(yùn)行時(shí)開(kāi)銷。對(duì)于不帶數(shù)據(jù)的事件直接const RefreshHomeEvent()就行。這里有個(gè)小技巧如果事件很多可以按業(yè)務(wù)模塊分文件存放比如cart_events.dart、user_events.dart避免一個(gè)文件幾百行。4.3 訂閱與取消訂閱的標(biāo)準(zhǔn)寫法訂閱的標(biāo)準(zhǔn)寫法是在initState里注冊(cè)在dispose里取消。這是鐵律沒(méi)有例外。我見(jiàn)過(guò)太多人只在initState里on忘了dispose里cancel結(jié)果頁(yè)面退出后事件還在觸發(fā)報(bào)setState called after dispose的錯(cuò)誤。class _HomePageState extends StateHomePage { late StreamSubscription _cartSub; late StreamSubscription _loginSub; override void initState() { super.initState(); _cartSub EventBusManager().onCartUpdatedEvent().listen((event) { if (!mounted) return; setState(() { _cartCount event.totalCount; }); }); _loginSub EventBusManager().onUserLoginEvent().listen((event) { if (!mounted) return; _loadUserData(event.userId); }); } override void dispose() { _cartSub.cancel(); _loginSub.cancel(); super.dispose(); } }這里有兩個(gè)細(xì)節(jié)值得說(shuō)。第一回調(diào)里加了if (!mounted) return;這是雙保險(xiǎn)防止極端情況下 dispose 和事件觸發(fā)競(jìng)爭(zhēng)。第二每個(gè)訂閱都用一個(gè)獨(dú)立的StreamSubscription變量持有方便統(tǒng)一取消。如果訂閱很多可以用一個(gè)ListStreamSubscription來(lái)管理dispose 時(shí)遍歷取消。5. 實(shí)操全流程一個(gè)購(gòu)物車角標(biāo)同步的完整案例5.1 場(chǎng)景拆解與事件設(shè)計(jì)假設(shè)我們要做一個(gè)購(gòu)物車角標(biāo)同步功能。需求是這樣的商品詳情頁(yè)有“加入購(gòu)物車”按鈕點(diǎn)擊后底部 Tab 欄的購(gòu)物車角標(biāo)數(shù)字要 1同時(shí)如果購(gòu)物車頁(yè)面已經(jīng)打開(kāi)列表要刷新。這個(gè)場(chǎng)景里發(fā)布者是商品詳情頁(yè)訂閱者是 Tab 欄和購(gòu)物車頁(yè)三方互不相識(shí)。事件設(shè)計(jì)上我定義兩個(gè)事件CartCountChangedEvent負(fù)責(zé)角標(biāo)數(shù)字變化CartListRefreshEvent負(fù)責(zé)通知列表刷新。為什么不合并成一個(gè)事件因?yàn)榻菢?biāo)只關(guān)心數(shù)字列表關(guān)心的是數(shù)據(jù)職責(zé)分開(kāi)更清晰。如果合并角標(biāo)訂閱者還得從事件里解析出數(shù)字多此一舉。class CartCountChangedEvent { final int count; const CartCountChangedEvent(this.count); } class CartListRefreshEvent { const CartListRefreshEvent(); }5.2 發(fā)布端商品詳情頁(yè)的觸發(fā)邏輯商品詳情頁(yè)的“加入購(gòu)物車”按鈕點(diǎn)擊后先調(diào)接口接口成功返回最新的購(gòu)物車數(shù)量然后 fire 兩個(gè)事件。注意這里有個(gè)順序問(wèn)題一定要等接口成功后再 fire不能在點(diǎn)擊瞬間就 fire否則數(shù)量對(duì)不上。Futurevoid _addToCart() async { final result await cartApi.add(productId); if (result.success) { EventBusManager().fire(CartCountChangedEvent(result.totalCount)); EventBusManager().fire(const CartListRefreshEvent()); } }這里我用了result.totalCount而不是本地 1因?yàn)橘?gòu)物車數(shù)量可能受其他端影響以服務(wù)端返回為準(zhǔn)最可靠。這是實(shí)戰(zhàn)經(jīng)驗(yàn)事件里帶的數(shù)據(jù)要盡量是權(quán)威數(shù)據(jù)不要帶本地推算值否則多端同步時(shí)會(huì)打架。5.3 訂閱端Tab欄角標(biāo)的監(jiān)聽(tīng)實(shí)現(xiàn)Tab 欄通常在MainPage的initState里訂閱收到事件后setState更新角標(biāo)。角標(biāo)組件可以用Badge或者自己畫一個(gè)紅點(diǎn)。override void initState() { super.initState(); _cartSub EventBusManager().onCartCountChangedEvent().listen((event) { if (!mounted) return; setState(() { _cartCount event.count; }); }); }如果 Tab 欄是用BottomNavigationBar實(shí)現(xiàn)的角標(biāo)可以放在icon外面包一層Stack。這里有個(gè)性能小技巧如果角標(biāo)數(shù)字變化頻繁可以考慮用ValueNotifier配合ValueListenableBuilder只刷新角標(biāo)那一小塊而不是整個(gè) Tab 欄setState。不過(guò)對(duì)于購(gòu)物車這種低頻變化直接setState完全夠用。5.4 訂閱端購(gòu)物車頁(yè)面的刷新處理購(gòu)物車頁(yè)面的刷新稍微復(fù)雜一點(diǎn)因?yàn)樗赡苌婕熬W(wǎng)絡(luò)請(qǐng)求。收到CartListRefreshEvent后不能直接setState而是要先請(qǐng)求最新列表數(shù)據(jù)再更新 UI。_cartListSub EventBusManager().onCartListRefreshEvent().listen((_) { if (!mounted) return; _loadCartList(); }); Futurevoid _loadCartList() async { final list await cartApi.getList(); if (!mounted) return; setState(() { _cartList list; }); }注意_loadCartList里也要判斷mounted因?yàn)榫W(wǎng)絡(luò)請(qǐng)求是異步的返回時(shí)頁(yè)面可能已經(jīng)銷毀。這個(gè)細(xì)節(jié)很多人會(huì)漏導(dǎo)致偶發(fā)的崩潰。5.5 參數(shù)計(jì)算與數(shù)量同步的邊界處理購(gòu)物車數(shù)量同步有個(gè)邊界情況如果用戶在購(gòu)物車頁(yè)刪除了商品角標(biāo)也要跟著變。這時(shí)候購(gòu)物車頁(yè)從訂閱者變成了發(fā)布者刪除成功后 fire 一個(gè)CartCountChangedEvent。這就形成了一個(gè)雙向通信詳情頁(yè)發(fā)事件給購(gòu)物車頁(yè)購(gòu)物車頁(yè)也發(fā)事件給 Tab 欄。EventBus 天然支持這種多對(duì)多關(guān)系不需要額外處理。但要注意避免事件循環(huán)。如果購(gòu)物車頁(yè)收到CartListRefreshEvent后刷新列表刷新完又 fire 一個(gè)CartCountChangedEvent而 Tab 欄收到后又觸發(fā)什么導(dǎo)致再 fire就可能死循環(huán)。我的做法是刷新類事件和變更類事件分開(kāi)刷新事件只觸發(fā)數(shù)據(jù)拉取不反向 fire變更事件只在用戶主動(dòng)操作后 fire。這樣職責(zé)清晰不會(huì)繞圈。6. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄6.1 事件收不到的五種原因排查事件發(fā)出去了但訂閱者沒(méi)反應(yīng)這是最高頻的問(wèn)題。我整理了一個(gè)排查表按可能性從高到低排列。排查項(xiàng)現(xiàn)象解決方法事件類型不匹配完全無(wú)反應(yīng)檢查 fire 和 on 的泛型是否一致訂閱未注冊(cè)完全無(wú)反應(yīng)確認(rèn) initState 里 on 已執(zhí)行總線實(shí)例不同完全無(wú)反應(yīng)確認(rèn)用的是同一個(gè)單例訂閱已取消之前能收現(xiàn)在不能檢查是否被提前 cancel事件被繼承子類事件收不到避免事件類繼承用扁平結(jié)構(gòu)其中“總線實(shí)例不同”是最隱蔽的。如果 A 頁(yè)面用EventBus()新建了一個(gè)實(shí)例B 頁(yè)面用單例那它們根本不在一條總線上。所以我在第 4 節(jié)強(qiáng)調(diào)一定要用全局單例封裝從源頭杜絕這個(gè)問(wèn)題。6.2 內(nèi)存泄漏與重復(fù)訂閱的坑重復(fù)訂閱是指同一個(gè)頁(yè)面多次initState比如被 push 多次每次都注冊(cè)新的訂閱但舊的沒(méi)取消。結(jié)果一個(gè)事件觸發(fā)多次回調(diào)setState被調(diào)用多次輕則性能浪費(fèi)重則邏輯錯(cuò)亂。解決辦法是確保dispose里一定 cancel并且用late StreamSubscription變量持有引用。內(nèi)存泄漏則是訂閱者被總線持有頁(yè)面銷毀后無(wú)法回收。因?yàn)閺V播流的監(jiān)聽(tīng)列表里存著回調(diào)回調(diào)又閉包持有了 State 對(duì)象形成引用鏈。只要 cancel 了這條鏈就斷了。所以cancel 不是可選項(xiàng)是必選項(xiàng)。我個(gè)人的習(xí)慣是寫完on之后立刻寫dispose里的cancel形成肌肉記憶。6.3 事件順序與異步陷阱EventBus 的fire是同步的意味著事件會(huì)立即按訂閱順序執(zhí)行回調(diào)。如果訂閱者 A 的回調(diào)里有耗時(shí)操作會(huì)阻塞訂閱者 B 的回調(diào)。這在大多數(shù)場(chǎng)景下沒(méi)問(wèn)題但如果某個(gè)回調(diào)里做了重計(jì)算就會(huì)拖慢整個(gè)事件分發(fā)。解決辦法是把耗時(shí)邏輯放到Future.microtask或scheduleMicrotask里讓分發(fā)先走完。另一個(gè)陷阱是在 build 方法里 fire 事件。build 可能被調(diào)用多次每次 fire 都會(huì)觸發(fā)訂閱者導(dǎo)致無(wú)限循環(huán)或性能問(wèn)題。記住fire 只應(yīng)該在用戶交互回調(diào)或異步任務(wù)完成后調(diào)用絕不能在 build、initState 的同步部分里調(diào)用。6.4 調(diào)試EventBus的實(shí)用技巧調(diào)試 EventBus 最頭疼的是不知道事件流經(jīng)了哪些地方。我的做法是在封裝層加日志開(kāi)發(fā)模式下打印事件的類型和時(shí)間戳。void fireT(T event) { assert(() { debugPrint([EventBus] fire: ${T.toString()} at ${DateTime.now()}); return true; }()); _bus.fire(event); }用assert包裹release 模式下自動(dòng)移除不影響性能。另外可以做一個(gè)“事件監(jiān)視器”頁(yè)面在開(kāi)發(fā)時(shí)把所有事件打印出來(lái)方便追蹤。如果項(xiàng)目里事件特別多建議給事件類加一個(gè)toString實(shí)現(xiàn)打印時(shí)能看到具體數(shù)據(jù)。7. 進(jìn)階玩法EventBus與狀態(tài)管理的邊界7.1 EventBus配合StreamBuilder的用法前面提到我在封裝里加了onT()返回 Stream這其實(shí)是為了配合StreamBuilder。有些場(chǎng)景下用StreamBuilder比手動(dòng)listen更簡(jiǎn)潔尤其是當(dāng) UI 完全由事件驅(qū)動(dòng)時(shí)。StreamBuilderCartCountChangedEvent( stream: EventBusManager().onCartCountChangedEvent(), builder: (context, snapshot) { final count snapshot.data?.count ?? 0; return Badge(label: Text($count)); }, )這種寫法省去了initState和dispose里的訂閱管理StreamBuilder會(huì)自動(dòng)處理。但要注意StreamBuilder每次 rebuild 都會(huì)重新訂閱如果 stream 是每次新建的可能有問(wèn)題。所以onT()返回的應(yīng)該是同一個(gè)廣播流而不是新建的。這也是為什么封裝層要持有_bus實(shí)例。7.2 事件命名空間與模塊化拆分項(xiàng)目大了之后事件類會(huì)越來(lái)越多容易命名沖突。我的做法是按模塊加前綴比如CartCountChangedEvent、UserLoginEvent、OrderPaidEvent。如果模塊特別多可以用命名空間類來(lái)組織。class CartEvents { static const countChanged cart.count.changed; }不過(guò) EventBus 是按類型匹配的用字符串反而失去了類型安全。所以我更推薦直接用類名區(qū)分配合文件夾分模塊存放。比如events/cart/、events/user/每個(gè)文件夾里放對(duì)應(yīng)的事件類。這樣既類型安全又便于查找。7.3 從EventBus遷移到狀態(tài)管理的時(shí)機(jī)判斷什么時(shí)候該從 EventBus 遷移到 Provider 或 Riverpod我的判斷標(biāo)準(zhǔn)是當(dāng)事件開(kāi)始攜帶狀態(tài)、且多個(gè)訂閱者需要基于同一份狀態(tài)做不同渲染時(shí)。比如購(gòu)物車角標(biāo)如果只是顯示數(shù)字EventBus 夠了但如果購(gòu)物車頁(yè)面、結(jié)算頁(yè)、個(gè)人中心都需要基于同一份購(gòu)物車數(shù)據(jù)做復(fù)雜計(jì)算那就該用狀態(tài)管理了因?yàn)闋顟B(tài)管理能保證數(shù)據(jù)一致性而 EventBus 每次 fire 都是獨(dú)立事件訂閱者各自維護(hù)狀態(tài)容易不一致。遷移不是非此即彼。我現(xiàn)在的項(xiàng)目里EventBus 和 Riverpod 是共存的Riverpod 管狀態(tài)EventBus 管事件通知。比如用戶登錄后Riverpod 更新用戶狀態(tài)同時(shí) fire 一個(gè)UserLoginEvent通知那些不需要響應(yīng)式狀態(tài)的模塊比如埋點(diǎn)、日志。兩者各司其職代碼反而更清晰。8. 我個(gè)人的實(shí)操心得與避坑清單用了幾年 EventBus踩過(guò)的坑基本都在這了。最后分享幾條血淚經(jīng)驗(yàn)都是文檔里不會(huì)寫的。第一條事件類一定要加 const 構(gòu)造函數(shù)。這不是性能優(yōu)化是習(xí)慣問(wèn)題。const 能讓你在 fire 的時(shí)候直接const XxxEvent()代碼更干凈而且編譯期就能發(fā)現(xiàn)類型錯(cuò)誤。第二條訂閱回調(diào)里第一行永遠(yuǎn)寫if (!mounted) return;。別問(wèn)為什么問(wèn)就是被setState called after dispose折磨過(guò)。這個(gè)判斷成本極低但能擋掉 90% 的偶發(fā)崩潰。第三條不要在事件里傳 BuildContext。Context 的生命周期和頁(yè)面綁定事件是全局的傳 Context 出去極容易導(dǎo)致 use after dispose。如果回調(diào)里需要 Context讓訂閱者自己從自己的 State 里拿。第四條事件數(shù)量控制在合理范圍。我見(jiàn)過(guò)一個(gè)項(xiàng)目定義了上百個(gè)事件類最后沒(méi)人搞得清哪個(gè)事件對(duì)應(yīng)哪個(gè)邏輯。我的建議是單個(gè)模塊的事件不超過(guò) 10 個(gè)超過(guò)就說(shuō)明該用狀態(tài)管理了。第五條寫單元測(cè)試時(shí) mock 掉 EventBus。因?yàn)?EventBus 是全局單例測(cè)試之間會(huì)互相污染。我的做法是在測(cè)試的 setUp 里重建單例或者用依賴注入把 EventBus 傳進(jìn)去測(cè)試時(shí)傳一個(gè)干凈的實(shí)例。這個(gè)內(nèi)容后續(xù)還可以這樣擴(kuò)展一是把 EventBus 和 Flutter 的Isolate結(jié)合做跨線程事件通信二是做一個(gè)可視化的事件流監(jiān)控面板開(kāi)發(fā)時(shí)實(shí)時(shí)查看事件分發(fā)情況三是研究event_bus包的替代實(shí)現(xiàn)比如基于ValueNotifier自己擼一個(gè)更輕量的版本。這些方向我都試過(guò)一部分有機(jī)會(huì)再單獨(dú)開(kāi)一篇聊。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色呦呦、国产精品| 91成人国产综合久久精品蜜月| 国产激情在线| 亚洲综合色男人网| 欧美三四五区| 色狠狠 - 百度| 激情露脸爱| 91四海无码日韩欧美| 欧美日韩操逼动图| 五月丁香六月激情| 亚洲色图欧美色图综合| 亚洲 自拍偷拍 欧美| 五月丁香综合| 亚洲资源吧| 日韩字幕一区| 日本欧美不卡| 国内亚洲精彩视频在线| 蜜桃一区二区三区| 日本性感人妻91| 日韩999| 亚洲成人精品久久久| 精品免费成人久久| 97干在线视频| 一区二区高清视频| 丁香激情五月| 岛国激情视频在线观看| 欧美人妻二区三区| 老子午夜伦不卡影院| 蜜臀国产AV中文字幕| 在线电影亚洲色图| 色综合91| yellow网站免费观看日韩高清无码| 亚洲人妻熟妇三十三区| 无码高清专| 天天色怡春院| 欧美国产精品| 欧美性少妇| 久热伊人99re| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 亚州九九九精品视频| 激情小说图片亚洲首页| 欧美日韩免费专区在线| 国产毛片毛片4p懂色| 男人兔费天堂| 51久久夜色精品国产麻豆| 超碰中文字幕人妻草一区| 中国一级αV| 成人综合色网| 亚洲黄片免费在线播放| 欧美一品道| 亚洲国产午夜真人一级片中文字幕精品黄网站| 91 综合 色| 18禁无码永久免费无限制| 97久久超碰国产网站| 狠狠操官网| 色欧洲97| 久久女人视频| 亚洲一区中文字幕一区| 亚洲色人阁| 1024亚洲中文字幕久在线看片你懂的 | 青青青操| 久操视频资源站公开| 91女优在线观看 | 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 91在线一起| www.久久| 黑人精品XXX一区一二区| 亚洲日本大香蕉1| 男人下部插入女人下部| 九九综合久久| 亚洲黄色网址视频| 欧美一二三级精品在线| 欧美AB在线| 亚洲精品一二三四区| 欧美顶级黄色大片免费| 91欧美www| 九九毛片这里只有精品| 综合色啪| 国产农村妇女一区二区| 色狠狠综合| 老司机老司机午夜影院| 国产精品激情久久久久久久| 色在线综合| 亚洲自拍97| 久久欧洲| 97超碰热线| 2001天天操| 免费一级欧美片片线观看| 亚洲另类小说卡通动漫| 四虎av在线| 狠狠躁日日躁夜夜躁A| 91麻豆天美国产欧美| 99热精品在线| 日本亚洲熟女视频| 奇米四色影视777久久久| 精品综合久久久久久五月天| 欧美人体性爱互联网第一页婷婷日本| 国产青青美女玩逼视频| 少妇六月天| 亚洲AV无码天美传媒一区| 亚洲阿v天堂无码z2018| 亚洲欧美国产中文视频| 狠狠色狠狠色狠狠五月| 免费看久久久性性| 99久久精品国产高潮| 亚洲日韩美国人妻| 亚洲综合精品国产一区| 久久性视频| 收看日本人日bb| 91丨九色丨国产丨人妻在线| 黄色av网站在线播放| 欧美性生活男人的天堂| 大黄片做爱的大的| 九九干| 国产精品一区二区校花| 中国一区二区亚洲人妻| 桃色五月天| 日本视频在线观看污污污| 中文字幕一区二区韩| 性在久久久久久| 欧美日韩性爱操大逼| 爱av免费| 日本天天色| 久久亚洲不卡| 中文字幕97色| 97精品一区| 操久久久久| 久久久久深夜无码| 中文字幕丰满子伦无码专区在线视频最新 | 韩国女主播青草在线| 夜夜肏2021| 国产玖玖| 精品97久久综合| 日韩精品9区| 无码人妻丰满熟妇区毛片| 亚洲日本大香蕉1| 激情欧美97| 亚洲欧美高清无码| 综合久久六月久久婷婷| 91N欧美| 中出789在线视频| 久久久久久久9最新免费视频观看| 啊啊啊 在线| 超碰在线人妻中文字幕| 99久久久无码国产精品性男| 99re6久热只有精品6在线直播 | 五月丁香大香蕉| 91狠狠综合久久久久久| 亚洲自拍欧美色综合| 亚洲天堂电影网99999| 91久久久亚洲| 一区二区三区视频在线观看免费| 亚洲中文制服诱惑| 91伊人久久在线| 91骚熟女| 人人操人人舒服| 中文字幕 国产区| 精品国产少妇高潮视频| 无卡一区=区| 久久久久久久久一区二区三区| 亚洲狠狠入| 新亚洲无码| 欧美很很操视频| 96AV久久久| 97超碰超| 免费综合亚洲中文| 热天堂一区二区| 久久久九| 搡老女人老妇女AAA一VU麻豆| 亚洲欧美精品一区天堂久久 | 在线观看日韩av不卡| 91色噜噜狠狠| 夜夜欢天天干| 99色色网| 欧美亚洲清纯| 在线看的av| 九九热精品免费视频| 超碰97综合网| 蜜臀操逼黄色视频操的好爽| 97国产天堂岛| 国产三级日产三级韩国三级| 嫩草伊人久久精品| 婷婷色色五月天福利| 激情综合97| 91成人精品| 欧美日韩精品一区二区三区高清| 国产精品夜夜夜| 亚洲天堂一区二区久久| 二对二中文字幕。| 国产熟女免费观看久久| 日日做夜狠狠爱欧美黑人| 9久在线视频只有精品| 亚洲色图在线视频| 在线亚洲欧美| 免费黄色片子| 亚洲图片欧美色| 欧美在线视频99| KK色在线影院| 国产激情综合五月久久| 久9精品| 丁香五月综合| 欧美v亚洲v综合v国产v妖精| 亚洲瓯美色图| 嗯嗯啊啊操我| 日韩三级网址| 日本高清视频xxxx| 久久精品中文| 久热伊人| 97综合国产| 裸体美女免费看网站青草| 风月影院男女十八禁| 日韩在线性爱免费视频| 亚洲熟女乱色一区二区三区久久久| 亚洲综合另类小说色区亚洲成av人片在www| www.97在线| 日韩免费在线观看不卡| 亚洲黄日韩无码专区| 2019精品国产无码成人| 青青操视频在线| 丝袜美腿制服人妻二区中文字幕| 亚洲综合草草| 精品国产污一区二区三区| 久久超碰国产一区二区三区| 91AV天美在线视频| 中文字幕高清20页视频| 岛国片在线播放| 国产精品粉嫩福利在线| 五月天婷婷基地| 农村女一级毛卡片| 欧日韩在线观看| 精品国产精品一区二区| 欧美成人一级麻豆| 久久大精品乱码视频人妻熟女| 网页导航五月天免费一二三区| 99在线精品观看视频中文| 香蕉在线一区二区三区| 美国人人操人人操| 日逼97| 中文字幕日韩精品一区二区三区| 国产美女高潮叫床视频| 亚洲中文字幕在现观看| 福利大香蕉| 日韩乱伦影音先锋| 欧美激情专区| 国产热av| 欧美老妇女内射网址| 欧美婷婷五月天| 精品国产Av无码久久久亚洲| 综合网亚洲1| 熟女啪啪视频| 久妇网| 色牛牛AV| 先锋激情∨在线视频播放| 亚洲色图欧美色图在线播放| 男人的天堂2018.| 亚洲无码AV九九九| www.久久制服糖| 天天肏视频| 激情婷婷丁香| 欧美 日韩 国产传媒| 久久久久9| 三级AV入口| 色噜噜狠狠色综无码久久合欧美| 99热婷婷一区二区三| 青青青艹在线视频| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 这里是精品| 99精品久久| 日韩去日本高清在| 国产女人高潮嗷嗷嗷叫小说| 色哟哟 日韩精品| 97中文字幕一区| 嗯嗯啊好大| 亚洲黄色影视| 亚洲国产日韩欧美熟妇在线| 日韩乱伦影音先锋| 亚洲蜜乳av| 成年人网站在线免费观看| 91n处女在线观看| 91色综合色| 亚洲激情色片| 97在线资源| 综合av影片| 躁躁日曰躁2020| 四虎 精品 WWW| av优播| AV 少妇 人妻 偷拍| av天堂手机版追回| 在线看免费无码AV天堂的| 久久黄色视频一区二区三区 | 亚洲欧美综合| 看免费的黄片| 密乳无码| 亚洲欧美国产日本一区二区三区| av中文在线| av大香蕉| 色婷婷aV一区二区三区麻豆综合| 9/A片| 亚洲色图久久成人| 97高清啪啪| 男女91| 欧美 传媒 麻豆 日韩 偷拍| 综合网欧| 大香蕉92| 久久这里只有精品9| 97久久国产| 国产一级内射高清视频| 亚洲欧美在线观看无码| 亚洲国产麻豆一区二区三区| 亚洲午夜福利在线影院| 亚洲精品精品一区二区| 99色热| 美女啊啊啊啊啊啊啊| 十八禁黄色成人网站观看| 一区二区不卡| 人人妻人人爽人人精品| 亚州欧美色图| 国产精品盗摄 偷窥盗摄| 日韩av免费一级电影| 亚洲一区二区三区中文字幕| 日韩人妻一区二区精品| www老逼91| 1区2区3区中文字幕日韩| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 天天综合网~91综合网| 精品熟妇视频一区二区| 日韩有码 一区二区三区| 成人免费看吃奶视频网站| 中文操嬖片。| 亚洲丝袜色| 绑缚麻绳人妻寝取完整版| 蜜臀无码一区二区| 五月天亚洲色图| 国产在线激情视频| 免费观看的av| av东京热男人的天堂| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 在线岛| 涩五月婷婷| 国产乱弄免费在线视频。 | 欧美在线 亚洲| 亚洲色图A| 国产AV色黄看到爽| 婷婷在线视频| 亚洲男人综合网| 97超碰欧美精品| 一起草日韩| 久久久久久久久久久六六| 欧美午夜视频| 超清福利精品视频在线| 九九九九九九九精品视频| 美女AV一区二区| 超碰美国| 九热视频| 欧美91久久久久| 又粗又长又大国产不卡| 无码 有码 国产18p| 九月AV| 欧洲综合色| 欧美一级久久久久久久大片动画| 操我啊啊啊啊啊| 清纯唯美亚洲另类| 黄色网址在线免费观看| 色天堂综合| 成人五月天丁香激情综合| 午夜理论片在线观看免费| 白丝AV网站| 精品午夜福利| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 大香蕉免费中文| 蜜桃臀久久| 成人小说视频在线精品欧美| 宗合情欲网| 亚洲国产97| 99精品在线观看| 久男人久久| 强歼乱伦资源网| 欧美色一二三| 色婷婷视频| 久久一二三四五六七八九区区| 97视频在线看| 炮色五月| 人人么人人操| 日韩伦理视频| 免费看黄片现成| 麻豆区99999| 欧美另类自拍| AV久日| 啊啊啊骚| 在线视频资源| ai欧美亚洲小说| 成人A片男人的天堂| 五月丁香综合网| 欧美人妻一区| 日韩AV中文字幕电影| 天天看天天在线精品| 啊啊啊好舒服好爽啊啊啊视频| 亚州Av天美传媒| 国内91熟女人妻丝袜天天精品视频在线 | 男女啪啪网站免费视频| 欧美综合色综合| 2019AV天堂| www.一本大99| 亚欧美综合网。| 偷拍在线观看视频| 91bbbbbb| 欧美一级黄片视频在线| 欧美大香蕉专区网| 91黑丝少妇| 亚洲色入欧美| 丝袜 中出 制服 人妻 美腿 中文字幕| 中文字幕色AV| a片自拍直播视频| 美女操逼福利视频| 色女99一级片在线观看| 久久久久久99999国产精品| 九九超碰综合网| 天天看天天日天天操| 秋霞无码av鲁丝片一区| 欧美日韩m| 欧美91网站| 亚洲骚逼少妇| 91超级碰碰碰| 九九九九97| 在线观看一级α片刺激高潮视频| 岛国片在线观看视频亚洲| 97公开久久| 国产精品久久久久无码Av网曝门| 欧美久热| 九九九国产| 国产 v乱码一区二| 91大香蕉伊人| 国产 日韩 欧美高清| 欧美综合97www| 中出20p| 国产最新小视频在线播放下载 | 亚洲国产欧美另类自拍| 大吊色| 最新日本中文字幕| 天天综合网站| 淫荡网址| 欧美中文字幕男人天堂久久精品| 欧美春色| 熟妇人妻一区二区| 天天操天天干一区二区| 日本顶级天天操狠狠操夜夜操中文字幕| 97精品一区二区视频| 激情五月天婷婷| 欧洲精品一级二级精品综合视频综合| 日本免费一区二| 国产家庭乱伦性爱视频| 四虎在线免费视频| 欧美日韩99| 97国产精品视频| 国产四虎在线| 午夜福利av电影在线| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 人人干人人操人人..com| 欧美丝袜美女电影一二三四区| 国产色精品午夜大片| 久久久久女教师免费一区| 91大胆欧美| 日韩国产乱子伦App| 99精品人人爽| 操久久久久久| 国产精品久久久久久照片| 超碰在线1234区| 色婷婷色99国产综合精品| 综合色91| 色色97爱| 91精产一区二区三区| 日韩久久三区| 久精品无码av一区二免费国产在线观看| 另类欧美综合| 黑人综合色| 日韩99神马视频播放| www.人人cao| 秋霞Av理论一级在线| 日韩干B| 四虎AV影视国产精品亚洲精品| 色五月首页| 国产日韩欧美亚洲精品95| 84YTCOM性无码| 国产不卡的视频 | 啊啊啊用力在线观看| 国产精品久久久久无码AV会牛| 精品福利| 久艾草在线精品视频在线观看| 免费视频一二三区| 超碰在线日韩一区| 亚洲欧美综合网站| 91网站18+| 国产视频第2页| 日韩av色图综合| 一个人在线看的黄色电影网站| 69人妻精品一区二区绯色| 亚洲 日本 一 二 三| 亚洲欧美日韩精品久久久一区二区| 亚洲色 国产 欧美 日韩| 国产A v无码专区| 日韩国产欧美伦理在线| 99久久精品无码一区二区| 日本色日夜干| 亚洲熟女乱色一区二区三区| 国产精品美女在线一区| 天天干天天操天天干天天操| 日本一本道A级黄色毛片试看60分钟| 尤物视频一区| 日韩av一级黄片| 成人午夜高潮av猛片| 色综合久久av| 青青草精品| 亚洲欧美另类少妇精品| 韩国三级理论在线| 人妻夜夜爽天天爽麻豆三区网站| 99国产精品久久久久久久成人热| 大香蕉伊然在亚洲91| 五月天大香蕉| 亚洲性猛| 黑人精品成人一区二区三区 | 亚洲精品第一| 五月婷婷色| 青青草中文字幕| 国产精品一区在线播放| 婷婷尹人大香蕉免费| 日本三级久| 蜜乳AV一区| 午夜福利免费福利视频| 亚洲精品 欧美97色色| 性暴力欧美猛交在线直播| 国产无码精品久久久久久| 91欧美色| 亚洲中文字幕乱码无码一区二区| 97在线观看免费| 麻豆亚洲AV成人无码久久精品| 2025亚洲男人天堂| 91人人| 中文有码第五页| 97天天| 亚洲熟女少妇免费视频| 欧美乱欲| 乱色老一区二区三区的观看方式| 国产精品香蕉| 自拍啪啪视频| 久久久久久久亚洲Av无码| 九九九热| 亚洲色天| 是还免费视频1727我| 国产精品麻豆成人av| 国产一级内射无挡观看| 蜜桃色色网站视频三区| 东北丰满熟女国产一区| 蜜桃久久精品一区二区三区| 亚州综合色| 青女偷拍网| 国产情侣自拍在线播放| 中文字幕人妻资源在线| 在线97在线| 日本99一区二区| 一级性爱视频免费在线| 亚洲综合有码| 亚洲最大网站av| 96久久精品一二三区色欲| 91麻豆天美国产| 亚乱色| 裸体1区| 超碰在线综合97| 69精品少妇一区二区三区蜜桃| 中出20p| 国产成年精品高清在线观看91| 亚洲?V无码专区在线电影| 97操在线| 青青草狠狠撸| 麻豆这里只有精品| 蜜桃臀 后入 一区 二区 三区 在线| 国产成人91一区二区三区| 精品无码秘 人妻一区二区| 日本 免费 一区二区三区 久久香蕉 | 中文字幕日韩人妻视频| 艹少妇网站| 操少妞在线视频| 欧色网址| 九九亚洲| 91精品国产综合久久久蜜臀| 91干熟女| 色爽——AV| 久久久久骚| 91蜜桃传媒精品久久久一区二区| 成人日韩中文字幕| 97国产精品一区二区传媒公司| 粘花网06av视频| 欧美综合另类| 久久久精品一区二区| 伊人精品视频| 日本一天色道久久久精品视频| 国产精品电影大全| 99久久综合| 国产精品爽爽va在线观看98| 午夜噜噜噜| 60秒试看最爽10分钟网站| 狠狠激情综合狠狠操中文字幕| 91欧美情色| 天美精品一区二区三区四区在线观看| 亚洲精品xxx| 78精品| 天天摸天天舔天天操| 超碰人人草| 国产亚洲女v在线观看| 丰满人妻-区二区三区| 国产视频第2页| 97超碰色五月| 人妻中文在线| 成人性爱电影一区二区| 国产精品不卡一区二区三区av| 国产人妻精品一区二区三区秋霞| 天美麻豆精品视频99| 麻豆国产免费影片| 日韩人成网站在线播放| 少妇啪啪自拍| 五月婷婷六月激情| 激情AV| 精品在线观看视频在线| 国产精品无码久久久久2025| 97综合国产| 天天做天天爱| 3PAV乱伦视频| 国产传媒日韩| 伊人国产成人av网站| 国产97视频| 欧洲精品一级二级精品综合视频综合 | 久久在线观看免费视频| 亚洲欧美色图片| 欧美中文字幕精品人妻| 国产精品农村妇女精品| 日韩欧视频| 97爱爱爱| 国产美女自拍AV| 亚洲91在线播放影院| 亚洲精品无码久久AV| 黄色性爱网网| 天美传媒一二三区永久网站| 岛国免费视频在线| 日韩成人人妻网站| 嗯嗯啊啊操死我| 99爱精品| 日韩AV电影网站| 欧美日韩岛国大片在线观看| 日本免费一级AAA大片器| a片 xxxx受爽视频| 亚洲drav色图| 91在线免费观看处女| 日日操免费视频| 亚洲AV色图一区| 久久久久免费少妇| 亚洲无码成人精品| 97在线日韩中文字幕| 秋霞蝌科网日本一区| 色综合1991| 国产AV色黄看到爽| 天堂网 主播 亚洲| 亚91网| 搡老女人老妇女AAA一VU麻豆| 午夜毛片高清免费不卡| 亚洲综合五月天婷婷丁香| 国产综合在线视频网站| 97色操| 四虎影视 亚洲无码| 黄色网址久久精品欧美喷水| 高潮的A片激情扒开一区| 欧美日韩中文视频播放| 三级三级三级日本99| 九九九九九九九九九九九蜜桃| 黄色电影在线播放综合网站| 久啪| 亚洲高清综合网| 一类无码操逼视频| 日本啊啊啊啊啊视频| 久射吧| V A在线| 精品国产人成在线| 人妻少妇色综合| 日本性感人妻91| 天天看人人操屄犊摸阴| 国产精品久久久久久久久久梁医生| 二区熟妇韩日| 97这里有精品| 色香91| 麻豆黄站| 欧美性爱五月天| 私人尤物在线精品不卡| 九九九久千久久激情蜜桃在线看 | 草B在线| 99啪| 囯产乱伦一区二区三女| 2024黄色视频| KK色在线影院| 国产少妇高潮| 这里有精品| 鸡巴插逼视频| 无码高清操逼| 欧美精品系列| 好屌色综合| 一区二区三区精品黑丝白丝酒店对鸡| 欧美1区二区三区公司 | 校园春色之综合网| 国产尤物AV尤物在线观看不卡| 超碰色综合| 欧美线天码中字| 日韩精品9999| 天天操女人| 99久在线精品99re8热| 色欲av一区二区三区蜜芽| 四虎免费在线观看| 91在线一起| 亚洲天堂日本| 日韩欧美丝袜诱惑| 婷婷三区| 天天色综合图片| 97香蕉碰碰人妻国产欧美| 日日操丁香五月天| 欧美性爱18观看| 熟妇乱伦一区二区| 五十路三区在线| 超碰色大香蕉| 欧美图片校园春色| 国产AV线| 亚洲少妇免费视频\| 亚洲限制级| 亚洲精品 超碰| 67194无码不卡| 九九热男人天堂| 日韩人妻资源网| 天天影视网综合少妇| 免费视频无码| 天天综合,91综合永久| 日韩三级一区| 97九色人妻| 午夜男人天堂| 91丝袜美女| 韩日男人的天堂| 综合日韩激情另类图片| 男人的天堂2018.| 96AV久久久| 国产91精品久久久久久久网曝门| 啊好爽受不了无码| 亚洲免费日韩在线一区二区| 麻豆人妻少妇在线免费观看| 鸥美精品一区二区久久婷婷| 九九九久久久久| 国产精品电影推荐| 超碰视97中文| 这里只有精品97| 久久久亚洲熟妇熟女| 极品销魂美女一区二区| 亚洲图片色图欧美另类 | asc国产精品| 9精品久久久久| 啊啊啊啊啊啊啊啊视频| 欧美成年人性爱视频免费观看| 蜜乳中文字幕a在线| 八戒无码国产午夜福利| 国产精品一二三在线看| 亚洲国产一区二区三区四区国产| 色色色欧美| 色香阁在线| 91熟女综合| 97超碰国产亚洲精品| 97亚洲中文| 91被操| 精品v日韩欧美国产| 99精品无码| 97免费视频网| 国产精品毛片| 亚洲色欧美| 秋霞久久亚洲精品成人| 色五月婷婷久久| 久久久av爱| 在线观看啊啊啊啊啊| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 久妇网| 色在线69堂| 香蕉人欧美综合| 国产一区二区三区视频在线看| 日韩中文字幕二区| 亚洲瓯美色图| 五月天人妻综合| 人妻性爱一区二区| 欧美很很操视频| 九九九久千久久激情蜜桃在线看| 精品妇操一区二区三区| 久久精品一区二区| 玖玖玖玖精品国产剧情| 水澄无码AV| 日韩精品电影| 中文字幕后石码三区四区| 午夜福利精品| 射丝袜高跟鞋99| 人人操超碰在线| av一区二区三区四区| 久久伊人大香蕉| 久久综合超碰| 秋霞Av理论一级在线| 影音先锋国产精品| 欧美大战久久久伊人| 91肉丝| www激情| 91 国产丝袜在线播放-百度| 国产亚洲精品一区二区三区| 婷婷色婷婷| 青青草久久在线| 国产亚洲日韩欧| 中文字幕91综合| 97视频免费播放| 欧美黄色大香蕉一区二区| 精品999日本| 日本熟女不卡视频| 青青草原狼av| 三久久久四久久久久| 9l视频自拍9l九色成人| 国产精品粉嫩福利在线| 欧美黄色大片在线观看 | 日韩黄色小说| 熟女精品va中文字幕| 成人五月天色网| 波多野42部激情无码喷潮| 综合影院亚洲| 天天久久| 校园春色 男人天堂 | 99日精品欧美国产| 欧美第二页午夜| 国产精品婬乱一级毛片彝族| 免费成人在线熟妇网| 国产精品久久久久久照片| 国产女同性恋视频| AV天堂国产| 国产乱弄免费在线视频。| 秋霞免费无码视频日韩A片| 亚洲熟妇乱女区二区三区| 欧美亚洲图片| 天天干一区二区| 中文字幕第9页萱萱影音先锋 | 中文字幕av亚洲精品| 人人妻人人操人人乐| 九九AV| 中文字幕版| 91香蕉视频在线观看免费| 国产欧美日韩臀 | 欧美在线|亚洲| 欧美视频在线视频免费va| 九九九九一区| 亚洲天堂,男人| 亚洲无线观看久久| 青青草原综合久久大伊人精品| 欧美v日韩v亚洲v最新在线| 国产视频一区二区三区久久亚洲天堂 | 操B在线观看| 色哟哟av| 精品精品精品| 蜜乳成人AV| 超碰69| 91欧美| 日本东京热久久久电影| 亚洲欧洲色情高清| 爆操无码| 亚洲欧美色图| 99www.bibizy香蕉资源国产一区二区三区高清 | juliaann丝袜| 五月天久久婷婷亚洲 | 一本久久久精品| 伊人大香蕉在线| 日韩人妻播放| 玖玖久久久| 久久香蕉超碰97国产精品| 国产AV高清AV无码| 国产精品999aaa| 激情人妻另类| AV天天在线观看| 色婷婷激一区二区三区| 久久伊人影院| 99国产精品久久久在线播放| 日韩人妻无码专区| 国产不良强奸视频免费看| 9997se| 密臀在线免费观看| 天天插天天操| 国产黄色影片在线观看| 极品色综合| juliaann丝袜大战黑鬼| 激情五月综合网| 国产大陆天天艹| 日日摸日日碰夜夜爽视频| 亚洲在高跟鞋自慰久久在色线| 97香蕉碰碰人妻国产欧美| 久久精品国内Av熟女高清| 亚洲丨在线| 亚洲天堂日本| 手机不卡视频不卡在线一二三区| 天天干天天狼在线视频| 国产无马在线| 91高潮| 日本亚欧爱爱| 色香在线| 久久人人爽爽爽人久久久| 色综合色欲色综合色综合色综合| 超碰免费人妻人人| 久久超碰com| 少妇特黄一区二区三区| 91欧美美女日韩国产婷婷| 五月婷婷综合在线| 久久AV无码网址| 99久久久无码精品国产人| 国产精品熟女一区二区三区| 99草精| 啊嗯嗯啊好大好爽| 精品人妻视频一区二区三区蜜桃视频| 超碰79人人乐| 久热免费视频| 国模精品一区二区三区苹果色戒 | 久久久久人| 亚欧美综合网。| 天天舔九色婷婷| 亚洲另类色图片| 精品久久久av| 人人乐大香蕉| 久久精品国产精品亚洲艾通辽熟妇 | www.色操逼| 天天躁日日躁AAA片李宗瑞| 综合在线导航一区| 中文日本免费高清| 人人操人人插人人摸人人干| 欧美日韩啪啪电影| 国产精品久久久久久久久久梁医生| 国产老女人久久毛| 国产乱子伦久久精品综合一区二区三| 青青五月天| 欧美啪啪色吧在线| 99热在线播放| 男人午夜天堂| 国产综合色精品在线观看| 五十路熟女人妻一区二区在线观看| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 国模一区二区三区| 91色碰| 久久久久一本一区二区青青蜜月| 亚洲熟女综合| 黑人与人妻| 日韩色图 一区二区| 色777999综合| 一区二区三区一亚洲中文字幕、综合区灬 | 色噜噜国产在线| 殴美综合色88| 青青三级视频| 欧美日韩不卡传媒| 伊人91| 啪啪性爱免费视频| 天天草夜夜草高潮片| 一级黄色性爱A级片| 日韩精品在线观看网站| 九九成人| 久草精品国产蜜臀 | 日韩性爱电影一区| 99精品在线| 97超碰天天爱天天爱| 天海翼久久| 99久久99九九99九九九| 2020久久免费视频| 强奸乱伦亚洲第一页| 欧美视频边做饭边橾| 天天色综合图片| 久久久久久久久久久久黄色 | 白丝AV| 3028国产精品| 26uuu欧美| 亚洲大色堂| 全国男人天堂网| 在线视频 亚洲精品| 国产精品欧美日韩久久| 一本久道久久综合狠狠爱| 天天天乱色综合全| 日本不卡中文| 色视频蜜乳| 91在线无码精品秘 软件| 国产高清1234区| 91无摭挡| 日韩成人私密一级精品av| 久久久久亚洲Aⅴ无码| 国产欧美日韩女同性恋ww喷水精品| 色情亚洲日本成人| 97久久国产精品女不卡| 国产最新小视频在线播放下载| 麻豆这里只有精品| 91国产大片| 亚洲熟女诱惑| 国产理论视频在线播放| 韩国一区二区精品亚洲| 久久久一区二区| 国产一区二区成人av在线播放| 中文字幕日本久久| 97 国产一区| 96久久久久| 亚洲一本大道中文字幕无码在线| 五月天色图| 亚洲成成熟女人综合一区二区| 一线黄色免费性爱片| 美女黄页| 91欧美经典| 欧美日韩性爱视屏免费看了| 欧美日韩精品久久| 亚洲人妻在线精品| 亚洲激情综合| 欧美丝袜美女电影一二三四区| а√天堂资源官网在线资源| 五月婷婷激情| 狠狠97| 久久久久亚洲Aⅴ无码| 97久久久精品| www.亚洲黄色| 丰满少妇人妻久久久久久| 精品日日人妻| 青娱乐日韩无码| 91熟女.com| 欧美性爱中文字幕无线码| 久婷婷一区| 男女激烈网站最新| 安徽熟妇视频| 成人97人人超碰人人| 成年男人的天堂| 91精品国产91综合久久蜜臀| 天天干一干| 超碰色老头| 天天综合网~69| 欧成人精品H无码| 91粉芽高清在线一区二区| 黄色工厂这里只有精品| 大香网伊人久久综合| 亚洲日精品| 日本肉体xxxx裸交| 久久久999国产| 亚洲色婷婷| 国产一区二区在线播放| 亚州精人品大香蕉| 精品久| 亚洲AV免费在线观看| 欧美精品成人一区二区在线观看| 超碰调教97| 久久狠狠色噜噜狠狠狠狠97| 亚洲国产欧美日韩人妻日中文| 超碰97护士| 97操97色| 亚洲色系另类精品国产| 欧美传媒一区| 九九综合久久| 狠狠爱夜夜| 偷拍 精品 另类 四区| 超碰日韩人妻| 超碰1997| 亚洲激情av| 亚洲另类天堂| 蜜臀久久在线视频| 亚洲色 国产 欧美 日韩| 人妻激情视频| 69超碰综合| 性色av大全| 熟女91网| 中文字幕一区 二区三四五 区日 日骚| 日本一区不卡| 欧美综合在线91| 午夜黄色免费在线观看| 欧美熟妇精品黑人巨大91| 国产精品乱人伊人网| 福利操逼| 91在线观看,天天综合| av婷婷色网| 熟女精品va中文字幕| 国产999精品久久久| 亚洲情色一区综合| 乳欲人妻办公室奶水| 青青草大香蕉视频| 欧美综合第一| 中文字幕av亚洲在线| 麻豆久久一区二区三区| 97资源免费视频| 丁香六月婷婷综合| se01国产在线视频| 少妇精品| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 激情综合五月婷婷| 欧美精品23| 超碰久超碰久| 综合色拍| 无码9区| 艹比视频国产精品| 免费精品无码一级毛片牛牛影视 | 亚洲 欧美 精品专区 极品| 亚洲欧美综合网站| 午夜呻吟欧美| 九九热AV| 日韩欧美午夜视频在线| 中英熟女操女| 亚洲天在线| 东北女人操比视频| 99热超碰| 亚洲高清无码免费观看视频| 国产午夜福利电影免费在线观看| 日本熟女不卡视频| 国产精品黄色三级av| 天天天干977| 亚洲男人天堂2013| 亚洲AV资源| 亚洲欧美精品一区天堂久久 | 久久伊人最新网址视频| 国产精品69久久久久久久| 操操操操操操| 黑操B| www网站黄| 91社操逼| 尤物视频一区| 青娱乐福利99| 免费视频一二三区| 国产丁香精品露脸视频| 狠操91,com| 欧美日本天堂| 97精品久久久久久久| 按摩中文字幕| 67914亚洲精品| 久久人妻精品| 久久xx| 色婷婷久久| 大香蕉乱伦视频网| 色香色欲天天综合网天天来吧| 国产一区二区三区久久久精品| 色吧5亚洲| 国产精品高潮久久久无码| 不卡在线观看视频| 久久超碰com| 伊人网高清| 国产精品96久久久久久| 欧美78P| 国产综合久久久麻桃个| 水滴偷拍| 男人的天堂久久久| 青草精品视频日本久久久久网站在线| 亚洲成人在线乱码色午夜| 国产精品对白自产拍| 91亚洲丝袜熟女| 欧美一区二区| 91亚洲电影| 一起草三级AV电影在线观看| 黑人娇小av在线播放| 国产精品999aaa| 国产日韩无码一区二区三区久久区| 很很操在线| 中国一级操逼视频| 黄色片一区二区三区四区五区| 翔田千里一区二区三区奶水| 亚洲中文一区二区三区| 久久‘黄片视频| 五月丁香婷婷色| 色一射色一射| 怡红院成人av|