欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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è)計到撤銷功能落地的完整過程拆開講包括快照方案選型、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è)計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ù)輔助、難度分級、計時器、錯誤次數(shù)統(tǒng)計全部推后。這樣做的原因是撤銷功能的質(zhì)量取決于整個狀態(tài)模型是否干凈而不取決于功能數(shù)量。過早把錯誤提示、計時器、幫助功能疊進(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è)備上都不值一提。所以我直接選了“不可變快照 歷史棧”的方案每次格子狀態(tài)發(fā)生變化就把整張棋盤當(dāng)前狀態(tài)復(fù)制一份存進(jìn)歷史棧撤銷時直接切回上一份快照。這看起來“笨”但它是這個場景下最穩(wěn)定、最簡單、最少 bug 的方案。命令模式雖然優(yōu)雅但需要為每一個操作類型實(shí)現(xiàn) execute 和 undo還要處理“撤銷后重新計算聯(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ì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)夠用。多加一層框架反而會讓“撤銷時重新計算派生狀態(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)計算幾分鐘就找到原因。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è)計UndoManager 是所有撤銷邏輯的收口我把它設(shè)計得很小只維護(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)前快照重新計算因此撤銷后 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重新計算沖突并通知 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è)計而是在實(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)部只做一件事重新計算沖突列表再 notifyListeners。實(shí)踐證明這個辦法簡單可靠也不影響正常流程。如果你在做類似跨端項(xiàng)目遇到“界面偶爾停在舊樣子”的玄學(xué)問題可以先往生命周期事件上想。7. 收獲、優(yōu)化方向與給后來者的建議7.1 撤銷功能帶來的狀態(tài)管理啟示做完這個項(xiàng)目我對撤銷功能最大的感悟是撤銷不是一個“按鈕功能”而是一套狀態(tài)模型設(shè)計。如果你把棋盤數(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)查詢接口。可見選擇快照方案雖然看起來“笨”卻能省下很多隱形成本。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
返回資訊列表
99性感视频| 狠狠干综合网| 丁香婷婷91在线观看视频| 亚洲美女网Va| 亚洲狠狠婷婷综合久久久| 99爱在线| 国产亚洲色婷婷久久99精品91| 激情五月婷婷欧美极品 | 久久Xx| 五月丁香婷婷基地| 亚洲第79页| 精品成人在线观看| 国产成人精品一区二三区熟女在线| 涩涩婷婷五月| 99热免费精品热久久66| 99精品久久久久| 桃色五月天| 婷婷激情5月| 狼人婷婷综合| 久久久五月天网站| 嘿嘿视频免费看9| 色综合久久99色| 激情五月天啪啪| 伊人婷婷五月天av| 97超碰色| 97色精品视频 | 五月丁香色婷婷伊人| 色婷婷成人做爰A片免费看网站| 夜夜爱网站| 狠狠艹狠狠艹| 另类专区在线| 黄久久久| 99免费青青蜜臀| 色播播五月天| 国产99热| 综合五月婷婷| 狠狠激情五月天| 大香蕉久久伊人婷婷五月丁香| 丁香五月激情五月| 九九婷婷激情综合网| 久久99精品久久只有精品| www.婷婷.com| 五月天婷婷在线播放| 黄色99网| 西瓜美女a片| 婷婷99狠狠躁天天| 成人av中文字幕| 日hao1区| 久久视频婷婷| 超级碰碰碰97免费| 999久久久国产精品| 俺去也五月天| 99热这里只有精品9| 婷婷狠狠97| 五月激情丁香| 岛国AV网| 激情综合五月婷婷丁香| 久久久久久久人妻| 97亚洲婷婷| 丁香婷婷人妻综合网| 91性高潮久久久久久久久| www.刺激色网站www.| 亚洲成人AV高清字幕| 99操视频| 六月成人网| 99精品色| 一本色道久久88综合日韩精品| 久久99性爱| 精品99这里有| 高清激情av在线观看| 激情六月丁香| 9久久久久| 停停五月色宗合| 热99这就是精品视频| 婷婷丁香五月天中文字幕| 久久草大香蕉| 插插插色综合网| 成人va在线观看视频| 久九色| 高清视频一区| 日本色道视频网站| 亚洲精品网站色视频| 啪啪啪大香蕉| 五月丁香婷婷AV| 五月丁香婷草| 色播五月丁香| 色婷婷色五月色丁香| 天天综合插插| 色婷婷内射| 丁香六月天AV| 99热成人在线观看| 超碰色综合| 99狠狠| 成人电影AV在线观看| 97热这里精品在线视频| 俺去也婷婷| 婷婷五月影院| 99这里有精品视频| 亚洲视频在线观看区| 日韩AV成人电影| 99精日本久久| 日本啪啪天堂| 色私五月婷婷| 久热这里这里有精品| 伊人五月婷婷| 日韩色色视频| 99综合网| 天天色99| 激情纯色婷婷五月天在线不卡视频| 久久在线人妻| 色婷婷狠狠爱| 真实的国产乱XXXX在线91| 激情玖玖综合网| 日韩成人精品中文字幕| 99热这里只有精品 搜| 婷婷五月天开心激情网| 色综合激情| 日韩黄色电影| 久久综合丁香激情五月| 婷婷五月丁香色色| 色久播播| 五月丁香六月婷婷无码| 久久人妻久久| 最新AV在线观看| 日韩性视频| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 亚洲色 视频| 丁香婷婷色五月天| 五月天婷婷久久视频| 极品人妻VIDEOSSS人妻| 在线成人网址| 五月婷婷婷婷婷| 五月婷婷婷丁香播| 美女久久婷婷| 99爱视频精品在线观看| 丁香五月天视频在线播放| 亚洲一区二区无码蜜乳av| 婷婷丁香视频| 99热新网址| 亚洲AV成人在线| 亚洲一区先锋影音| 九九99免费视频| 色婷婷六月| 五月丁香毛片| 丁香六月亚洲综合| 综合五月婷婷| 26UUU欧美激情一区二区| 色欲av伊人久久大香线蕉影院| 99热都是精品| 99精品在线| 极品人妻VIDEOSSS人妻| 色色丁香婷婷综合| 亚洲va综合va国产va中文| 超碰免费人人| 在线不卡视频| 久草性爱| 久婷婷五月综合欧美| 中文不卡一二三区| 色色婷婷丁香| 激情婷婷五月久久| 九九99九九99九九99视频网| 日韩精品无码AV| 久久这里精彩免费在线观看| 97人人搞| 久久婷婷久久| 婷婷五月丁香伊人| 久久精品99国产精品日本| 久久东京热婷婷五月| 超碰熟女拍拍| 1024欧美看片| 欧美久久婷婷| 日韩专区五月天婷婷丁香| 人妻性操逼中文字幕 国产| 丁香五月婷婷香| 亚洲12p| 激情综合网五月在线播放| 九九色综合九九色| 99re久热| 饮料下药迷倒漂亮女同事强干| 51精品国自产在线| 人人天堂操| 67194成I人在线观看线路1| 狠狠狠狠青草| www五月天com| 色一情一乱一乱一区9| 五月天丁香啪啪网| 国产六月婷婷| 天天干天天操天天拍| 久久婷婷人人| 九九人人精品| 97操在线视频| 五月天婷婷在线播放| 婷婷五月电影| 久久久久久人妻| 一级七香蕉| www久热com| 蜜乳av一级av| 久久AV电影| 日本99视频| 五月天丁香六月综合| 99自拍网| 丁香五月网络网络| www.9操| 99热在线99| 五月丁香久久| 这里只有精品网站| 99亚洲精品视频| 丁香美女五月天婷婷| www. 五月. com| er99免费视频在线| 亚洲欧洲一二| 日本久久精品| 婷婷激情五月天网站| 亚洲人人操| 99精品在线观看视频| 亲子乱AV一区二区三区下载| 第四色色六月色综合| 亚洲免费看片| 五月婷久久在线| 婷色影院| 97九色视频| 色情成人五月天| 一区二区乱视频码| 丁香激情久久| 五月丁香六月婷婷免费| 超碰丁香五月| 玖玖热视频| 色色精品色| 国外亚洲成AV人片在线观看| 亚艹艹| 99久久精彩视频| 十月色综合| 五月婷婷综合影院| 色色色热| 欧美人妻一区二区| www.色婷婷| 激情图片亚洲| 亚洲熟女色| 婷婷激情肏屄网| WWW.国产| 丁香五月天婷婷中文字幕| 激情色色| 九月丁香很很色| 久久综合人妻| 91免费在线视频6| 丁香亭亭激情四射| 色播五月天激情| 青青福利网| 97操碰在线视频| 色婷婷五月综合| 99在线国| 久久99热这里只有精品首| 免费看欧美成人A片无码| 天天夜夜六月丁香五月婷婷老师| 99热综合网| 国外亚洲成AV人片在线观看| 色五月天丁香婷婷| 色播丁香五月婷婷操:屄| 97操碰日本女人| 人妻九九九九| 日本久久爱| 538任你爽| 五月婷婷网久久| 日韩无码专区| av大香蕉| 日本久久人| 精品无码av丁香五月激情| 色综合久久无码| 五月天激情国产综合婷婷婷| 超碰人人超碰| 婷婷社区五月天| 日日夜夜噜噜爽爽| www色婷婷久久综合久色| 在线日韩av| 久久机热/这里只有精品| 久久这里只有国产视频| 性 色 婷婷| 综合色网站| 91夫妻视频| 五月丁香亭亭操逼| 人妻VideOssS人妻| 五月丁香婷婷久久| 啪啪操操| 操逼巨乳91| 成人超碰网| 综合色播| 狠色色狠网| 婷婷五月天成人娱乐| 亚州第一A片| 婷婷五月丁香五月| 99色色网| 婷婷五月天精品| 丁香婷婷影院| 丁香五月天av| 亚洲五月丁| 大香蕉久久伊人婷婷五月丁香| 色爱综合五月| 日日操夜夜操中国无码| 99热在线极品极品| 亚洲九九在线| 亚洲成色综合网站免费观看| 青青草搞屄视频网站| 9久久精品| www.91婷婷| 婷婷影院欧美| 26uuu偷拍亚洲欧洲综合| 色情网综合| 五月天色小说| 国产精品 的国产| 超碰97色| 久久精品系列| 九九久久五月天综合伊人| 99视频九九热| 色五月激情综合网| 九九免费精品在线视频| 少妇久久诱惑视频| 婷婷色情六月| 色婷婷精品视频| 五月婷婷九九热| 色综合五月天| 五月天另类小说| 色播五月婷婷| 日逼影音先锋男人AV资源站| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 丁香五月五月婷婷五月天激情四射| 最新亚洲色色网| 五月综合在线婷婷图片| 激情五月天www| 99热99热不卡| 超碰99资源站| 色色五月婷| 天天天天操| 免费看欧美成人A片无码| 久久99最新地址| 久久涩视频| 色欲色香综合网站| 色色色99| 狠狠干在线视频| 99热久久这里只有精品2010| 影音先锋噜一噜| 丁香五月伊人| 九月丁香婷婷网| 热婷婷在线视频| 九月激情综合| 3p日韩网站视频| 婷婷五月天成人综合网| 伦乱天堂| 婷色影院| 91干视频| 一二线视频 另类| 琪琪色五月婷婷老师| 中文成人在线| 婷婷五月天777| 直接看的AV网站| 日日夜夜干| 亚洲激情五月| 五月丁香婷婷99| 激情九月综合| 国产裸舞表演WWWW| 激情五月天婷婷丁香| 九九热青草| 久久久A级视频| 异能之下短剧免费观看全集| 91精品国产综合久久密臀| 九九热最新| 亚洲午夜av| 色婷婷中文| 激情六月丁香| 青草激情综合| 青柠影视免费高清电视剧| 日韩激情网站| 五月天婷婷在看| 中文字幕成人影视| 国产九月婷婷| 综合逼五月激情婷婷| 天天做天天爱天天爽综合网| 免费视频WWW在线观看网站| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | RenRenSe在线视频网站| 色婷| www.久久9| 亚洲丁香五月天在线视频| 这里只有精品视频在线| 九九婷婷热| 99精品在线观看| 日笨久久网| 婷婷五月激情综合| 丁香五月五月婷婷| 婷婷色色亚洲| 涩涩五月天综合| 狠狠干在线| 色婷婷成人做爰A片免费看网站 | 色情·com| 丁香六月综合| 伊人在线另类| 能看的AV网站| 日本不卡高字幕在线2019| 9久国产| 欧洲第一久色| av高清无码| 丁香六月开心| 91久久久久久| 婷婷色五月激情| 色色国产| 9热在线观看| A网在线欧洲| 久久怡红院| 大香蕉综合在线| 婷丁香五月天| 大香av| 激情五月天影院| 激情亚洲五月| 丁香五月在线视频黑人| 亚洲中文字幕在线观看| 五月激情婷婷色| 激情综合五月天| 九九碰九九爱97| 久久丝袜婷婷| 九九人人精品| 日本99久久| 日韩在线99| 久久久人妻| 婷婷丁香五月天大香蕉| 五月亭亭性| wwww.色婷婷| 亚洲欧美另类在线23p| 久久婷婷老| 色婷婷丁香AV综合| 亚洲精品第一国产综合亚AV| 丁香六月天堂| 丁香 亚洲 久久| 激情综合五月婷婷| 色欲av伊人久久大香线蕉影院| 青青草轻轻操| 天天色月| 欧美性生交A片免费看| 欧美99热| 日韩不卡123| 婷婷五点亚洲| 色色九九五月天 | 激情五月,激情综合网| 欧美日韩婷婷五月天| 狠狠色丁香久久婷婷综合五月| 婷婷成人丁香色情基地30 | 色99综合色88| 久久久久久性爱视频| 去色色五月天| 天天射美女| 人妻操逼视频。| 91超级碰| 丁香五月婷婷色播艳门照| 婷婷五月综合免费在线| 9热视频在线观看| 久久九九爽| 日日噜噜夜夜狠狠久久丁香五月| 天天在线久久综合| 综合激情四射一theav| 深爱激情五月网| 五月天婷婷久久| 婷婷五月天AV| 女高怪谈在线观看| 五月丁香婷婷基地| 青青草伊人婷婷| 天天干天天干天天操| 五月婷婷天堂| 日欧一片内射VA在线影院| 99热日韩| 综合大香蕉| 成人无码精品1区2区3区免费看| 五月丁香六月激情啪| 五月婷婷色播| 亚洲五月六月婷婷| 99在线热| 79精品视频| 五月丁香日本一抹本| 五月久久综合| 婷婷久草| 噜噜色婷婷| 中文字幕在线观看视频www| 亚洲视频在线网站| 99久久婷婷国产综合| 亚洲九九在线| 五月丁香美女视频| 九九九午夜视频| 夜精品无码A片一区二区蜜桃| 婷婷色基地| 欧美天天爽| 亚洲热久| 婷婷五月天97干| 丁香花五月天激情| 噜噜网免费视频| wuyuedingxiang99| 伊人婷婷大香蕉| av婷婷丁香| 91狠狠色丁香婷婷综合久久| 丁香五月瑟瑟| 99精品偷自拍| 五月天激情四射| 五月婷婷网五月在线| 五月丁香婷婷爱激情综合网| 免费观看2018www黄色操逼网站| 丁香六月婷婷综合| 97操操操| 日本99在线| 开心婷婷五月中文字幕组| 天天综合色丁香| 欧美日韩成人在线观看| 亚洲无码AV片| 丁香激情综合| 中文字幕日产A片在线看| 99激情在线| 色五月婷婷久久| 高清无码 一区 二区 三区| 日本三级日本三级三级人妇四虎| 日韩无码91| 色婷丁香91| 搡BBBB搡BBB搡18| 另类小说五月天| 五月天伊人久久久久| 五月丁香亚洲婷婷| 伊人久久丁香婷婷六月五月综合| 综合逼五月激情婷婷| 丁香五月天黄色片| 天堂久久性| 色情婷婷久久五月天| 精品国产一区二区三区四区阿崩 | 亚洲99综合| 日本黄色精品| 久久综合五月婷婷| 五月丁香婷婷综合网色欲| 九久久九精品视频| 精品99*| 日韩精品视频中文字幕| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 99re在线播放| 超碰v| 极品少妇XXXX精品少妇偷拍| 大地9中文在线观看免费高清| h在线看免费版在线看| 婷婷久久五月| 中文AV网站| 丁香六月婷婷久久综合| 99久热| 亚洲激情网| 伊人五月天在线| 色色色热热热| 色婷婷视频综合| 久久久五月婷婷| 99精品无码网站| 色综合日日| 91人人妻人人操人人爽| 99re8热精品免费视频| 五月天婷婷狂暴白浆| 国产69久久久欧美黑人A片| 开心五月激情网| 99在线精品免费视频| 欧美电影在线播放| 北条麻妃伊人 | 色婷婷五月六月丁香综合视频| 婷婷精品视频| 国产裸舞福利资源在线视频| 色 五月俺去也| 99色爱| 激情图片五月天| 中文字幕综合| 婷婷久久五月| 日韩在线视频9色| 久久久久五月丁香| www.超碰在线| www.久久五月天.com| 99er6热在线观看精品6| 婷婷成人AV| 99热精品中文字幕| 人妻第九页| 久re在线| 大香蕉久久伊人婷婷五月丁香| 男人天堂亚洲综合| 天天草比天天爽| 丁香蜜臀黄色婷婷五月天| 99热精品无码| 亚洲传媒在线观看| 五月丁香色| 五月婷婷久久综合| 日本在线va| 99热都是精品| 日噜噜色| 国产中文亚洲欧美日韩性交| 99热这里只要精品免费| 在线日韩视频| 久久激情四射| 婷婷久久综合| 玖玖资源站中文| 99久久久久| 日韩AV在线影片| 97欧美在线| 深爱激情五月天色婷婷| 9热视频在线观看| www.色五月| 日本久久视频| 五月激情丁香啪啪| 99玖玖在线视频| 激情丁香五月激情婷婷| 99激情在线| 91919191919久久成人视频| 丁香久久五月婷综合| 五月天开心色情网| 超碰免费人人| 亚州精品成人片| 天堂婷婷五月在线| 超碰在线免费9| 国产午夜成人免费看片无遮挡| 4438国产免费看| 五月人人丁香婷婷五月人人丁香| 成人av中文字幕| 亚洲AV成人一区二区在线观看| 色婷五月天| 性爱视频99| 欧美成人精品三区综合A片| 综合色色综合| 亚洲人成人五月天| 成人国产欧美大片一区| 丁香五月久久| 91久久五月天| 伊人大蕉香| 久久66精品| 操人无码| 91婷婷丁香五月天免费视频网站| 日日爽夜夜爽| 亚洲av成人一区二区电影在线| 99热这里只有在线播放| 五月丁香综合激情| 大香蕉婷婷五月| 激情五月婷婷丁香| 97操资源婷婷| 丁香六月婷婷综合网| www五月| av久热| 九月婷婷激情| 99偷拍视频在线日本| 欧美激情五月| 欧美十二区| 激情五月综合色婷婷| 六月激情综合| 思思视频久久| 婷婷五月花| 五月婷在线| 激情综合婷婷| 色婷婷在线播放| 六月丁香婷婷综合狠狠爱夜夜爱| 99热999| 俺去也五月| 国产操逼网站| 四月婷婷五月丁香| 色老久久| 欧洲亚洲免费视频9| 五月丁香激情婷婷| 亚洲综合婷婷| 丁香五月亚洲激情婷婷射| 超碰91在线| 操操天堂| 97操碰碰无码视频| 91seav| 91超碰在线观看| 久热九九| 天天色情站| 五月综合色| 丁香五月天婷婷久久| 伊人综合网站| 天天射综合网夜夜操| 九色视频九色九色91jiuseshipin| 婷婷综合网伊人| 亚洲中文字幕AV在线| 色婷婷先锋| 9|在线观看视频| 久久金品黃色| 成人av播放| 婷婷五月天久久| ri电影在线| www.97视频| 色人妻五月| 久久综合五月| 久色网| 五月天 综合 在线| 综合网精品99| www.五月婷婷.com| 成人五月天婷婷| 欧美三级巜人妻互换| 五月开心深深爱激情综合 | 日韩人妻无码专区| 国产精品人成A片一区二区| 99热骚货| 亚洲AV无码成人精品区电影网| 9l视频自拍9l九色9l成人| 婷婷久久五月天| 全部老头和老太XXXXX| 天天综合网亚洲网站| 9有码中文| 91蜜桃婷婷狠狠久久综合9色| 精品九九视频| 色噜噜97视频在线观看| 伊人色综合网| 丁婷婷五月天在线播放| 99热只有精品综合| 久久九九激情五月天 | 久久婷婷操| 99热加勒比| 五月天激情小说| 天天爽天天摸人妻综合网| 天天操加勒比| 日本在线观看99| 女同激情久久av久久| 五月婷婷综合色啪| 夜夜久久综合网 | 成人欧美一区二区三区在线观看| 在线超碰精品| 丁香五月婷婷五月| 丁香五月天激情综合| 干亚洲天堂| 久久网婷婷| AA丁香综合激情| 这里只有精品无码| 狠狠干五月丁香| 4399高清无码视频| 色爆五月| www久久久| wwww.色婷婷| 九九激情网| 色综合久久88色综合天天| 婷婷精品在线| 五月天婷婷激情四射综合| 五月丁香啪| 99热这里只有精品8| 色的色综合| 婷婷五月丁香啪啪| 青青草五月天| 1024操逼| 六月婷婷五月丁香| 91人操人人人操人| 999热在线视频| 久久久久久草黄色片AV在线观看| 六月久久婷婷| 欧美一级毛卡片无码| 五月综合久久| 五月丁香综合啪啪| 狠狠狠狠狠干| 九九亚洲视频| 丁香网五月网| 亚洲激情淫网| 99re66热这里只有精品| 九热久| 91猫咪国产在线播放| 99精品偷自拍| 久久9视频| 色丁香五月婷婷| 成人视频在线免费播放| 婷婷五月天欧美| 激情婷婷六月| 五月天欧美 另类小说| 丁香五月婷婷狠狠色| 久99久视频免费观看| 激情婷婷99| 爱操天堂| 在线综合亚洲欧美65| 亚洲国产精品二二三三区| 99久在线精品99re8| 亚洲激情婷婷| 五月天婷婷基地综合网| 婷婷五月天亚洲五码| 影音先锋777xfplay色资源网站| 欧美熟女乱又伦| 六月丁香婷婷网| 色97综合婷婷天天色| 丁香六月色香蕉视频| 色婷婷丁香五月| 久草天堂| 久久久人妻人伦| 伊人久久婷婷| 天天开心天天色| 五月天激情综合在线| 亲子乱AV一区二区三区下载| 99视频35精品视频在线观看| 射区导航| 97色色婷婷五月天| 99re视频在线播放| 人人操99| 人人澡天天色天天做| wuyuedingxiang99| 丁香五月激情五月| 久久五月天婷婷| 99热这里只有精品免费| 五月天婷婷色| 久久视频在线视频| www.五月天| 五月婷婷啪啪啪啪| 亚洲无码免费看| 99热99| 五月丁香欧美综合| 欧美六月| 日本婷婷丁香五月| 五月婷婷欲色| 噜噜网免费视频| 丁香五月在线播放| www.99婷婷| 婷婷丁香18| 熟女人妻一区二区三区免费看| 蜜桃成语时李时珍 免费| 免看黄大片AA | 狠狠婷婷综合| 一本狠婷婷综合| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 丁香五月香蕉在线| 五月天影院婷婷在线观看| 亚洲情a| 婷婷五月天成人网| 九九碰九九爱97| 无人区码一码二码三码医生系列| 91干99| 色玖玖综合网| 色综合爱综合| 色色AV色色色东莞| 99久久婷婷| 欧美日本韩国亚洲| 9999热在线观看| 婷婷色激情网| 日日操人人操| 丁香五月婷婷激情尤物| 婷婷色五月激情| 激情综合五月丁香六月婷婷| 91成人看片| 大波美女VA网站| 美女天天爽| 另类在线| 婷婷六月成人| 五月天婷婷色色| 成人九九视频| 综合久| 九色在线五月婷婷网址| 九九99精品视频| 五月激情开心婷婷| 天天色99| 国产伦亲子伦亲子视频观看| 色情婷| 97涩涩丁香五月天| 亚洲成人无码网站| 97在线99| 九九这里是免费的视频5| 六月丁香五月亭亭| 996er热| 婷婷五月激情四射手| 黄网免费看| 五月天婷网| 99久久婷婷| 丁香五月综合网亚洲综合欧美狠狠| 婷婷五月天视频免费在线观看| 久99久视频| 五月丁香九九| 99精品7| 91久操| 九九热青青草| 激情五月天开心网丁香无码| 9热精品| 在线中文字幕免费视频| 久久这里这里有精品免费视频| 另类五月激情| 丰满少妇猛烈A片免费看观看| 九月丁香八月婷婷久久综合久97| 777精品成人a v久久| 久久视频婷婷视频| 99精品综合在线| 美女要搞搞天天搞搞搞网站| 91丨九色丨东北熟女| yiqicaoav| 色婷婷色情| 丁香六月婷婷综合| 天天射天天干天插色综合| 岛国AV网站| 亚洲乱码日产精品BD| 99熟女视频| 综合噜噜| 97碰 在线视频观看| 狠狠另类视频| 天天拍天天操| 亚洲精品视频在线播放| 亚洲最大激情无码| 亚洲精品第一国产综合亚AV | 激情文学第四色婷婷丁香五月| 区区欧美你爱| 久久AV无码精品人妻系列试探| 日韩成人综合网| 中文AV在线观看| 亚洲啪啪自拍| 婷婷五月天激情五月天| 成人做爰黄A片免费看直播室男男| jiqingtaose五月天| 久草a片| 日韩无码人妻一区二区| 色五月首页| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 少妇性按摩无码中文A片| 99亚色色色| 这里只有精品视频99| 99自拍视频网站| 激情丁香九九五月综合网| 婷婷之玖玖| 五月天六月婷婷| 欧美日本不卡黄色片| 思思w99| 国产毛片精品一区二区色欲黄A片| 九九蜜臀精品| 亚洲色另类| 99开心五月五月丁香激情| 国产性爱亚洲是图| 天天久久66xxx| 日韩无码色色| 婷激情五月天视频导航| 精品久热| 日日干日日s| 日韩性爱AV| 五月婷色啪| 伊人在线婷婷草| 丁香五月天久久| 婷婷激情五月天小说| 在线观看视频1区| 蜜桃五月天| 国产婷婷五月| 天天噜| 99自拍视频网站| 综合激情站| 五月丁香综合啪啪啪啪啪| 国产这里只有精品| 六月丁香深深爱| 婷婷五月天久草在线| 六月丁香社区| 日本乱论99| 色久九| 天天爽夜夜爽夜夜爽精品| 97干在线| 婷婷丁香五月天狠狠| 激情六月综合| 亚洲婷婷丁香| 五月丁香激情综合| 久久这里只有精品16| 97婷婷五月丁香| 婷婷五月天伊人| 婷婷五月天久久久| 北京熟妇搡BBBB搡BBBB| 丁香五月冃欧美| 九九激情视频| 91九色网| 久久机热这里只有 | 97超级碰| 九九99热久久精品66中文字幕| 97操在线视频| 婷婷五月天激情网| 99爱在线精品视频免费观看| 亚洲旡码| 天堂成人A片永久免费网站| 亚洲亚洲永久无码777777| 亚洲色图五月丁香| 五月天婷婷成人网| 天天爽天天摸人妻综合网| 国产激情av| 成人国产欧美大片一区| 婷婷五月综合亚洲| 久久99久久99精品免视看婷婷| 人妻熟人中文字幕一区二区| 综合久久五月天| 久久er视频6| 天天操天天干天天射| 欧美日韩成人在线网站| 天天舔夜夜操www com| 碰人人97| 99热这里只有精品首页| 五月丁香婷婷伊人| 五月色婷婷影院| 韩日另类| 中文字幕在线免费| 激情五月天色婷婷综合| 婷婷的99视频网站| 婷婷在线五月综合| 中文字幕在线日亚州9| 91人妻视频| 精品激情| 91碰操| 久久久久9| 婷婷色五月天在线| 日日日日做夜夜夜夜无码| 色婷婷啪啪| www.色五月| 丁香五月偷拍| 99热99免费| 午夜免费试看| 手机在线视频观看9| 天天做天天爽| 狠狠干综合| 激情 久久 婷婷| 97狠狠色| 久久婷婷成人综合色怡春院| 乱女乱妇熟女熟妇综合网站| 98永久精品| 99超碰欧美| 色99色| 五月天狠狠色| 99爱精品视频| 色色亚洲无码| AV操逼网| 久久一伦| 丁香五月婷婷综合啪啪| 久久人人妻| 五月丁香六月激情| 我要看激情五月天| 色播五月婷婷综合| 婷婷五月天六点丁香五月| 五月色丁香婷婷综合| 被强行糟蹋的女人A片| 91ncom.色| 婷婷色综合av| 天天综合社区| 欧美综合激情五月| 26uuu淫色| 久久婷婷精品| www.91婷婷| 伊人五月天久久| 超91热| 最近中文字幕2019视频1| 久久久中文| 夜夜干 夜夜操| 亚欧州精品视频| 婷婷激情综合| 亚州色色色| 79色色色色| 婷婷五月色丁香在线看| 激情的五月| 影音先锋女人av鲁色资源网小说免费| 婷婷五月天综合网| 大香蕉五月婷婷| 久久9久久| 97碰碰视频| 激情婷婷九月| 婷婷性爱视频在线| 成人VAV视频在线观看| 丁香五月婷婷总啪啪| 五月婷婷六月激情| 天天色综网| 国外亚洲成AV人片在线观看 | 日本在线视频手机播放五月婷| 色色色激情| 99久久久久| 九九香蕉网| 99自拍视频在线观看| 先锋五月婷婷丁香草草| 中文字幕综合网| 日韩综合网络男女香蕉a片| 国产五月天婷婷| 日本啪啪网| 99热这里只有精品1025| 九九精品99| 超碰免费在线| 99色区| 五月开心六月婷婷在线播放网站| 色情五月丁香婷婷网| 色狠狠999综合网| 久色视频首页| 五月丁香色婷婷基地| 六月丁香婷婷在线波多| va亚洲中文在线| 激情www| 99在线精品视频| 九九自拍网| 久热超碰| 婷婷激情五月综合| 免费观看全黄做爰的视频| 日日干四虎| 亚洲韩国日产综合AV| 久久精品99久久久久久久久| 丁香六月| 婷婷丁香五月天哟啪| 月婷婷亚洲| 热99热9| 人妻久久久久久| 狼人久草| 风流少妇A片一区二区蜜桃| 欧美十二区| 久久天堂加勒比| 婷婷五月丁香综合| 夜夜躁狠狠| 亚洲五月天婷婷在线| 狠狠狠狠狠狠| 婷婷五月天色播| 中文字幕1区2区。| 丁香香蕉婷婷| 欧美日韩99| 五月婷婷成人w| 99热最新| 91大神操美女| 久久亚洲色导航| av中文网站| 色久女| 欧美在线| 国产精品成人网站| 99久久婷婷| 深爱激情五月天婷婷网| 色色色com| 色99色| 99爱在线| 亚洲AV成人片无码网站| 婷婷五月天影视| 五月天婷婷社区| 成年人丁香五月| 1024AV视频| 五月天婷婷影院| 五月丁香久久久| 丁香婷婷性久久| 五月天婷婷小说| 五月丁了香蕉综合| 久久99免费视屏| 伊人五月成人| 丁香五月电影| 操逼视频网址| 天天色播| 思思精品热在线| 婷婷五月情| 葵花AV在线| 性色播| 综合网亚洲| 伊人激情AV一区二区三区| 色综合网页| AV在线免费网站| 亚洲中文字幕在线观看| 97碰碰在线观看视频| 日日夜夜青青草| 九九色图| 人妻第九页| 色婷婷香蕉| 韩国三级五月天婷婷。| 色婷婷激情| 婷婷五月18永久免费网站| 丁香五月婷婷色五月| 99综合自拍| 日本性视频| 天天色天天色天天色天天色天天色天天色| 婷婷噜噜| 欧美交换配乱吟粗大25P| 99亚洲精美视频在线观看| 色情播放| 九九热精品视频| 丁香五月婷婷偷拍| 久久思思热视频| 91丨九色丨东北熟女| 综合久久五月天| 99视频网| XX色综合| 婷婷第六色| 狠狠99| 色色999三级片| 五月婷婷亚洲综合网| AV九九| 色欧美影院| 色欲色香综合网| 91精品国产综合久久久不卡电影| 噜噜色天天开心| 婷婷激情人妻| 区啪精品| 操射国产日本| 亚洲乱码日产精品BD| 久久草人妻| 九九99免费视频| 激情视频综合| 欧美日韩AAAA| 婷婷中文字幕网站| 六月激情婷婷综合| 五月天色五月| 五月丁香六月婷| 国产精品视频免费看| 98热精品| 激情五月,激情综合网| 男人操女人高潮91视频| 六月色伊人婷婷| 五月婷婷在线视频| 亚洲综合婷婷| 五月婷婷色影院| 激情爱爱网站| 久久视频婷婷| 99热99美国在线观看| 99精品视频网| 天天操狠狠操| 四川BBB搡BBB搡多人乱亂| 天天操天天日天天爱| 丁香婷婷大香蕉| 丁香大香蕉| 综合色播| 婷婷大香蕉| 五月天婷婷久久| 九九热这里只有精品556| 日韩亚洲视频| 伊九九三级区| AV操操操| 丁香婷婷激情综合五月激情| 涩五月婷婷| 色五月婷婷婷婷婷婷婷婷婷婷| 色99在线| 婷色人人狠| 97人人操人人干| 婷婷激情五月天在线视频| 国产精产国品一二三在观看| WWW五月天| AⅤ网站在线看| 五月激情基地| 玖玖九九9999在线观看视频精品| 婷婷五月天在线观看第二页| 久久精彩视频99| 激情五月天社区| 色情久久久| 色色五月天婷婷| 丁香六月色婷婷欧美| 强辱丰满人妻HD中文字幕| 丁香五月激情视频在线| 精品九九九久| 五月婷婷在线免费| 七七九色| 99爱视频在线观看| 就爱啪啪婷婷| 国产精品男人AV不卡| 亚洲婷婷免费| 99欧州偷拍视频| 丁香婷婷激情| 秋霞电影理论| 丁香五月 无码| 色婷婷www| 色六月天天激情综合网| 亚洲日韩一页精品发布| 婷婷五月天激情综合深爱激情| 玖玖爱导航| 天天色播| 亚洲开心激情网| 另类图片五月天激情| 99精品一二三四视频| 色色精品色| 狠狠插.com| 激情综合五| 开心久久五月天| 九色视频九色九色91jiuseshipin| 色色色色色色网| 婷婷伊人| 99青青草99| 欧美 日韩 成人 在线| 国产裸舞福利资源在线视频| 青吴乐视频| 色综合久久88色综合天天99| 五月六月丁香婷婷在线观看| 日韩AV免费| 国产成人网| 天天热夜夜操| 六月久久婷婷| 亚洲经典三级| 色色色综合网| 思思热思在线精品视频| 久久性爱激情| 色色色图| 五月丁香龟婷婷| 综合色图区| 日操夜操天天操不卡| 综合色五月天| 一区二区三区四区无码| 色哟哟精品| 久久91久久精品久久|