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

ARTICLE DETAIL

資訊詳情

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

Flutter遷移OpenHarmony:數(shù)獨(dú)應(yīng)用撤銷功能與狀態(tài)管理實(shí)戰(zhàn)

Flutter遷移OpenHarmony:數(shù)獨(dú)應(yīng)用撤銷功能與狀態(tài)管理實(shí)戰(zhàn) 把 Flutter 搬上 OpenHarmony我第一個完整練手的項(xiàng)目選了數(shù)獨(dú)游戲 App。選它不是圖簡單而是這個題材能把跨端 UI、自繪布局、狀態(tài)管理、邏輯純 Dart 化這幾條關(guān)鍵鏈路全部串起來又不需要任何平臺獨(dú)有能力特別適合做適配驗(yàn)證。真正讓我意外的是整個項(xiàng)目里占調(diào)試時間最久的不是數(shù)獨(dú)生成也不是界面布局而是那個看起來人畜無害的“撤銷”按鈕。這篇就把這個數(shù)獨(dú) App 從架構(gòu)設(shè)計(jì)到撤銷功能落地的完整過程拆開講包括快照方案選型、UndoManager 實(shí)現(xiàn)、OpenHarmony 環(huán)境適配、真機(jī)調(diào)試踩坑以及一組可以直接抄的核心代碼。正在研究 Flutter 多端適配、或者想在 OpenHarmony 上做工具類小 App 的開發(fā)者應(yīng)該能從里面拿走不少實(shí)際可用的東西。1. 項(xiàng)目起點(diǎn)與整體架構(gòu)設(shè)計(jì)1.1 為什么是“Flutter OpenHarmony 數(shù)獨(dú)”這個組合OpenHarmony 的應(yīng)用開發(fā)主流是它自己的 ArkUI 聲明式范式但 Flutter 在 OpenHarmony 上已經(jīng)有一條非?;钴S的適配分支Flutter 的 Skia 自繪引擎天然不依賴系統(tǒng)控件所以 UI 層搬到 OpenHarmony 時行為一致性比傳統(tǒng) WebView 方案要好得多。我當(dāng)初選這個組合就是為了驗(yàn)證“一套 Flutter 代碼能不能在 OpenHarmony 上跑得干凈”數(shù)獨(dú)正好是壓力最小的驗(yàn)證載體。數(shù)獨(dú)這個游戲邏輯不復(fù)雜但狀態(tài)不少81 個格子、數(shù)字面板、錯誤標(biāo)記、候選數(shù)、當(dāng)前選中格、撤銷歷史。它足以暴露狀態(tài)管理上的問題又不會把問題復(fù)雜到失控。比起做一個列表頁 Demo數(shù)獨(dú)能逼著我把“數(shù)據(jù)層、邏輯層、UI 層”的邊界先厘清否則撤銷功能寫到一半就會變成一團(tuán)亂麻。這個選擇也對“能不能跑”這個問題給出了更真實(shí)的答案如果連帶交互狀態(tài)的小游戲都能在 OpenHarmony 上流暢跑那么普通的工具類和內(nèi)容類 App 基本不用擔(dān)心。1.2 功能范圍界定與版本規(guī)劃我把這個項(xiàng)目的功能范圍卡得很小第一版只做了這幾件事生成一局有唯一解的數(shù)獨(dú)棋盤、點(diǎn)擊格子后從數(shù)字面板選擇數(shù)字、自動檢測同行的沖突并標(biāo)紅、旁邊放一個清除按鈕、右上角放一個撤銷按鈕、左上角放一個“新一局”。候選數(shù)輔助、難度分級、計(jì)時器、錯誤次數(shù)統(tǒng)計(jì)全部推后。這樣做的原因是撤銷功能的質(zhì)量取決于整個狀態(tài)模型是否干凈而不取決于功能數(shù)量。過早把錯誤提示、計(jì)時器、幫助功能疊進(jìn)來會讓“撤銷時到底要回滾哪些狀態(tài)”這個問題變得模糊。我見過不少項(xiàng)目功能很多但撤銷只回滾了棋盤數(shù)字高亮、候選數(shù)、提示狀態(tài)全部殘留玩家只好一遍遍手動清理體驗(yàn)非常奇怪。所以第一版寧缺毋濫把撤銷做成“閉環(huán)”比做出一堆半成品功能更重要。1.3 分層UI、狀態(tài)、邏輯的邊界整個工程目錄我是這樣組織的先有個宏觀印象lib/ main.dart models/ cell_state.dart board_snapshot.dart logic/ sudoku_engine.dart state/ undo_manager.dart sudoku_controller.dart ui/ game_screen.dart number_panel.dart sudoku_grid.dart關(guān)鍵原則只有一條UI 層永遠(yuǎn)不直接寫棋盤數(shù)組。所有修改必須經(jīng)過 SudokuController控制器再決定要不要生成新快照、要不要通知 UI 刷新。這樣做之后“撤銷”就變成了一個純粹的控制器行為把當(dāng)前快照換成歷史快照UI 自然跟著變。為了達(dá)到這個效果我在動手寫 Flutter Widget 之前先花了一天時間把 CellState、BoardSnapshot、UndoManager 三個類全部寫完并用純 Dart 測試腳本跑了一遍模擬操作。事實(shí)證明這個前置投入非常值后面在 OpenHarmony 真機(jī)上出現(xiàn)的幾乎所有疑難問題都跟 UI 本身無關(guān)而是狀態(tài)邊界沒處理好。2. 撤銷功能的前置思考先想清楚要撤銷“什么”2.1 “一步”到底指什么做撤銷功能第一件要想清楚的事是“一次撤銷到底撤回哪一個動作”。這個定義如果含糊后面所有邏輯都是糊涂賬。我當(dāng)時列了三個候選定義按“手指點(diǎn)擊”算一步玩家連續(xù)點(diǎn)了兩次“刪除候選數(shù)”撤銷也要一步一步回退體驗(yàn)很碎。按“格子的有效數(shù)值變化”算一步選手在同一個格里改三次數(shù)字那三次修改就是三個獨(dú)立歷史節(jié)點(diǎn)。按“一次完整編輯會話”算一步一個格子沒定下來之前所有修改算一步提交后合并。我最后選了第二種也就是按“格子數(shù)值或候選數(shù)狀態(tài)的一次有效變化”來記錄。理由是它最符合玩家直覺玩家每一步操作都有一個明確結(jié)果撤銷時能一步到位中間不會出現(xiàn)“刪除了一下卻沒變化”的空歷史。這個決策直接影響 UndoManager 的 push 時機(jī)。不是每次按鍵都 push而是只有當(dāng)格子里的實(shí)際狀態(tài)發(fā)生變化時才 push。比如玩家先填了 5又填了 5第二次操作由于沒有產(chǎn)生任何新狀態(tài)就不應(yīng)該記入歷史。2.2 快照方案還是命令模式做過編輯器類應(yīng)用的人一聽到撤銷第一反應(yīng)往往是“命令模式”。命令模式把所有操作抽象成一個個 Command每個 Command 記錄執(zhí)行和反向執(zhí)行邏輯然后維護(hù) undo 棧和 redo 棧。這個思路在大型文檔編輯器、繪圖軟件里是標(biāo)準(zhǔn)解因?yàn)橐粡垐D片或一篇文檔的內(nèi)存快照大到不可接受。但數(shù)獨(dú)棋盤有 81 個格子每個格子的狀態(tài)也就是“數(shù)字 候選數(shù)位掩碼 是否給定的標(biāo)志”滿打滿算幾十個字節(jié)。一個快照撐死 1KB存 200 步歷史也就 200KB 左右放在今天任何移動設(shè)備上都不值一提。所以我直接選了“不可變快照 歷史?!钡姆桨该看胃褡訝顟B(tài)發(fā)生變化就把整張棋盤當(dāng)前狀態(tài)復(fù)制一份存進(jìn)歷史棧撤銷時直接切回上一份快照。這看起來“笨”但它是這個場景下最穩(wěn)定、最簡單、最少 bug 的方案。命令模式雖然優(yōu)雅但需要為每一個操作類型實(shí)現(xiàn) execute 和 undo還要處理“撤銷后重新計(jì)算聯(lián)動狀態(tài)”的問題。數(shù)獨(dú)這種小棋盤用快照換邏輯簡單非常劃算。2.3 快照里到底要放哪些字段快照內(nèi)容我最初只放了 81 個數(shù)字真機(jī)一跑就發(fā)現(xiàn)問題玩家撤銷之后數(shù)字倒是回退了但之前填錯數(shù)字時產(chǎn)生的紅色沖突標(biāo)記還留在屏幕上。原因很簡單沖突狀態(tài)不是獨(dú)立數(shù)據(jù)而是從棋盤數(shù)字推導(dǎo)出來的我在第一次實(shí)現(xiàn)時卻沒有在撤銷后重新推導(dǎo)。所以我在 BoardSnapshot 里最終放了兩個東西每個格子的數(shù)字以及每個格子的候選數(shù)位掩碼。格子是否選中、是否標(biāo)紅都屬于“派生狀態(tài)”撤銷后由 SudokuController 根據(jù)當(dāng)前棋盤重新計(jì)算一遍而不是直接塞進(jìn)快照。這個取舍很重要。如果什么狀態(tài)都往快照里塞快照之間互相牽制很容易出現(xiàn)“數(shù)字恢復(fù)了但 UI 狀態(tài)沒恢復(fù)”的詭異現(xiàn)象。把派生狀態(tài)排除在快照之外撤銷邏輯就只負(fù)責(zé)一件事讓真實(shí)數(shù)據(jù)回到過去然后讓所有 UI 重新從真實(shí)數(shù)據(jù)算一遍。3. 工程落地Flutter for OpenHarmony 環(huán)境準(zhǔn)備3.1 OpenHarmony SDK 與 Flutter 適配分支OpenHarmony 上跑 Flutter首先要準(zhǔn)備好一套適配分支的 Flutter SDK因?yàn)?Flutter 官方主干還沒有把 OpenHarmony 作為一等平臺支持。具體步驟大概是這樣# 1. 安裝 OpenHarmony SDK并記錄 SDK 路徑 export OPENHARMONY_SDK_HOME/path/to/ohos-sdk # 2. 拉取支持 OpenHarmony 的 Flutter SDK 分支 # 這里用一個穩(wěn)定的 release 分支 # 3. 把 SDK 相關(guān)路徑加入 PATH export PATH/path/to/flutter-for-ohos/bin:$PATH # 4. 檢查環(huán)境 flutter doctorflutter doctor 之后如果一切正常再用flutter devices能看到通過調(diào)試橋連接的真機(jī)或模擬器說明工程鏈路已經(jīng)通了一半。這里有個比較容易踩的坑Flutter 工程默認(rèn)從官方源拉依賴包但在 OpenHarmony 適配環(huán)境里很多包沒有兼容的二進(jìn)制產(chǎn)物所以我直接把依賴源切到了對應(yīng)的兼容倉庫純 Dart 包則不受影響。3.2 依賴管理注意點(diǎn)數(shù)獨(dú) App 全程沒有加任何帶原生代碼的第三方插件。這確實(shí)是刻意為之。在 OpenHarmony 適配早期Flutter 插件生態(tài)還沒有完全遷移凡是走 MethodChannel 的插件都需要對應(yīng) OpenHarmony 原生側(cè)的實(shí)現(xiàn)否則編譯到原生部分就會斷。數(shù)獨(dú)邏輯純 Dart 實(shí)現(xiàn)UI 由 Flutter 自繪完成所以從一開始就規(guī)避了整個插件兼容性問題。最終依賴極簡只有 flutter 本身和一個小狀態(tài)管理庫。之所以沒用更重的狀態(tài)管理框架是因?yàn)檫@個項(xiàng)目狀態(tài)足夠集中ChangeNotifier 配合一個控制器類已經(jīng)夠用。多加一層框架反而會讓“撤銷時重新計(jì)算派生狀態(tài)”這件事變繞。給同樣入手的開發(fā)者一個建議先別急著引一堆狀態(tài)管理包把“誰擁有狀態(tài)、誰負(fù)責(zé)改狀態(tài)”想清楚比選哪個框架重要得多。3.3 工程目錄與模塊劃分代碼層的目錄我在前面已經(jīng)給了這里補(bǔ)充說明每層職責(zé)。models 層只描述數(shù)據(jù)不含任何業(yè)務(wù)邏輯。logic 層是純函數(shù)集合負(fù)責(zé)數(shù)獨(dú)生成、合法性判斷、沖突檢測。state 層是控制器和撤銷管理器是整個 App 的“大腦”。ui 層只負(fù)責(zé)把 state 渲染出來不存儲任何游戲狀態(tài)。這樣的分層雖然一開始寫起來多幾個文件但調(diào)試撤銷相關(guān) bug 時非常幸福問題要么在 state 層要么在 ui 層定位范圍瞬間縮小一半。我在真機(jī)上遇到“撤銷后數(shù)字面板高亮錯位”排查時直接跳過 logic 層只查 controller 里的派生狀態(tài)計(jì)算幾分鐘就找到原因。4. 核心實(shí)現(xiàn)數(shù)據(jù)模型與撤銷管理器4.1 CellState 與 BoardSnapshot數(shù)據(jù)模型的不可變是快照撤銷的命根子。如果同一個 CellState 對象被外部修改了那么排進(jìn)歷史棧的所有快照都會跟著變撤銷就會徹底失效。所以我所有的數(shù)據(jù)類都只提供 copyWith沒有提供 setter。class CellState { final int number; // 0 表示未填 final int candidates; // 9 位二進(jìn)制每一位代表一個候選數(shù) final bool isGiven; // 是否為題目初始給定 const CellState({ this.number 0, this.candidates 0, this.isGiven false, }); CellState copyWith({ int? number, int? candidates, bool? isGiven, }) { return CellState( number: number ?? this.number, candidates: candidates ?? this.candidates, isGiven: isGiven ?? this.isGiven, ); } CellState clone() copyWith(number: number, candidates: candidates, isGiven: isGiven); }候選數(shù)用 int 的位掩碼而不是 Set因?yàn)樵?Dart 里每個 Set 對象都是堆分配復(fù)制 81 個格子時會產(chǎn)生大量垃圾對象。位掩碼只是一個 int復(fù)制成本幾乎為零后面真機(jī)跑起來 GC 壓力也小很多。BoardSnapshot 就更直接了持有一個不可變列表。class BoardSnapshot { final ListCellState cells; BoardSnapshot(ListCellState cells) : cells List.unmodifiable(cells); BoardSnapshot clone() { return BoardSnapshot(cells.map((c) c.clone()).toList()); } }我在構(gòu)造函數(shù)里強(qiáng)制 List.unmodifiable就是為了防止外部拿到列表后往里塞東西??煺障到y(tǒng)的第一原則一旦進(jìn)入歷史棧任何代碼都不能改動它。4.2 UndoManager 的設(shè)計(jì)UndoManager 是所有撤銷邏輯的收口我把它設(shè)計(jì)得很小只維護(hù)一個歷史列表和一個當(dāng)前游標(biāo)class UndoManager { final ListBoardSnapshot _history []; int _currentIndex -1; bool get canUndo _currentIndex 0; void push(BoardSnapshot snapshot) { // 先把當(dāng)前游標(biāo)之后的歷史丟棄再追加新快照 if (_currentIndex _history.length - 1) { _history.removeRange(_currentIndex 1, _history.length); } _history.add(snapshot); _currentIndex; } BoardSnapshot? undo() { if (!canUndo) return null; _currentIndex--; return _history[_currentIndex]; } BoardSnapshot? redo() { if (_currentIndex _history.length - 1) return null; _currentIndex; return _history[_currentIndex]; } }注意 push 里先截斷后半段歷史這是為了實(shí)現(xiàn)“新操作會清掉未來的 redo 分支”。比如玩家撤銷三次改了一個數(shù)字那么原來的 redo 歷史就應(yīng)該全部作廢不然就會出現(xiàn)“時間線分叉”。整個 UndoManager 不關(guān)心數(shù)獨(dú)規(guī)則它只處理“快照進(jìn)棧”和“游標(biāo)回退”兩件事。這讓我可以在不碰數(shù)獨(dú)功能的情況下單獨(dú)給 UndoManager 寫單元測試覆蓋連續(xù) undo、undo 之后 push、空棧調(diào)用 undo 等邊界情況。4.3 數(shù)獨(dú)引擎與沖突檢測數(shù)獨(dú)引擎我只寫了兩部分生成題目、檢測沖突。生成題目的簡單做法是先用回溯填滿一個完整終盤再按隨機(jī)順序挖去一些數(shù)字。完整回溯代碼比較長核心思路就是逐格嘗試 1 到 9并跳過同行同列同宮已經(jīng)出現(xiàn)過的數(shù)字。挖洞環(huán)節(jié)我做了個輕量約束保證每個被挖掉的格子都還有唯一答案。嚴(yán)格生成唯一解數(shù)獨(dú)需要額外做“是否有且僅有一個解”的判斷我在這版里用的是隨機(jī)挖洞加基礎(chǔ)校驗(yàn)先把第一版跑起來難度均衡可以放到后面優(yōu)化。沖突檢測是撤銷后派生狀態(tài)重算的關(guān)鍵。它不修改任何數(shù)據(jù)只返回一個布爾列表供 UI 標(biāo)紅使用Listbool computeConflicts(BoardSnapshot snapshot) { final cells snapshot.cells; final conflict Listbool.filled(81, false); bool checkConflict(int a, int b) { if (cells[a].number 0 || cells[b].number 0) return false; return cells[a].number cells[b].number; } // 檢查行、列、宮有沖突就把兩個格子都標(biāo)紅 for (int row 0; row 9; row) { final map int, Listint{}; for (int col 0; col 9; col) { final index row * 9 col; final v cells[index].number; if (v 0) continue; map.putIfAbsent(v, () []).add(index); } for (final list in map.values) { if (list.length 1) { for (final index in list) { conflict[index] true; } } } } // 列和宮同理省略按同思路處理 return conflict; }這個函數(shù)不依賴歷史每次調(diào)用都從當(dāng)前快照重新計(jì)算因此撤銷后 UI 拿到的沖突標(biāo)記天然就是正確的。4.4 SudokuController把編輯動作變成狀態(tài)變化SudokuController 繼承 ChangeNotifier是整個狀態(tài)流轉(zhuǎn)的樞紐。它內(nèi)部持有一個當(dāng)前快照、一個 UndoManager、以及一份沖突列表。UI 上每次點(diǎn)擊數(shù)字最終都調(diào)用同一個方法。class SudokuController extends ChangeNotifier { SudokuController() : _undoManager UndoManager(); final UndoManager _undoManager; BoardSnapshot? _currentSnapshot; Listbool _conflicts List.filled(81, false); BoardSnapshot? get currentSnapshot _currentSnapshot; Listbool get conflicts _conflicts; bool get canUndo _undoManager.canUndo; void loadPuzzle(BoardSnapshot puzzle) { _currentSnapshot puzzle; _undoManager.clear(); _refresh(); } void fillCell(int index, int number) { if (_currentSnapshot null) return; final cells _currentSnapshot!.cells; final cell cells[index]; if (cell.isGiven) return; if (cell.number number) return; final nextCells ListCellState.of(cells); nextCells[index] cell.copyWith(number: number, candidates: 0); final nextSnapshot BoardSnapshot(nextCells); _undoManager.push(nextSnapshot); _currentSnapshot nextSnapshot; _refresh(); } void undo() { if (_currentSnapshot null) return; final snapshot _undoManager.undo(); if (snapshot ! null) { _currentSnapshot snapshot; _refresh(); } } void _refresh() { _conflicts computeConflicts(_currentSnapshot!); notifyListeners(); } }這里有幾個細(xì)節(jié)值得單獨(dú)說。第一fillCell 里先判斷格子是不是給定格題目給定的格子不能被玩家修改。第二如果格子數(shù)字沒變不 push 歷史避免記錄無意義操作。第三每次狀態(tài)變化后調(diào)用 _refresh重新計(jì)算沖突并通知 UI這樣撤銷時沖突標(biāo)記也會自動重算。5. 撤銷按鈕的 UI 接入與交互細(xì)節(jié)5.1 AppBar 按鈕與禁用態(tài)UI 側(cè)接入撤銷非常直白頂部工具欄放一個 IconButton監(jiān)聽 controller.canUndo 的值來決定它是否置灰。用 AnimatedBuilder 包住按鈕這樣每次 undo 或 push 后canUndo 變化會立刻反映到界面上。實(shí)際操作中我還做了一個小優(yōu)化當(dāng)可以撤銷時按鈕用實(shí)色圖標(biāo)不可撤銷時用半透明圖標(biāo)視覺上給玩家一個明確反饋。這個細(xì)節(jié)成本極低但能讓玩家第一時間確認(rèn)“剛才那一步有沒有被記錄”。5.2 完整交互鏈路一次完整操作的事件流是玩家點(diǎn)擊棋盤某個格子UI 記錄當(dāng)前選中格玩家在底部數(shù)字面板點(diǎn)一個數(shù)字?jǐn)?shù)字面板把請求發(fā)給 SudokuController.fillCell控制器生成新快照、push 進(jìn) UndoManager、重算沖突、notifyListeners整個棋盤 Widget 重建數(shù)字更新沖突標(biāo)紅刷新。撤銷按鈕的事件流是玩家點(diǎn)撤銷控制器從 UndoManager 取出上一份快照把當(dāng)前快照替換成歷史快照重算沖突并通知 UI棋盤 Widget 重建數(shù)字和沖突標(biāo)記一并恢復(fù)。兩條鏈路最終都匯聚到“刷新”這一步所以 UI 層完全不需要區(qū)分“這是正常填寫”還是“這是撤銷回退”它每次都是全量重算天然不會出現(xiàn)殘留狀態(tài)。5.3 連點(diǎn)防抖與撤銷時的選中狀態(tài)真機(jī)調(diào)試時我發(fā)現(xiàn)一個體驗(yàn)問題快速連點(diǎn)撤銷按鈕會在極短時間內(nèi)連續(xù) pop 多份歷史玩家本來只想回退一步結(jié)果連退了四五步。解決辦法是加一個最簡單的防抖標(biāo)志用 runAsync 或 async 方法保證上一次撤銷的 UI 刷新完成之前不接受下一次撤銷請求。bool _isUndoing false; Futurevoid undo() async { if (_isUndoing) return; _isUndoing true; final snapshot _undoManager.undo(); if (snapshot ! null) { _currentSnapshot snapshot; _refresh(); await WidgetsBinding.instance.endOfFrame; } _isUndoing false; }另外還有個容易忽略的小點(diǎn)撤銷之后棋盤上應(yīng)該選中哪個格子我的選擇是保留當(dāng)前選中格不變。因?yàn)榭煺绽餂]有保存“選中格”所以撤銷不會打斷玩家的操作節(jié)奏玩家可以立刻繼續(xù)在同一個格子里試下一個數(shù)字這是體驗(yàn)上比較順的做法。6. 真機(jī)調(diào)試中的常見問題實(shí)錄6.1 首次構(gòu)建非常慢且構(gòu)建產(chǎn)物路徑有坑在 OpenHarmony 上第一次構(gòu)建 Flutter 工程速度會比普通 Flutter 項(xiàng)目慢不少原因是除了 Dart 層編譯還要經(jīng)歷 OpenHarmony 原生工程的編譯和資源打包。這個階段最容易出現(xiàn)的問題是找不到 SDK 路徑、簽名配置缺失、目標(biāo)設(shè)備不識別。我的排查順序是先flutter doctor看環(huán)境項(xiàng)再用flutter devices看設(shè)備連接最后檢查工程的簽名配置。把這三個環(huán)節(jié)單獨(dú)打通再執(zhí)行完整構(gòu)建基本能避免“編譯一小時最后報錯發(fā)現(xiàn)是設(shè)備沒連上”的尷尬。另外建議構(gòu)建設(shè)備只留一臺不要同時接模擬器和多臺真機(jī)否則 OpenHarmony 調(diào)試橋的默認(rèn)選擇和 Flutter devices 的展示可能不一致。6.2 撤銷后紅色沖突標(biāo)記殘留這個問題我在前面提過一次但值得再展開說。第一版快照只保存了格子數(shù)字沖突是進(jìn)入歷史前就算好的一份列表撤銷時直接恢復(fù)那份舊列表。看似沒問題但下一步操作一旦改變了這個格子沖突列表就和新棋盤對不上了。正確的做法就是把沖突當(dāng)派生狀態(tài)每次快照切換之后強(qiáng)制重算。我后來把 computeConflicts 的調(diào)用放進(jìn)了 _refresh并把所有進(jìn)入 _refresh 的路徑統(tǒng)一成一條問題就消失了。這個坑的核心教訓(xùn)是哪種狀態(tài)屬于“源數(shù)據(jù)”哪種狀態(tài)屬于“可推導(dǎo)數(shù)據(jù)”這個分類必須在項(xiàng)目開始時想明白。6.3 快照復(fù)制導(dǎo)致的偶發(fā)掉幀理論上 81 個格子復(fù)制不該有性能問題但在 OpenHarmony 模擬器上我確實(shí)觀察到偶發(fā)掉幀。查了性能分析器才發(fā)現(xiàn)問題出在候選數(shù)用 Set 的那一版實(shí)現(xiàn)上。每復(fù)制一個格子就要 new 一個 Set一次復(fù)制 81 個 Set歷史棧里又累積幾十份GC 壓力被放大。把 Set 改成 int 位掩碼后GC 壓力立刻降下來。這個優(yōu)化不是提前做性能設(shè)計(jì)而是在實(shí)際設(shè)備上看到問題才動手改的但好在數(shù)據(jù)模型封裝得干凈UI 層根本沒有感知到內(nèi)部表示變化。這也再次說明面向?qū)ο蠓庋b在狀態(tài)管理里的價值。6.4 后臺切換回來之后 UI 和狀態(tài)不一致OpenHarmony 上調(diào)試時發(fā)現(xiàn)App 切到后臺再切回來如果中間發(fā)生過多次操作界面偶爾會顯示舊狀態(tài)。根因是 Flutter 層面的生命周期事件與 OpenHarmony 側(cè)的事件傳遞時機(jī)不完全同步有些繪制發(fā)生在狀態(tài)已經(jīng)更新之前。我加的兜底處理是在 App 回到前臺時調(diào)用一次強(qiáng)制刷新用依賴注入的方式讓 SudokuController 收到生命周期回調(diào)任何 view 重建都不再走“緩存狀態(tài)”而是從 controller 當(dāng)前快照重新讀取。// 回到前臺時 controller.forceRefresh();forceRefresh 內(nèi)部只做一件事重新計(jì)算沖突列表再 notifyListeners。實(shí)踐證明這個辦法簡單可靠也不影響正常流程。如果你在做類似跨端項(xiàng)目遇到“界面偶爾停在舊樣子”的玄學(xué)問題可以先往生命周期事件上想。7. 收獲、優(yōu)化方向與給后來者的建議7.1 撤銷功能帶來的狀態(tài)管理啟示做完這個項(xiàng)目我對撤銷功能最大的感悟是撤銷不是一個“按鈕功能”而是一套狀態(tài)模型設(shè)計(jì)。如果你把棋盤數(shù)據(jù)、候選數(shù)、沖突狀態(tài)、歷史列表、當(dāng)前游標(biāo)這些概念分清楚撤銷只是“把當(dāng)前指針往前移一格”。反過來如果狀態(tài)東一塊西一塊散落在各個 Widget 里那撤銷無論怎么做都是災(zāi)難。現(xiàn)在再看網(wǎng)上很多“撤銷功能實(shí)現(xiàn)教程”大多數(shù)只是給玩家按鈕上加了個“保存上一份二維數(shù)組”的邏輯。棋盤數(shù)字能恢復(fù)但高亮、候選數(shù)、禁用態(tài)全部遺漏。這類實(shí)現(xiàn)看著能用一遇到稍微復(fù)雜一點(diǎn)的狀態(tài)聯(lián)動就崩。數(shù)獨(dú)這個項(xiàng)目恰好把這種復(fù)雜的聯(lián)動放大值得每個做狀態(tài)管理的開發(fā)者親手寫一遍。7.2 后續(xù)想補(bǔ)的方向第一版跑通之后我已經(jīng)列好了幾個擴(kuò)展方向。首先是 redoUndoManager 里其實(shí)已經(jīng)預(yù)留了 redo 方法只需要在 UI 上加一個按鈕其次是自動候選數(shù)模式玩家填入數(shù)字后自動移除同行、同列、同宮的候選數(shù)這個功能的數(shù)據(jù)結(jié)構(gòu)已經(jīng)支持只是需要把候選數(shù)聯(lián)動邏輯從空實(shí)現(xiàn)變成真正的推導(dǎo)算法再往后是難度分級和題目庫目前生成算法是純隨機(jī)挖洞后續(xù)可以改成按難度模板生成。還有一個我自己很有興趣的方向是“回放模式”利用現(xiàn)在保存的歷史快照把玩家整局操作完整回放出來用來做錯題分析。這種能力在快照方案下幾乎白送只要遍歷歷史棧就行放到命令模式方案里反而要額外實(shí)現(xiàn)查詢接口??梢娺x擇快照方案雖然看起來“笨”卻能省下很多隱形成本。7.3 給后來者的具體建議如果讓我重新做一遍我會把流程壓縮成三步。第一步絕不寫 UI先在純 Dart 環(huán)境里把 CellState、BoardSnapshot、UndoManager、SudokuController 寫完并用測試腳本模擬一百步隨機(jī)操作。第二步再接入 Flutter UI先只做棋盤的拉伸和數(shù)據(jù)顯示確認(rèn)狀態(tài)能正確驅(qū)動 UI。第三步最后加撤銷按鈕和數(shù)字面板專門針對 undo 連續(xù)調(diào)用和混合操作做排查。另外一個小建議給 UndoManager 寫測試時不只是測試功能“能用”而是主動寫出這些場景——空棧 undo、連續(xù) undo 到底、push 后舊 redo 分支是否清空、同一格子連續(xù)填相同數(shù)字是否產(chǎn)生多余歷史。這幾個場景幾乎覆蓋了撤銷功能 80% 的 bug 來源測試通過之后UI 層的接入工作會變得異常輕松。這次實(shí)戰(zhàn)的最大體會是在 OpenHarmony 上跑 Flutter工程鏈路和工具鏈確實(shí)還有一些“毛刺”但純 Dart 層的代碼幾乎感覺不到跨平臺差異。撤銷功能之所以能順利落地靠的并不是什么高級技巧而是把狀態(tài)邊界劃清楚把不可變快照這條底線守住。數(shù)獨(dú)這個項(xiàng)目后續(xù)還能繼續(xù)擴(kuò)展出不少玩法但基礎(chǔ)的狀態(tài)模型一旦打牢再加什么功能都不會動搖它。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
超碰在线1234区| 亚洲人成网www| 欧日韩一二三f区| 久悠悠av| 天天躁日日躁XXXXYY| 天天做天天爱| 日日干日日摸| 男人天堂毛片| 99热线麻豆 | 欧美激情视频一区二区三区不卡| 91久久久久久久| 亚洲熟女乱色一区二区三区 | 人人干人人操人人..com| 天天日天天操天天射河南省| 日本免费专区| 日韩视频精品在线观看| 精品999999| 亚洲综合另类色图| 亚洲色图欧美色图综合| 物业黑人 AV一区| 男人精品天堂一区| 欧美亚洲厕所精品偷拍91 | 干B网| 精品国产99| 五月激情在线| 日韩啪啪网| 成人免费福利在线观看| 欧美劲爆视频一区二区| 久久久 国产精品| 老司机深夜影院18未满| 国语对白在线播放视频| 亚洲暴力强奸AV| 奇米狠999| 三级精品三级在线观看| 亚洲一区二区三区春色| 久久久久九九九九| 另类图片综合| 天天躁日日躁AAAAXXXX国产| 激情综合网五月婷婷五月天| 看一级黄色视频| 黄aaaaaaaaaaaaaaaaaa色网站| 性色生活片久久毛片婬片免费放女人一级毛片| 成人a大片在线观看| 国产成人亚洲精品无码最新在线| 91久久免费视频互動交流| 熟女激情综合网| 天天上日日上日韩精品| 欧美激情性久久久久久| 狠狠色狠狠色狠狠五月| 成人性爱电影一区二区| 九热视频| 蜜臀精品1区2区| 天堂资源欧美| 天天影视之亚洲综合网| 日本男人天堂| 天天干天天燥| 国产精品无码在线| 中文字幕老熟妇黄色视频| 91黑丝在线播放| 成人 日韩欧美一区| 97欧美精品综合| 夜夜综合| 色香欲影| 乱论91| 99ri视频| 三上制服丝AV| 久9九综合在线| 日韩欧美中文日韩欧美色| 99热思思| 97久久超碰国产精品| 国产精品噜噜噜日日日| 日韩乱伦AⅤ| 无码精品蜜桃一区二区三区ww| 无码高清专| 啪啪视频mP4| 久久久久久九九九九-美女久久久久久久-成人AV | 天美av在线观看| 五月天久久婷婷亚洲| 欧美丝袜美女电影一二三四区| 九九九九热只有精品| 熟女激情综合网| 91c色| 69超碰综合| 亚州久久9| 九99久久| 超碰97人人cao| 爱媛媛久久国产福利| 7月婷婷综合| 超碰97国产欧美| 亚洲国产欧美一区二区潘金莲| 五月婷在线| 久久婷婷欧美| 国产免费操逼| 国产精品一区在线播放| 日逼视频日本| 好淫网一二三视区| 大香蕉黄色一级片免费看| 亚洲综合成人网| 狠插 制服 自拍| 亚洲熟女av中文字幕| 国产h片在线观看视频| 中文高清一区二区的| 亚洲情色综合网| 国产精品免费久久久久久久久久| 91一区二区| 怡红院久久老司机| 99青草| 色网亚洲人| 国产毛片在线| 久久九九精品一区二区| 最新啪啪视频| 欧美丝袜美女电影一二三四区| 国产偷人伦激情在线观看| 人妻av在线| 亚洲男人天堂网站| 91九色首页| 日韩成人人妻网站| 亚洲av影院在线观看| 10000部十八禁看电影| 欧美色女人| 日本黄 R色 成 人网站| 欧美第五页| 女人高潮大叫一级毛片| 天美av在线| 五月婷婷影院| 日本色色色色色视频| 欧美天堂第二区| 国产亚洲精品一区二区三区| 99只有精品| 一本久道在线综合视频| 人妻 制服 日韩 中文 在线| 草草影院日本第一页| 热久日综合| 国产欧美精选自拍一区| 人妻无码一区二区三区久久99| 377p欧洲日本亚洲大胆| 精品对白久久不卡| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 亚洲va有码在线天堂| 久久久久久久78| 懂色中文一区二区三区| 欧洲亚洲人人爽爽视频| 欧美精品四区| 不卡中文字幕aⅴ在线| 鸥美极品| 欧美一区二区传媒| 久久精品国产亚洲AV成人直播| 91无码人妻精品一区二区三区蜜桃| 插欧洲美女欧美精品| 91天天综合在线观看| 色婷婷丁香五月| CCYY草草影院地址入口| 欧美激情亚洲情色| 欧美极品女人的天堂| 国内精品嫩模A∨私拍小视频| 亚洲色欲一区二区三区| 伊人久久婷婷| 高清国产成人无码| 久久黄人人爽视频| 区二区亚洲婷| www.五月天| 久久久久久国产成人| 久久亚洲天堂| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 麻豆九九九| 久久久久亚洲Aⅴ无码| 东北老熟女| 在线天堂999| 中文字幕一区二区韩| 青草精品视频日本久久久久网站在线| 白 大 人妻 区 在线| 啪啪91| 日日操免费视频| 丰满少妇精品一区二区| 北京美女一区二区| 97操97色| 狠狠色综合网| 久久精品国产精品亚洲艾通辽熟妇 | 国产色综合亚洲色综合吹潮| 综合视频91| 黑操B| 欧美麻豆成人同性GⅤ在线| 欧美一区二区三区不卡高清视频| 色哟哟精品1精品2| 欧美日韩婷婷中文| 天天看少妇| 国内自拍 日韩激情 99| 亚洲h片在线免费观看| 91亚洲黄色网| 春色综合免费| 97超碰免费生活| 蜜臀亚洲中文| 久久久久久夜夜夜夜夜| 精品少妇后入一区二区三区四区人妻巨乳 | 免费视频一二三区| 伊香蕉综合久久久久久久噜噜噜| 在线五区| 91日日夜夜| 色五月第四色| yazhousetuoumei| 懂色综合久久久| 日本九九九九| 啊啊啊操一区| 狠狠干综合| 久久人人看| 亚洲精品一区二区三区在线播放| 色久桃花影院在线观看| 日日夜夜精品| 家庭乱伦网站国产| 欧美日韩香蕉| 九九无码视频| 亚洲中文字幕av| 99热精品在线播放| 婷婷在线视频| 97精品一二区| 麻豆天美传媒在线视频天堂| 嗯嗯,好大,好爽,好骚| 性色乱AV一区二区| 久草毛片电影怡| 九九九九日本| 青青草色AV| 亚洲欧洲日韩中文字幕一区| 欧美97色| 一级性爱视频免费在线| 成人无码在线超碰网| 久久久久久一日韩字幕无码| 日韩激情啪啪啪| 精品毛片久久久精品毛片| 日本三级R| 六月丁香五月婷婷| jiujiujiujingpin| 91中出视频| 亚洲在线91| 国内毛片欧美香蕉精品| 插欧洲美女欧美精品| 高清在线偷拍自拍视频| 亚洲精品久| 少妇极品熟妇人妻无码| 婷婷午夜清品久久久久久久性色视频观| 亚洲91色| 激情网色| 久偷拍| 欧美精品亚洲精品日韩传电影| 性高潮久久久| 秋霞免费无码视频日韩A片| 无码精品久久| 99精品网| 九九av| 亚洲欧美激情小说| 亚洲国产成人精品女人久久久| 国产又猛又粗又爽又黄| 人妻天天夜夜爽一区二区| 97人人爱人人做人人乐| 超碰人妻久久| 欧美日韩操逼动图| 无码99| 啊啊啊啊啊啊啊在线| 欧美宗合网| 中文字幕一区二区日韩网| aaa一级黄片| 综合激情97 | 中国少妇XXXX做受| 色色国产| 国产精品乱码久久久久久| 亚洲国产成人精品女人久久久| 370p日韩欧美亚洲精品| 色女网日韩| 亚洲少妇免费视频\| 91精片| 欧洲色色| 麻豆一区二区AV天美| av无线看| 亚洲综合性网址| 明星性猛交ⅹxxx乱大交| 午夜国产成人福利视频| 久湿久久| 欧美性生活免费网| 99re在线视频国产| 黄色片一区二区三区四区五区 | 99999久久精| 亚洲 欧美 手机在线观看| 超碰99热中文字幕| 欧美高清18A片| 91亚·色| 蜜臀一区二区三区在线| 亚洲五月丁香花狠狠干一区二区三区 | 久久蜜桃一区二区| 操比国产| 蜜臀99久久精品久久久久久| av日韩在线观看电影| 草久久久| 欧美强奸乱能| 超碰97在线色男人??| 最新av网站在线观看| 九九九综合精品| 国产福利合集| 嗯……啊…嗯嗯…啊…好舒服| 亚洲 欧美 第一页 | 91欧美性| 婷婷伊人| 91bbb| 亚洲色图91欧美日韩| 久操免费观看| 国产原创精品| 欧美熟妇成人一区二区| 欧美亚州色的图| 久久激情亚洲精品无码?V | 色情婷婷| 超碰免费人妻在线| 青青草视频久久久久| 日本熟女不卡视频| 亚欧美综合网。| 性色av网站| 超碰97综合网| 亚洲吊色| 五月天综合| 亚洲中文字幕在线视频一区二区 | 久久五月天婷婷丁香中文字幕| 屌妞视频久久久久久久 | 97超碰中文| 丁香六月东京热| 日韩欧视频| 欧美日日夜夜| 亚洲欧美在线观看2021| A片大香蕉在线| 久久m| 欧美精品日韩一区二区| 激情婷婷综合久久| 亚洲AV色图一区| 国产av白丝| 精品欧美А∨无码黑人大荫蒂 | 亚洲日韩精品在线播放| 久久只有精品| 精久久久| 中文字幕人妻色偷偷久久皮| 深田咏美亚洲精品福利社 | 亚洲AV资源| 午夜120视频在线观看| 欧美色图另类图片| 欧美伦乱爱| 中文字幕永久在线| 中文字幕亚韩| 久草精品国产99| 青青草好吊| 日少妇亚洲版| 黄污污污污| 欧美顶级黄色大片免费| 亚洲无码视频免费在线观看网址!| 加勒比海成人视频网| 婷婷久草一区二区三区| 韩国一级做A片免费的| 99精品国产户外露出| 午夜操操操| 麻豆一区二区三区精品| 后入内射蜜桃臀| 亚洲中文字幕网| 福利操逼| 6080YYY午夜理论片在线观看| 密臀在线一区尤物| 亚洲AV色图一区| 少妇69中文| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 天堂中文资源在线bt| 亚洲婷婷综合网| 91精品国产一区三一| 91美女高潮| 亚洲激情色片| 白丝少妇一区二区| 91骚妇| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 日韩啪啪网| 亚洲一区二区三区AV无码| 中文字幕日韩人妻视频| 天天干天天舔| 亚洲无码成人精品| 人人做天天爱| 一级岛国大片| 蜜乳AV.COM| 欧美福利视频啊啊啊啊| 天天看精品动漫视频一区| 91欧美在线| 91欧美在线| 久热一区二区| 欧美性爽xyxOOOO| 精品一级毛片在线观看| 婷婷av在线中文字幕| 2021国产成人精品久久| 色哟哟 日韩精品| 亚欧免费观看视频| 一级日本牲交大片好爽在线看| 91大神精品长腿在线观看网站| 日日夜夜精品视频| 内射老妇BBWX0C0CK| 人妻一区二区三区视频| 亚洲国产精品无码AV在线| 在线观看亚洲专区| 亚洲天堂热| 伊人成人中文字幕久久网| 一二三四免费视频| 欧美性,色九九| 中国小夫妻勾搭露脸淫荡对白 | 综合欧美日韩在线观看| 亚洲精品日日夜夜52| 任你艹| 殴美性色a级欧美| 射丝袜高跟鞋99| 91AV天堂| 91性网| 欧美五十路熟| 中文字幕性感少妇av| 婷婷丁香六月天| 97综合网| 成 人片 黄色大片| 99这里有精品| 亚洲情色在线| 亚洲丨在线| 日韩免费中文字幕视频| 无码精品一区二区三区潘金莲| 亚洲无码一区二区三区三州| 国产极品999| 欧美色综合图片| 日本布卡一区二三区| 欧美国产精品久久九九| 欧美三级中文字幕hd| 97爱免费插| 久操影视| 蜜臀一区二区三区在线 | 久久久久久性爱视频| 欧美激色| 人人操 欧美| 亚洲中文字幕精品久久久久久直播| 精品四五区| 久久久久久裸体| 91精品人| 综合久久婷婷| 人妻爽爽啪视频| 精品九九九九| 亚洲综合激情五月久久| 亚洲黄色网址| 亚洲在线网站| 色婷婷五月天| 日韩青久久| 国产亚洲精品A在线观看下载| 人人透人人操| 超碰97亚洲区| 伊人丁香五月婷婷| 蜜桃视频精品一区二区| 女上位精品在线| 亚洲97成人在线观看| 五月大香蕉| 久久精品一区一起草| 中文色综合| 欧美亚男人的天堂| 91福利网在线观看| 一牛影视久久久一区二区三区| 日日骚一区二区三区| 日本免费人成视频播放120秒| 蜜臀久久99精品久久久久久久久| 久99在线免费观看视频| 激情综合婷婷| 999热这里只有精品| 5278欧美一区二区三区| 制服中出中文人人精品| 91av一区二区在线观看| 色五月69夫妻| 婷婷av在线中文字幕| 偷拍欧美激情| 性久久久| 久久99精品国产| 天天做日日做| 欲女人妻性色av| 玖玖爱免费观看视频| 色www精品视频在线观看| 熟妇xxxxx性春色| 欧美激情 日韩精品| 秋霞色色影院| 欧美 亚洲 另类 综合| 亚洲一区二区三区中文字幕| 97精品国产精品免费观看| 国产精品久久久久久照片| 国产丰满少妇久久久精品影院| 国产无码精品无码| 欧美999999| 中国国国产一级特黄毛片| 97jingpin| 中文字幕精品资源在线| 亚洲丝袜诱惑| 极品少妇99| 亚洲欧综合另类无码一区| 青青草女人天天干| 无码色| 亚洲熟妇一,二,三期| 色91综合网| 啪啪AV导航| 日本高清视频在线观看黄已三辽| 五月激情啪啪| 人妻丰满熟妇一区二区三| 青青草狠狠撸| 亚洲丝袜色| 成人乱人伦一区二区| 职场同事知名国产国产精品久久欧美日韩 | 久久香蕉网| 国产亚洲色停停久久99精品91| 白丝少妇一区二区| 国内毛片无码一级毛片| 日本阿v天堂在线观看| 干B| 夜夜草网站| 免费岛国一级片| 欧美最大综合网| 大香蕉伊利av| 思思热免费视频观看| 偷拍亚洲| 熟女久久| 9999亚洲电影| 蜜桃色色网站视频三区| 日本国产欧美高清在线| 国产无码精品成人| 九九热av| 亚洲在钱| 欧美韩国你懂得在线 | 精品一区二区啪啪啪| 亚洲精品国产熟女| 黑人综合网| 欧美日韩97在线| 青青草视频久久久久| 国产热RE99久久6国产精品首| 中文字幕一区二区三区四区在线视频| 97se亚洲综合自| 久久综合久色欧美综合狠狠| 亚洲精品天天影视综合网 | 91爱综合| 亚洲日韩一区电影| 日韩一级片在线看| 国产精品麻豆视频网站| 亚洲无码精品AV久久久| 麻豆91熟妇人妻中文字幕茄子| 日日日骚女人精品| 国产夫妻一区二区| 99青草| 五月婷婷六月丁香| 亚洲国产日韩欧美熟妇在线| 乱伦av国产| 大香蕉www.超碰| 亚洲另类欧美精品| 国产丝袜美女在线一区| 日韩欧美日韩| 美女黄网| 99999精品| 蜜臀久久久99久久久久| 91狠狠综合久久| 9 1超碰九色| 免费超碰97久久| 亚州综合色图| 2017大香蕉国产精品久久| 中文字幕片| 亚洲欧洲视频小说在线观看| 国产精品91一样| 91熟女熟妇视频网站| 丁香五月天激情综合| 一级免费啪啪片| 99久久网站| 91综合在线| 熟妇在线视频一区二区| 色色色色色色色色色色色色色色综合| 混色激情av| 国产欧美一区二区| 极品少妇99| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 老熟女91视频| 国产一级舔足在线观看| 99re热有精品视频国产| 脫衣舞一区二区三区| 99性爱在线观看| 人人色人人操在线| 欧美亚洲玖玖玖| 天天射网| 婷婷15月天青娱乐| 91久久久久| 97视频免费| 一级性爱视频免费在线| 在线国产福利网址导航| 久久一区二区三区入口| 五月婷婷综合网| 91 国产丝袜在线放观看| 久久成年精品| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 人人操av| 91亚洲黄色网| www.91色综合| 乱伦av国产| 亚洲精品影视老司机| 免费的黄片wwwwww| 淫淫总合网| 99热免费精品| 久久久亚洲精品中文字幕人妻| 亚洲天堂2020| 国产一区二区a毛片| 五月婷丁香| 99九九久久| 亚洲精品蜜桃久久久| 午夜性生活av免费在线看| 日韩黄片视频试看| 国产毛片精品一区二区色欲黄A片| 麻豆久久久久久久久丝袜 | 国产99999| 国产精品美女在线一区| 116美女午夜| 中文字幕一品色图| 强被迫伦姧在线观看无码网站| 91精品伊人久久久大香线蕉91| 九九玖玖精品| 5252色欧美在线男人的天堂| 亚洲精品性爱片| 精品久久久久久亚洲| 亚洲黄色网址| 日韩精品字幕| 97舔舔| 日韩精彩视频| 欧美不卡二区| 天堂在线一区二区| 欧美色人| 狠狠色综合网| 色原狠狠天天天| 亚洲精品国产熟女久久久久久| 国产一区二区三区中文字幕| 日本道人妻久久久在线不卡色视频| 最近2018中文字幕在线高清第一页 | 青青草十区九区爱夜| 97日亚洲欧美| 99操视频| 天美传媒精品久久视频| 99精品欧美一区二区三区桃色| 午夜成人福利影视| 男女一进一出视频久久| 夜夜嗨一区二区| 欧美热图99| 中文字幕在线免费观看视频| 九草九九九| 91人妻尻屄视频| 亚洲日韩久久精品一区| 国产成人欧美一区二区三区的国产| 一二三啪啪专区| 天天澡天天爽日日AV| 日本三级中国三级99人妇网站| 清纯唯美综合亚洲| 五月大香蕉| 欧美劲爆第一页| 香蕉在线一区二区三区| 2020中文字幕在线观看| 亚州色交| 成人蜜乳小视频网站| 亚洲综合另类欧美久久久| 被窝影院午夜看片无码| 久久久久久久久九九久孕交| 亚洲精品乱码线路中文字幕| 91天天c| 亚洲精品无码久久AV| 亚洲国产丝袜在线观看| 国产激情在线| 人妻久久| 国产伊人自拍| 夜夜操美女| 狠狠做深爱婷婷久久二区| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 人妻精品视频一区二区| 天天cao在线| 久久久久久性爱片| 欧美精品一区二区少妇免费A片| 91五月天| 五月婷婷AV| 精品999一区二区| 亚洲美女精品| AV不卡在线| 久区视频| 亚洲综合影片| 懂色AV蜜臀无码精品APP| 在线视频资源| 青青草精玖玖69精品| 亚洲人妻中文高清| 大粗鳼巴久久久久| 久久久久七视频| 91呆哥人妻| 欧美黄色手机在线观看| 亚洲drav色图| 内射白嫩美女| 人人爱人人操人人性| 九热中文字幕| 蜜臀无码一区二区| 97 亚洲 日韩 欧美 在线| 色呦呦呦在线观看视频| 亲子敌伦对白在线播放| 欧美最大综合网| 中文一区二区婷婷视频| 91在线精品| 天天看夜夜看日日干| 国内精品久9| 欧美熟妇操操视频| 蜜桃久久综合视频| 国产视频不卡在线观看| 久久性爱视频免费看| 成人精品久久| 91久久久老司机| 91美腿丝袜在线观看| 欧美一区二区亚洲天堂| 国产一区二区在线播放量| 亚洲性高潮| 国产风韵犹存熟妇三区| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 久久欧美按摩999| 大伊香蕉在线视频免费| 成人无遮挡毛片免费看| 国产精品自拍视频| 69久久| 91在线/欧洲| 夜夜高潮夜夜爽| 91人妻爽爽人人做人人澡| 国语对白在线播放视频| 国产中文大片资源中文字幕| 午夜成人爽爽爽爽A片李冰冰| 久久97视频| 狠狠操狠狠燥| 日韩久草| 天综合网欧美| 国产妇女精品视频青青草| 少妇69中文| 欧美色图片91| 不卡九肏| 欧洲亚洲人妻无码中字久久三区四区 | 亚洲国产剧情少妇激情| 极品五月天噜噜| 国产女人高潮视频| 亚洲日韩AV视色| 91oumei| 久久极品一区二区| 91蜜臀熟女| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 骚鸭AV| 亚洲 欧美 日本 国内 首页| 俺也射| 亚洲风情综合网| 久久久性少妇| 极品出轨视频网站| 农村少妇久久久久久久| 三及片网站| 97超碰色情| 亚洲国产97| 又粗又长又大国产不卡| 亚洲学生妹高清av| 香蕉国产精品麻豆亚洲欧美日韩| 日本成人免费一区二区三区| 欧美成人A√在线一区二区| 欧美不卡在线一区二区| 欧美精品一区二区少妇免费A片 | 亚射在线| 啊啊啊好大好湿| 久久亚洲天堂| 日韩一级二级三级| 亚洲本色精品一区二区久久| AA级电影三区| 日韩人妻免费精品| 日本天天色| 97视频观看| 97国产色图 | 日日夜夜干| 国产精品久久久蜜臀| 日韩噜噜69| 蜜臀va69| 亚洲中字幕日本一区二区三区| 欧美激情性久久久久久| HEYZO高无码国产精品227| 日本99视频| av午夜玫瑰| 九九九九九九九九九九九蜜桃| 久草看看看| 日本潮催一卡操| 日韩欧美俄罗斯A片| av天堂影视中文在字幕在线中文| 国产超碰在线一区| 久操视频在线| 思思久热在线精品66| 无码逼| 天天色粽合合合合合合合| 成人A片男人的天堂| 天天干人妻视频| AV一起草在线| 人人操av| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 人妻精品视频一区二区三区| 91久久精品中文字幕| 中文字幕日韩综合| 亚洲综合校园春色| 国产成人在线观看网址| 日韩性爱小视频在线观看| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 天啪| 人人操人人操草草| 99热精品青草在线| 久久久日本电影| 国产精品蜜乳AV| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 一区二区亚州激情久婷婷欧美| 韩国一级做a久久久久| 强奸a片网| 伊人伊人LD| 亚洲色图欧美一区二区不卡| www.色操逼| 超碰97欧美日韩| 日韩黄片影院| 天美国产精品| 人人妻人人澡人人爽久久av| 天天日B夜夜干B时时操B| 91中文精品日韩欧美在线 | 久久丁香| 97久久久久久久久久| 偷拍亚洲熟女视频播放| 中文字幕日产av人| 欧美啪啪色吧在线| 啊视频在线| 91在线国产后入风骚翘臀美女素人| 国产精品一区av在线| 手机不卡视频不卡在线一二三区| 在线色资源| 午夜福利免费精品视频| ai欧美亚洲小说| 国产精品原创巨作?v网站| 亚洲熟女国产综合另类| 97伊人网| 98一区二区精品| 男人的天堂免费| 五月丁香啪| 91性网| 乱精品一区字幕二区| 精品视频久久| 亚洲 欧美 中文 日韩超碰| 久久久日本电影| 五月天激情小说| 男女国产精品| 欧美天天拍| 中文字幕蜜乳av| 国产视频一区二区三区久久亚洲天堂 | 2019天天干天天操| 91伊人久久在线| 国产1769在线| 中出91视频| A久久| 亚洲开心网| 久久综合日韩亚洲欧美| 爱妃国产亚洲视频中文字幕| 中文在线久久字幕| 色狠狠 - 百度| 蜜臀99久久精品| 一区二区偷拍拍视频| 老熟女91视频| 日日天天久久啊啊aaa| 天天做天天爱夜夜爽毛片试看| 日本啊啊啊啊啊视频| 日本东京热加勒比久久| 欧美日本视频一区| 99这里有精品视频| 国产高清午夜成人在线观看| 97中文字幕色| 日本欧美亚洲高清在线看| 亚洲天堂少妇| 亚洲情色第一页| 四虎午夜影院| 亚欧美综合| 美女诱惑爱爱| 操逼天美3区| 夜夜欧美 | 亚洲加勒比色图| 极品色社| 日韩国产不卡在线视频| 伊人久大| 爱干爱射网啊啊啊| AA特级绝黄| 神马久久久久久久| 超碰免费欧美7| 夜夜嗨AV一区天天| 精品高清一区二区三区三州| 久久久久久久久久久久97 | 在线岛| 嗯嗯啊啊啊好爽| 亚洲少妇在线影音| 九九成人视频| 亚欧性爱无码| 97伊人网| 国产吹潮女在线观看| 天天操女人| 人人干人人操人人..com| 91在线欧美| 天天干夜夜操一区二区| 好看的91视频| 长长久久曰曰夜夜成人网| 日韩无码操逼片| 久久人妻熟女一区二区| 91爱欧美| 久久综合日韩亚洲欧美| 色综合色欲色综合色综合色综合| 国产无马在线| 久久精品区| 九九九九免费视频| 国产精品网站www| 久久久久成人蜜桃精品| 国产懂色精品国产av| 日韩操逼性鲍| 欧美色就是色| 91日韩网站| 日韩高清一二三| 91在线丝袜视频| 大香蕉免| 久久最新免费视频23| 91超级碰| 在线观看黄色电话| 成人亚欧免费视频| 日熟女| 国产 日韩 欧美一区| 天天网综合| 国产sv美女内射| 97超碰影音| 免费99精品国产自在在线| 色天堂综合| 日韩人妻无码精品系列| 欧美18禁91| 国产青一二三| 久久99黄色卞西瓜| 亚洲精品视频二区| 久久久一区二区三区四曲免费听| 熟女突然公开看18禁影片| 国产麻豆福利av在线播放| 久久首页| 国产精品爽爽v| 色就色综合| 天天看天天在线精品| 日本熟女免费視颖| 九月丁香婷婷色| 淫荡少妇免费| 中国国国产一级特黄毛片| 亚洲砖码砖专无区2023| 岛园激情| 狠狠色婷婷777| 丁香五月天啪啪| 防屏蔽在线视频| 91亚州日韩高清| 亚洲AV资源| 蜜臀AV成人精品蜜臀| 久久人妇| 美女丝袜激情小说| 97精品网站| 67914在线兔费成人视频| 日本亚洲嫩草影院啪啪| 92一区二区| 日韩欧美福利视频看看| 在线无码视频| 屁屁影院一区二区三区国产| 久9视频| 亚洲天堂色图| 天天α片| 99re在线视频这里只有精品 | 很很干很很操| 一区,二区,三区网站| 中 文字幕一区二区三四 五 区日 日 骚 | 白嫩妹子国产骚| 国产精品农村妇女| 日韩成人私密一级精品av| 蜜乳Av成人片网站| 色色色99| 人妻精品4K4K4K4K4| 亚洲素人网| 最新制服中文第一页| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 欧美一二三| 草草影院最新网址| 99ri精品| 麻豆婷婷成人一二三| 手机av亚洲丝袜美腿日韩第一页二页| 青青草在线视频播放器| 欧美第一页| 九月丁香综合网| 日韩精品一二三四| 97色色国产视频| 人人妻人人爽一区二区三区| 一个色导综合| 欧美色婷婷| 亚洲欧洲色情高清| 久久久一区二区三区麻豆| 超碰精品日韩欧美国产| 欧美疯狂做爰xxxx| 欧色综合| 国产精品乱码久久久| 日韩精品色呦呦| 久久极品伊人| 久久久九精品| 欧洲性爱无码区| 五月天激情四射| 国产25页| 超碰色综合| 操美女高潮抽搐白浆| 樱花草社区www中国| 亚州性色| 亚洲强奸乱伦影视网| 丝袜天堂| 又大又大又大又粗爽高潮观看 | 国产嫩草精品A88AV| 成人a级高清视频在线观看| 国产按摩一区二区三区| 青青草中日韩在线| 少妇高潮流水av免费| 亚洲夜色在线| 欧美色图片欧美色图| 久久中文字幕一区不卡| 狠狠干狠狠干| 日日嗷| 欧美性爱三区二区| 国产精品网站www| 放黄片放3级黄片没穿衣服| 国产成人久久久精品免费AV| 久久久久久久久久久999| 91精品国产91久久青草| 婷婷丁香久久| 欧美,日韩,中文,另类| 中文字幕日韩人妻视频一区二区三区 | 东北女人| 欧美18老人禁| 2001天天操| 欧美日韩资源| 中文字幕啊啊啊在线观看视频| 色九色久| 国内精品伊人久久久久影院会| 91美女看B| 在线A日本| 欧美视频激情久久久久久| a片 xxxx受爽视频| 九九久久首页| 亚洲日韩在线a不卡99精品| 五月天春色激情网| 麻豆国产97在线| 五月天色图| 色色毛片| 国产AV人人 夜夜人人澡| 中文字幕日韩专区精品系列| 亚洲色欲一区二区三区| 18禁在线视频| 97自拍一区| 欧美性爱日韩性爱| 亚洲高清在线se| 激情久久av一区av二区av| 久久久亚洲熟妇资源| 95人妻爽爽人人做人人澡| 99久在线精品99re8蜜桃| 成人婷婷丁香| 操国产高清| 久久超碰亚洲人| 人妻啪| 久湿久久| 99热在线观看| 欧美性天天| 日韩懂色网| HEYZO高无码国产精品227| 久九九九九九九九热| 亚洲综合春色| 国产在线强奸视频| 啊啊啊啊啊啊啊网址在线观看| 亚洲精品无码少妇久久| 欧美啪啪色吧在线| 亚洲成人一二三区| 狠狠中文字幕| 操一对老熟妇爽上天视频| 蜜色网色哟哟| 色天使亚洲综合在线观看| 精品二区三四区五电影 | 91成人18| 亚洲天堂情色| 欧美一级A片在线看视频性色| 啊啊啊啊啊啊在线| 久久欧洲| 9999免费精彩视频| 欧美一级A一级a爱片久久| 久久久久久久久久黄色网| 自拍偷拍2025在线观看| 一起草高清无码| 欧美日韩国产人人| 狠狠干综合| 日本日逼高清| 日逼97| 伊人操操| 日韩啪啪啪啪啪| 激情抓乳插进去啪啪啪日韩 | 老司机午夜精品视频| 国产中文日韩欧美一区二区三区人妻丝袜美腿| 日韩午夜啪啪视频| 91久久免费视频互動交流| 色网亚洲人| 国产高清不卡视频| 亚洲成人在线播放| 2019久久久久久久久福利| 超碰诱惑| 操淫穴亚洲五月丁香| 99丝袜福利在线播放| 国语国产操逼伊人AV网| 电家庭影院午夜69久久夜色精品国产69乱| 国产精品久久久久久久AV大片| 亚洲一区二区三区中文字幕| 超碰色大香蕉| 日影院久久婷婷夜夜网| 97超碰碰碰| 久久久精品无码亚免费| 欧美成人性爱视频在线播放| 亚洲欧美激情小说| 久久、1234| 96AV精品| 97综合在线| 狠狠操夜夜| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 天天做天天爱| 日韩av一级黄片| 人妻献身系列第54部| 亚洲欧美综合| 麻豆精品.欧美精品.日韩精品.| 婷婷久草| 中文字幕AV片| 天天天乱色综合全| 日韩在线女优天天干| 久久精彩免费视频| 人妻精品视频一区二区| 视频在线观看免费一区二区三区| 国产婷婷综合在线观看| 亚洲色图 欧美| 人妻少妇精品视频一区二区三区| 欧美专区17页| 97久久天天综合色天天综合色电影| 亚洲欧洲色情高清| 操B久久| 天天综合欧美综合| AV高清一区| 亚洲、日韩、综合、另类| 亚洲青青青视频在线| 精品久久青青草| 国产天美欧美| 亚洲精品丝袜| 欧美熟妇精品黑人巨大一二三区| 116美女午夜| 亚洲美女精品| 歐美一級亂黃99在綫精品| 91黑丝少妇| 中文字幕丝袜人妻| 中文久久一区| 日本精品免费一区二区三区四区| 欧美三级免费伊人| 天天α片| 久久久久久久六六| 天天影视网色欲色香| 嗯~啊~快点 死我视频免费看网站| 国产精品第二页| 色踪合AV| 91美女视频。| 精品人妻一区二区三区日产| 免费试看60秒| 日韩一区二区精彩视频| 岛国网址国产 |