色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

Flutter跨端導(dǎo)航框架在OpenHarmony學(xué)生獎(jiǎng)懲系統(tǒng)中的落地實(shí)踐

Flutter跨端導(dǎo)航框架在OpenHarmony學(xué)生獎(jiǎng)懲系統(tǒng)中的落地實(shí)踐 做學(xué)生獎(jiǎng)懲管理系統(tǒng)的時(shí)候我原本只打算寫(xiě)一個(gè)常規(guī)的單端 Flutter 應(yīng)用。后來(lái)設(shè)備側(cè)的規(guī)劃里出現(xiàn)了 OpenHarmony需求就變成了同一個(gè)導(dǎo)航框架要同時(shí)跑在傳統(tǒng)移動(dòng)端和 OpenHarmony 設(shè)備上。項(xiàng)目里的“功能導(dǎo)航模塊”聽(tīng)起來(lái)最不起眼實(shí)際卻是整個(gè)獎(jiǎng)懲系統(tǒng)最容易被低估的部分它決定用戶(hù)從哪個(gè)入口進(jìn)入加分申請(qǐng)、從哪個(gè)入口查看扣分明細(xì)、又從哪里回到學(xué)期匯總頁(yè)。這篇記錄一下我在這個(gè)模塊上的方案選型、跨端實(shí)現(xiàn)過(guò)程以及真機(jī)階段踩過(guò)的坑。適合正在用 Flutter 做多端項(xiàng)目、或者準(zhǔn)備把手頭應(yīng)用遷移到 OpenHarmony 的同學(xué)參考里面的代碼片段可以直接抄踩坑記錄應(yīng)該也能幫你省不少時(shí)間。1. 項(xiàng)目背景與跨端方案選型1.1 獎(jiǎng)懲管理系統(tǒng)到底要解決什么問(wèn)題學(xué)生獎(jiǎng)懲管理系統(tǒng)看著像個(gè)普通的后臺(tái)管理項(xiàng)目但實(shí)際業(yè)務(wù)鏈條比想象中長(zhǎng)老師錄入加分扣分事件德育處做審批班主任要隨時(shí)看班級(jí)排名期末還要一鍵導(dǎo)出學(xué)期匯總。這個(gè)系統(tǒng)不是給人“看看而已”的它是每天都會(huì)被反復(fù)打開(kāi)的工具型應(yīng)用。業(yè)務(wù)場(chǎng)景大致劃分成四塊工作臺(tái)當(dāng)天待辦、班級(jí)考核排名、最新審批動(dòng)態(tài)、學(xué)生檔案按班級(jí)、學(xué)號(hào)、姓名檢索學(xué)生查看個(gè)人獎(jiǎng)懲時(shí)間線(xiàn)、獎(jiǎng)懲記錄錄入加分項(xiàng)和扣分項(xiàng)提交審批、個(gè)人中心登錄賬號(hào)、學(xué)期切換、數(shù)據(jù)導(dǎo)出入口。這四個(gè)入口對(duì)應(yīng)的就是底部導(dǎo)航的四個(gè) Tab整個(gè)應(yīng)用的骨架都由這棵導(dǎo)航樹(shù)撐起來(lái)。導(dǎo)航模塊在這種系統(tǒng)里的特殊性在于大多數(shù)頁(yè)面都不是靜態(tài)的。工作臺(tái)要輪詢(xún)待辦數(shù)量學(xué)生檔案頁(yè)要維持篩選條件獎(jiǎng)懲記錄頁(yè)可能有正在編輯但未提交的草稿。如果切換 Tab 時(shí)把這些狀態(tài)全部清掉用戶(hù)每次回來(lái)都得重新找一遍這種體驗(yàn)在評(píng)分系統(tǒng)里會(huì)被放大成很?chē)?yán)重的輿情問(wèn)題。所以跨端方案首先要保證的就是狀態(tài)穩(wěn)定。1.2 為什么是 Flutter 加 OpenHarmony最早團(tuán)隊(duì)討論技術(shù)方案的時(shí)候有人提過(guò)直接用 OpenHarmony 的原生能力重寫(xiě)一套界面。這個(gè)方案不是不行但我們當(dāng)時(shí)的處境是Android 等傳統(tǒng)移動(dòng)端已經(jīng)有了一套成熟的 Flutter 代碼業(yè)務(wù)邏輯、接口封裝、數(shù)據(jù)模型都已經(jīng)沉淀下來(lái)了如果為了適配 OpenHarmony 再重寫(xiě)一套等于同時(shí)維護(hù)兩套代碼人員成本直接翻倍。Flutter 的優(yōu)勢(shì)在于它的自繪引擎UI 渲染不依賴(lài)系統(tǒng)原生控件所以在不同平臺(tái)上渲染效果一致性極高。這一點(diǎn)對(duì)獎(jiǎng)懲系統(tǒng)很關(guān)鍵同一個(gè)配色體系、同一套圓角卡片、同一種 tab 切換動(dòng)畫(huà)在傳統(tǒng)移動(dòng)端和 OpenHarmony 設(shè)備上應(yīng)該看起來(lái)一模一樣而不是各自被系統(tǒng)控件“本地化”。代價(jià)當(dāng)然也有。OpenHarmony 上跑 Flutter 需要用到社區(qū)適配的 Flutter SDK原生能力調(diào)用要自己封裝平臺(tái)通道比如狀態(tài)欄高度讀取、震動(dòng)反饋、消息角標(biāo)這類(lèi)系統(tǒng)交互都得在側(cè)平臺(tái)注冊(cè)對(duì)應(yīng)方法。但對(duì)我們這種以 UI 和狀態(tài)管理為主的業(yè)務(wù)模塊來(lái)說(shuō)跨端收益遠(yuǎn)大于額外適配成本。1.3 導(dǎo)航模塊在整個(gè)項(xiàng)目里的角色做這個(gè)項(xiàng)目之前我一直覺(jué)得導(dǎo)航模塊就是“底部幾個(gè)按鈕 路由棧”沒(méi)什么好設(shè)計(jì)的。真正動(dòng)手才發(fā)現(xiàn)導(dǎo)航層決定了整個(gè)應(yīng)用的生命周期管理方式、頁(yè)面狀態(tài)恢復(fù)策略、甚至埋點(diǎn)數(shù)據(jù)的準(zhǔn)確性。舉例來(lái)說(shuō)獎(jiǎng)懲詳情頁(yè)會(huì)從三個(gè)入口進(jìn)入工作臺(tái)的待辦列表、學(xué)生檔案里的學(xué)生時(shí)間線(xiàn)、獎(jiǎng)懲記錄里的歷史明細(xì)。三個(gè)入口傳遞的參數(shù)不一樣詳情頁(yè)的返回行為也不一樣。如果不把導(dǎo)航模塊設(shè)計(jì)成一個(gè)獨(dú)立的架構(gòu)層而是每個(gè)頁(yè)面自己處理跳轉(zhuǎn)邏輯后期每加一個(gè)入口就要改一遍所有相關(guān)頁(yè)面。我把導(dǎo)航模塊定義成“路由中樞 頁(yè)面容器 狀態(tài)管家”三個(gè)職責(zé)業(yè)務(wù)頁(yè)面只關(guān)心自己接收什么參數(shù)不關(guān)心誰(shuí)跳過(guò)來(lái)的。這為跨端實(shí)現(xiàn)打下了基礎(chǔ)。2. 功能導(dǎo)航模塊的架構(gòu)設(shè)計(jì)2.1 路由框架選擇先別急著上第三方Flutter 生態(tài)里路由方案很多。go_router、auto_route、beamer 這些框架功能確實(shí)強(qiáng)大支持深鏈、重定向、動(dòng)態(tài)路由過(guò)濾。但在這個(gè)項(xiàng)目里我最終還是選了 Navigator 1.0 加 onGenerateRoute 的純?cè)桨冈蛴腥?。第一?jiǎng)懲系統(tǒng)的導(dǎo)航層級(jí)很淺。底層四個(gè) Tab每個(gè) Tab 下面最多再推兩層業(yè)務(wù)頁(yè)面列表頁(yè)進(jìn)詳情頁(yè)。這種深度用 Navigator 自己的棧管理完全夠用上第三方框架反而要多維護(hù)一套路由配置。第二第三方路由框架對(duì) OpenHarmony 的兼容性沒(méi)有經(jīng)過(guò)大規(guī)模驗(yàn)證像深鏈這種依賴(lài)系統(tǒng) intent 的能力在 OpenHarmony 上的行為未必跟傳統(tǒng)移動(dòng)端一致我不想在導(dǎo)航這個(gè)基礎(chǔ)模塊上賭這個(gè)兼容性。第三項(xiàng)目里需要自定義統(tǒng)一轉(zhuǎn)場(chǎng)動(dòng)畫(huà)Navigator 的 PageRouteBuilder 已經(jīng)能完全控制轉(zhuǎn)場(chǎng)過(guò)程。實(shí)際用下來(lái)這套輕量方案反而讓問(wèn)題排查變得非常簡(jiǎn)單。哪個(gè)頁(yè)面崩了直接看路由注冊(cè)表就能定位到是哪個(gè) builder 出的問(wèn)題不需要經(jīng)過(guò)框架層轉(zhuǎn)發(fā)。2.2 底部導(dǎo)航的結(jié)構(gòu)設(shè)計(jì)與頁(yè)面保活四個(gè) Tab 頁(yè)之間的切換涉及一個(gè)核心問(wèn)題要不要保留頁(yè)面狀態(tài)。最簡(jiǎn)單的做法是每次切換都 push 一個(gè)新頁(yè)面但這樣工作臺(tái)的滾動(dòng)位置、學(xué)生頁(yè)的篩選條件、記錄頁(yè)的編輯草稿全部會(huì)丟失。我采用了IndexedStack加懶加載的結(jié)合方案。IndexedStack的原理是所有子頁(yè)面都會(huì)被構(gòu)建但只有當(dāng)前索引對(duì)應(yīng)的頁(yè)面可見(jiàn)其余頁(yè)面通過(guò) Offstage 隱藏起來(lái)。這種方式能讓每個(gè) Tab 頁(yè)的 State 一直存活切回來(lái)時(shí)頁(yè)面還在原地。但它的一個(gè)潛在問(wèn)題是四個(gè) Tab 頁(yè)會(huì)在啟動(dòng)時(shí)一次性全部 build如果每個(gè)頁(yè)面初始化都發(fā)接口請(qǐng)求啟動(dòng)時(shí)并發(fā)請(qǐng)求會(huì)很多。為了平衡啟動(dòng)性能我寫(xiě)了一個(gè)LazyIndexedStack核心邏輯是首頁(yè)初始化時(shí)只 build 第一個(gè) Tab其他 Tab 直到第一次被點(diǎn)擊時(shí)才真正構(gòu)建之后進(jìn)入緩存列表不再銷(xiāo)毀。代碼不復(fù)雜class LazyIndexedStack extends StatefulWidget { const LazyIndexedStack({ super.key, required this.index, required this.children, }); final int index; final ListWidget children; override StateLazyIndexedStack createState() _LazyIndexedStackState(); } class _LazyIndexedStackState extends StateLazyIndexedStack { final Setint _builtIndexes {0}; override void didUpdateWidget(LazyIndexedStack oldWidget) { super.didUpdateWidget(oldWidget); if (widget.index ! oldWidget.index !_builtIndexes.contains(widget.index)) { setState(() _builtIndexes.add(widget.index)); } } override Widget build(BuildContext context) { final children ListWidget.generate(widget.children.length, (i) { return _builtIndexes.contains(i) ? widget.children[i] : const SizedBox.shrink(); }); return IndexedStack(index: widget.index, children: children); } }這個(gè)方案既保證了頁(yè)面狀態(tài)不丟又避免了一啟動(dòng)就瘋狂請(qǐng)求接口的問(wèn)題。實(shí)測(cè)下來(lái)冷啟動(dòng)時(shí)間比單純使用IndexedStack降低了百分之二十左右而且后續(xù) Tab 切換也不卡頓。2.3 路由表與業(yè)務(wù)模塊解耦我把所有頁(yè)面的路由統(tǒng)一收斂到一個(gè)集中管理的路由表中業(yè)務(wù)頁(yè)面模塊只負(fù)責(zé)注冊(cè)自己的 builder不處理具體 Navigator 調(diào)用。這樣做的好處是導(dǎo)航層不依賴(lài)具體頁(yè)面類(lèi)后續(xù)新增一個(gè)“消息通知”Tab只需要在路由表里加一條映射然后在底部導(dǎo)航配置里加一個(gè)入口其他頁(yè)面零改動(dòng)。路由表的組織方式如下class AppRouter { static const String workbench /workbench; static const String studentList /student/list; static const String studentDetail /student/detail; static const String recordList /record/list; static const String recordDetail /record/detail; static const String profile /profile; static const String notFound /404; static final MapString, WidgetBuilder _routes { workbench: (_) const WorkbenchPage(), studentList: (_) const StudentListPage(), studentDetail: (_) const StudentDetailPage(), recordList: (_) const RecordListPage(), recordDetail: (context) { final args ModalRoute.of(context)!.settings.arguments as RecordDetailArgs; return RecordDetailPage(args: args); }, profile: (_) const ProfilePage(), notFound: (_) const NotFoundPage(), }; static Routedynamic onGenerateRoute(RouteSettings settings) { final builder _routes[settings.name]; if (builder null) { return MaterialPageRoute( settings: settings, builder: (_) const NotFoundPage(), ); } return PageRouteBuilder( settings: settings, pageBuilder: (context, animation, secondaryAnimation) builder(context), transitionDuration: const Duration(milliseconds: 220), transitionsBuilder: (context, animation, secondaryAnimation, child) { return FadeTransition( opacity: animation, child: SlideTransition( position: TweenOffset( begin: const Offset(0, 0.03), end: Offset.zero, ).animate(CurvedAnimation(parent: animation, curve: Curves.easeOut)), child: child, ), ); }, ); } }這里有一個(gè)細(xì)節(jié)詳情頁(yè)這種需要參數(shù)的路由我用ModalRoute.of(context)去拿settings.arguments比在 builder 外部強(qiáng)制轉(zhuǎn)類(lèi)型要穩(wěn)妥。因?yàn)?Navigator 在創(chuàng)建路由的時(shí)候settings 是同一個(gè)對(duì)象只有在頁(yè)面真正 build 時(shí)才能確保拿到參數(shù)。統(tǒng)一轉(zhuǎn)場(chǎng)動(dòng)畫(huà)也在這里處理兩個(gè)端都會(huì)走同樣的一段淡入加輕微上滑視覺(jué)上一致性好很多。3. 跨端實(shí)現(xiàn)的關(guān)鍵細(xì)節(jié)3.1 OpenHarmony 上跑 Flutter 的運(yùn)行環(huán)境準(zhǔn)備OpenHarmony 系統(tǒng)本身不提供 Flutter 引擎需要在編譯階段使用社區(qū)適配的 Flutter SDK。這一步是整個(gè)跨端改造環(huán)境準(zhǔn)備里最核心的部分SDK 版本不匹配后續(xù)所有編譯和真機(jī)調(diào)試都會(huì)出問(wèn)題。實(shí)際操作上我把本機(jī)的 Flutter 工具鏈切換到適配 OpenHarmony 的分支然后用 IDE 工具創(chuàng)建工程模板時(shí)選擇對(duì)應(yīng)的設(shè)備類(lèi)型。環(huán)境變量里需要配置 OpenHarmony SDK 的路徑構(gòu)建產(chǎn)物是 hap 包而不是傳統(tǒng)的 apk。第一次構(gòu)建的時(shí)候IDE 工具會(huì)提示需要配置簽名我在項(xiàng)目設(shè)置里開(kāi)啟了自動(dòng)簽名生成本地調(diào)試證書(shū)這樣真機(jī)安裝環(huán)節(jié)基本不會(huì)卡殼。這個(gè)環(huán)境配置過(guò)程大概折騰了兩天。最容易踩的坑是版本對(duì)應(yīng)關(guān)系OpenHarmony SDK 版本和 Flutter 適配分支之間存在一一對(duì)應(yīng)用錯(cuò)一個(gè)版本輕則編譯報(bào)錯(cuò)重則頁(yè)面白屏但沒(méi)有任何日志輸出。我現(xiàn)在習(xí)慣在項(xiàng)目根目錄建一個(gè)environment.md文件把本機(jī)用的 SDK 版本范圍、Flutter 分支 commit 都寫(xiě)下來(lái)方便團(tuán)隊(duì)成員對(duì)齊環(huán)境。3.2 安全區(qū)域、狀態(tài)欄與系統(tǒng)字體適配Flutter 在傳統(tǒng)移動(dòng)端上有一套成熟的安全區(qū)域處理機(jī)制MediaQuery.of(context).padding直接拿頂部狀態(tài)欄高度。但在 OpenHarmony 真機(jī)上我第一次跑起來(lái)的時(shí)候發(fā)現(xiàn)頂部 padding 返回的是 0頁(yè)面內(nèi)容直接頂?shù)狡聊蛔钌厦鎸?dǎo)航欄標(biāo)題和狀態(tài)欄圖標(biāo)重疊在一起。排查后發(fā)現(xiàn)是 OpenHarmony 的窗口注入時(shí)機(jī)跟傳統(tǒng)移動(dòng)端不一樣Flutter 引擎拿到窗口 insets 的時(shí)機(jī)偏晚甚至在某些場(chǎng)景下根本沒(méi)上報(bào)。我采用的方案是在 OpenHarmony 側(cè)通過(guò)平臺(tái)通道主動(dòng)讀取一次狀態(tài)欄高度緩存在全局變量里供所有頁(yè)面使用。Dart 側(cè)注冊(cè)一個(gè)方法class PlatformMetrics { static const MethodChannel _channel MethodChannel(app/navigation/metrics); static Futuredouble getStatusBarHeight() async { try { final double? value await _channel.invokeMethoddouble(statusBarHeight); return value ?? 0.0; } catch (_) { return MediaQueryData.fromView(View.of(navigatorKey.currentContext!)).padding.top; } } }OpenHarmony 側(cè)收到statusBarHeight調(diào)用后把 WindowInsets 的可視區(qū)域頂部高度返回即可。這個(gè)值拿到后我在MaterialApp.builder里通過(guò)MediaQuery.copyWith注入讓全應(yīng)用都能用到一個(gè)可靠的 padding 值。同理底部導(dǎo)航欄也用SafeArea包裹避免在帶手勢(shì)條的設(shè)備上被遮擋。字體方面也有兼容問(wèn)題。OpenHarmony 的默認(rèn)中文字體跟傳統(tǒng)移動(dòng)端不一定一致如果 Flutter 頁(yè)面里指定了某個(gè)具體字體族在 OpenHarmony 上沒(méi)有對(duì)應(yīng)字體時(shí)中文可能顯示成方塊。我在全局ThemeData里配置了字體回退鏈ThemeData( fontFamily: Roboto, fontFamilyFallback: const [sans-serif, Noto Sans SC, Source Han Sans CN], )這里優(yōu)先用系統(tǒng)字體回退再指定常見(jiàn)中文字體。實(shí)測(cè)下來(lái)OpenHarmony 設(shè)備會(huì)優(yōu)先匹配到自己系統(tǒng)里有的中文字體顯示效果不會(huì)出現(xiàn)方塊。3.3 導(dǎo)航切換動(dòng)畫(huà)與觸摸反饋的一致性Flutter 在不同平臺(tái)上的默認(rèn)頁(yè)面過(guò)渡動(dòng)畫(huà)不一樣Android 系統(tǒng)是縮放加淡入iOS 系統(tǒng)是側(cè)滑。OpenHarmony 上默認(rèn)行為可能又會(huì)變。為了讓兩個(gè)端觀(guān)感統(tǒng)一我像前面代碼里那樣自定義了PageRouteBuilder統(tǒng)一使用 220 毫秒的淡入加 0.03 倍高度輕微上滑效果。這個(gè)動(dòng)畫(huà)時(shí)長(zhǎng)很關(guān)鍵太短顯得生硬太長(zhǎng)會(huì)拉低操作效率220 毫秒是我實(shí)測(cè)下來(lái)比較舒服的值。Tab 切換時(shí)的觸摸反饋也踩過(guò)坑。傳統(tǒng)移動(dòng)端上調(diào)用HapticFeedback.mediumImpact()會(huì)有明顯的震動(dòng)在 OpenHarmony 真機(jī)上這個(gè)方法默認(rèn)可能沒(méi)有任何效果需要自己在側(cè)平臺(tái)實(shí)現(xiàn)震動(dòng)接口。后來(lái)我干脆把 Tab 點(diǎn)擊的震動(dòng)反饋?zhàn)龀梢粋€(gè)可選配置默認(rèn)關(guān)閉。原因很簡(jiǎn)單導(dǎo)航切換本身已經(jīng)有視覺(jué)反饋震動(dòng)在這個(gè)場(chǎng)景里不是剛需與其花時(shí)間調(diào)平臺(tái)差異不如去掉這個(gè)不可控因素。底部導(dǎo)航的自定義動(dòng)畫(huà)也需要注意性能。切換 Tab 時(shí)我做了兩件事圖標(biāo)位置的輕微上移和顏色漸變。圖標(biāo)位移幅度控制在 3 個(gè)邏輯像素以?xún)?nèi)配合 150 毫秒的AnimatedSlide效果自然而且不會(huì)引發(fā)布局抖動(dòng)。位移大了會(huì)顯得輕浮幅度小了沒(méi)有反饋感3 像素是反復(fù)調(diào)出來(lái)的值。3.4 頁(yè)面參數(shù)的序列化約定跨端實(shí)現(xiàn)里最容易被忽略的是頁(yè)面間傳參的方式。團(tuán)隊(duì)早期習(xí)慣直接塞MapString, dynamic在單一端上沒(méi)出過(guò)問(wèn)題但到了跨端場(chǎng)景Map 里的類(lèi)型信息在路由轉(zhuǎn)發(fā)過(guò)程中很容易丟失。比如學(xué)生詳情頁(yè)需要studentId字符串和fromSource整數(shù)如果傳參時(shí)把 fromSource 寫(xiě)成字符串頁(yè)面內(nèi)部判斷就會(huì)出錯(cuò)而且這種錯(cuò)誤在編譯期完全暴露不出來(lái)。我的做法是對(duì)所有需要跨頁(yè)傳遞的數(shù)據(jù)定義強(qiáng)類(lèi)型參數(shù)類(lèi)。前期可能覺(jué)得多寫(xiě)幾個(gè)類(lèi)很繁瑣但后期維護(hù)時(shí)收益明顯編譯器能檢查類(lèi)型錯(cuò)誤IDE 能自動(dòng)提示字段名重構(gòu)時(shí)也不會(huì)因?yàn)楦牧俗侄蚊麑?dǎo)致運(yùn)行時(shí)崩潰。學(xué)生詳情頁(yè)的鏈路就是典型例子。工作臺(tái)入口傳WorkbenchStudentArgs學(xué)生列表入口傳StudentListArgs兩者都包含基礎(chǔ)的學(xué)生標(biāo)識(shí)但來(lái)源信息不同。詳情頁(yè)根據(jù)來(lái)源決定返回時(shí)是否要刷新上一頁(yè)數(shù)據(jù)。導(dǎo)航層不感知這些差異只需要原樣透?jìng)鲄?shù)具體解析邏輯留在頁(yè)面內(nèi)部處理。4. 實(shí)操過(guò)程把導(dǎo)航模塊落地到兩端4.1 初始化 OpenHarmony 側(cè) Flutter 工程整個(gè)實(shí)操過(guò)程踩得最多的坑集中在工程初始化和真機(jī)安裝階段。第一次創(chuàng)建工程時(shí)我沒(méi)選對(duì)設(shè)備類(lèi)型模板構(gòu)建出來(lái)的包在 OpenHarmony 設(shè)備上直接無(wú)法安裝。后來(lái)重新照著官方模板走了一遍流程才跑通。我記錄的標(biāo)準(zhǔn)化流程是這樣的第一步確認(rèn)本機(jī) Flutter 版本處于適配分支執(zhí)行flutter doctor檢查環(huán)境第二步創(chuàng)建 Flutter 工程注意工程名要符合命名規(guī)范包名不能帶連字符第三步在 IDE 工具里配置 OpenHarmony SDK 路徑選擇自動(dòng)簽名生成調(diào)試證書(shū)第四步構(gòu)建 hap 包并在真機(jī)上安裝。最容易被忽略的是工程里的build-profile.json5配置。這個(gè)文件里聲明了簽名證書(shū)和模塊信息如果配置有問(wèn)題真機(jī)安裝會(huì)提示簽名錯(cuò)誤但日志信息并不直觀(guān)。我建議第一次跑通后馬上備份一份可用的配置文件后續(xù)重新初始化時(shí)直接復(fù)用省去重復(fù)排查的時(shí)間。4.2 自定義底部導(dǎo)航欄的實(shí)現(xiàn)思路我沒(méi)有直接用 Material 的NavigationBar組件原因是獎(jiǎng)懲系統(tǒng)的底部導(dǎo)航需要支持未讀角標(biāo)和特定的紅點(diǎn)提示NavigationBar的擴(kuò)展能力在這些細(xì)節(jié)上不夠靈活強(qiáng)行自定義反而要寫(xiě)一堆樣式覆蓋代碼。自研底部導(dǎo)航欄的結(jié)構(gòu)是一個(gè)Container加SafeArea內(nèi)部用Row均分四個(gè)按鈕每個(gè)按鈕由InkWell包裹配合AnimatedContainer實(shí)現(xiàn)狀態(tài)切換。核心代碼大致是Scaffold( bottomNavigationBar: Container( decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, boxShadow: const [ BoxShadow( color: Color(0x14000000), blurRadius: 8, offset: Offset(0, -2), ), ], ), child: SafeArea( top: false, child: Row( children: [ for (final item in _navItems) Expanded( child: _NavItem( label: item.label, icon: item.icon, selected: _currentIndex item.index, onTap: () _onSwitchTab(item.index), ), ), ], ), ), ), body: LazyIndexedStack( index: _currentIndex, children: _pages, ), )_NavItem內(nèi)部處理選中態(tài)圖標(biāo)和文字顏色用AnimatedSwitcher切換圖標(biāo)位置用AnimatedSlide做 3 像素的上浮。角標(biāo)部分我在圖標(biāo)右上角疊加了一個(gè)自定義Positioned控件讀取全局待辦數(shù)量有值時(shí)顯示紅色原點(diǎn)沒(méi)有值時(shí)不渲染避免出現(xiàn)空白占位。切 Tab 的邏輯統(tǒng)一走_(dá)onSwitchTab這里會(huì)做三件事更新_currentIndex、觸發(fā)LazyIndexedStack的懶加載、告知路由觀(guān)察器當(dāng)前頁(yè)面位置。為什么要告知路由觀(guān)察器因?yàn)槿绻脩?hù)在某個(gè) Tab 內(nèi) push 了二級(jí)頁(yè)面然后按 Home 鍵退出 App再恢復(fù)進(jìn)來(lái)時(shí)我們希望路由棧能回到當(dāng)時(shí)的位置而不是App啟動(dòng)時(shí)的工作臺(tái)頁(yè)面。4.3 用 IndexedStack 做頁(yè)面保活的完整流程頁(yè)面?;畹耐暾溌肥沁@樣的用戶(hù)點(diǎn)開(kāi)學(xué)生管理 Tab學(xué)生列表頁(yè)被LazyIndexedStack構(gòu)建頁(yè)面里的initState只執(zhí)行一次接口請(qǐng)求也只在首次進(jìn)入時(shí)觸發(fā)。之后切到獎(jiǎng)懲記錄 Tab再切回學(xué)生管理頁(yè)面 State 沒(méi)有銷(xiāo)毀滾動(dòng)位置、篩選條件都還在。但這里有個(gè)細(xì)節(jié)要注意如果學(xué)生列表頁(yè)內(nèi)部用Navigator.push到詳情頁(yè)詳情頁(yè)返回后列表頁(yè)是正常的但如果用戶(hù)正在詳情頁(yè)時(shí)直接切底部 TabFlutter 默認(rèn)行為有可能把整個(gè)根 navigator 的頁(yè)面棧重置。我通過(guò)RouteObserver做了一層保護(hù)記錄每個(gè) Tab 頁(yè)內(nèi)的當(dāng)前子路由切 Tab 時(shí)不下發(fā)重置指令返回 Tab 時(shí)再把子路由恢復(fù)回去。實(shí)際操作里我給每個(gè) Tab 頁(yè)分配了一個(gè)GlobalKeyNavigatorState四個(gè) Tab 內(nèi)部各自維護(hù)自己的導(dǎo)航棧互相不干擾。外層導(dǎo)航只負(fù)責(zé)切換 Tab內(nèi)層導(dǎo)航負(fù)責(zé)各自業(yè)務(wù)流的頁(yè)面堆疊。這樣從工作臺(tái)進(jìn)獎(jiǎng)懲審批流再?gòu)膶徟魈綄W(xué)生詳情兩個(gè) Tab 的導(dǎo)航?;ゲ挥绊懛祷匦袨橥耆嫌脩?hù)預(yù)期。5. 真機(jī)調(diào)試中的典型問(wèn)題與排查實(shí)錄5.1 安裝運(yùn)行階段的問(wèn)題OpenHarmony 真機(jī)調(diào)試階段我遇到的最常見(jiàn)問(wèn)題是安裝失敗。癥狀是 hap 包拷貝到設(shè)備后安裝進(jìn)度條一閃而過(guò)然后提示“安裝失敗”具體原因在設(shè)備日志里也不明顯。排查步驟是先確認(rèn)簽名證書(shū)有沒(méi)有過(guò)期再看工程包名和簽名配置里的包名是否一致最后檢查設(shè)備系統(tǒng)版本和編譯 SDK 版本范圍的匹配關(guān)系。第二次遇到的怪問(wèn)題是頁(yè)面啟動(dòng)后白屏沒(méi)有任何異常日志。后來(lái)發(fā)現(xiàn)是 Flutter 引擎版本和 OpenHarmony 系統(tǒng)的圖形棧不兼容需要升級(jí) Flutter 適配分支版本。這個(gè)問(wèn)題在傳統(tǒng)移動(dòng)端上幾乎不會(huì)出現(xiàn)因?yàn)?Android 的圖形棧相對(duì)統(tǒng)一OpenHarmony 的自研圖形棧對(duì) Flutter 引擎的版本要求更嚴(yán)格。升級(jí)后白屏問(wèn)題徹底消失。還有一個(gè)體驗(yàn)上的坑在 OpenHarmony 真機(jī)上熱重載hot reload是不可用的。在傳統(tǒng)移動(dòng)端上我習(xí)慣改完代碼馬上r一下看效果到了 OpenHarmony 上這個(gè)操作直接沒(méi)有響應(yīng)必須全量重新編譯構(gòu)建。這個(gè)差異很影響調(diào)試節(jié)奏我后來(lái)把導(dǎo)航欄樣式相關(guān)的常量全部抽到配置文件里改數(shù)值不用重新編譯業(yè)務(wù)代碼才算解決了頻繁重啟的問(wèn)題。5.2 路由棧與頁(yè)面狀態(tài)異常路由棧最典型的問(wèn)題是二級(jí)頁(yè)面切換 Tab 后返回行為錯(cuò)亂。場(chǎng)景是這樣的在工作臺(tái)點(diǎn)開(kāi)一條審批記錄進(jìn)入審批詳情頁(yè)然后直接點(diǎn)擊底部導(dǎo)航切到學(xué)生管理 Tab。理想情況下再切回工作臺(tái)時(shí)應(yīng)該還停留在審批詳情頁(yè)方便用戶(hù)繼續(xù)處理。但如果不做內(nèi)層導(dǎo)航棧隔離外層 Navigator 的棧會(huì)被整個(gè)重置切回來(lái)時(shí)直接回到工作臺(tái)首頁(yè)審批詳情頁(yè)的填寫(xiě)內(nèi)容全部丟失。這個(gè)問(wèn)題我花了兩個(gè)晚上才想明白根因Navigator 的棧是全局的底部 Tab 切換不會(huì)自動(dòng)保存某個(gè) Tab 的導(dǎo)航棧深度。內(nèi)層GlobalKeyNavigatorState的方案就是為了解決這個(gè)問(wèn)題。每個(gè) Tab 頁(yè)用自己的 Navigator 管理子路由這樣 Tab 切換時(shí)內(nèi)層棧天然不會(huì)被外層 Navigator 處理。如果你的項(xiàng)目已經(jīng)開(kāi)始用 go_router這個(gè)問(wèn)題可以通過(guò)StatefulShellRoute的配置解決本質(zhì)上也是為每個(gè)分支維護(hù)獨(dú)立導(dǎo)航棧。但用 Navigator 1.0 配合多個(gè) NavigatorState邏輯更直接更可控。5.3 跨端差異導(dǎo)致的 UI 異常比較頭疼的一類(lèi)問(wèn)題是同一個(gè)布局代碼在兩個(gè)端顯示效果不同。我遇到過(guò)一個(gè)案例工作臺(tái)頁(yè)面的頂部標(biāo)題欄傳統(tǒng)移動(dòng)端上高度剛好 88 邏輯像素到了 OpenHarmony 上標(biāo)題欄被拉高了 30 多像素。排查后發(fā)現(xiàn)是 OpenHarmony 系統(tǒng)對(duì)文字默認(rèn)行高和字體度量的處理不同加上中文字體 fallback 之后又引入額外的行高導(dǎo)致高度計(jì)算不一致。這個(gè)問(wèn)題不能靠硬編碼高度解決不同設(shè)備、不同字體設(shè)置下高度偏差都不一樣。我在標(biāo)題欄的構(gòu)建邏輯里改成用FittedBox約束文字區(qū)域并且設(shè)置textScaleFactor上限避免系統(tǒng)字體縮放導(dǎo)致標(biāo)題溢出。同時(shí)給標(biāo)題欄設(shè)置了最小高度保證在字體差異較大的設(shè)備上也不會(huì)縮得看不見(jiàn)。另一個(gè)常見(jiàn)問(wèn)題是狀態(tài)欄圖標(biāo)顏色的設(shè)置。傳統(tǒng)移動(dòng)端上通過(guò)SystemChrome.setSystemUIOverlayStyle可以方便地控制狀態(tài)欄圖標(biāo)是深色還是淺色。OpenHarmony 上這個(gè)方法部分版本不生效圖標(biāo)顏色和導(dǎo)航欄背景色撞了之后狀態(tài)欄內(nèi)容幾乎看不清。我的處理是默認(rèn)情況下使用深色背景加深色圖標(biāo)不依賴(lài)系統(tǒng)狀態(tài)欄的固有樣式如果業(yè)務(wù)頁(yè)面需要沉浸式背景就在側(cè)平臺(tái)通道里額外傳入一個(gè)圖標(biāo)顏色參數(shù)。5.4 常見(jiàn)問(wèn)題速查表現(xiàn)象可能原因排查方法解決方案hap 安裝失敗簽名證書(shū)過(guò)期或包名不一致核對(duì)工程包名與簽名配置重新生成自動(dòng)簽名證書(shū)頁(yè)面啟動(dòng)白屏Flutter 引擎與 OpenHarmony 圖形棧不兼容查看設(shè)備側(cè)日志升級(jí) Flutter 適配分支版本狀態(tài)欄高度返回 0WindowInsets 上報(bào)時(shí)機(jī)異常打印 MediaQuery 數(shù)據(jù)通過(guò)平臺(tái)通道讀取真實(shí) statusBarHeight切換 Tab 后頁(yè)面狀態(tài)丟失未使用 IndexedStack 或頁(yè)面被重建檢查頁(yè)面是否被 dispose使用 LazyIndexedStack 保持狀態(tài)二級(jí)頁(yè)面跟隨 Tab 重置外層導(dǎo)航棧被重置檢查導(dǎo)航棧層級(jí)每個(gè) Tab 維護(hù)獨(dú)立 NavigatorState中文顯示方塊字體回退鏈缺失檢查系統(tǒng)字體列表配置 fontFamilyFallback熱重載不生效OpenHarmony 暫不支持當(dāng)前熱重載觀(guān)察編譯輸出改為全量編譯抽出配置常量寫(xiě)在最后的幾點(diǎn)體會(huì)這個(gè)項(xiàng)目最讓我意外的事情是導(dǎo)航模塊在傳統(tǒng)移動(dòng)端跑得穩(wěn)穩(wěn)當(dāng)當(dāng)?shù)搅?OpenHarmony 上各種“小問(wèn)題”全冒出來(lái)了——狀態(tài)欄高度、字體回退、觸摸反饋、熱重載不可用每一樣都很瑣碎但每一樣都可能讓你卡上一整天??缍朔桨笍膩?lái)不是“寫(xiě)一次、跑所有”而是“寫(xiě)一次、適配每個(gè)端”。我現(xiàn)在特別后悔的一件事是沒(méi)有在一開(kāi)始就把平臺(tái)差異相關(guān)的代碼收斂到一個(gè)獨(dú)立的適配層里。當(dāng)時(shí)圖省事?tīng)顟B(tài)欄高度直接散布在頁(yè)面各處結(jié)果 OpenHarmony 真機(jī)一跑到處是padding.top失效的黑洞。如果后面這個(gè)項(xiàng)目還要再接入新的設(shè)備形態(tài)我會(huì)把所有MediaQuery讀取、平臺(tái)通道調(diào)用、字體配置統(tǒng)一收進(jìn)一個(gè)navigation_patch.dart文件里給上層業(yè)務(wù)暴露穩(wěn)定的接口不讓任何平臺(tái)差異滲透到頁(yè)面層。最后再分享一個(gè)調(diào)試習(xí)慣跨端調(diào)試一定要盡早借到真機(jī)模擬器只能信一半。我在模擬器上驗(yàn)證了很多次導(dǎo)航動(dòng)畫(huà)和狀態(tài)保存邏輯都沒(méi)有問(wèn)題一到真機(jī)就暴露了簽名、圖形棧、狀態(tài)欄高度等一系列環(huán)境相關(guān)的問(wèn)題。真機(jī)調(diào)試雖然麻煩但它能把那些在模擬器上隱藏得很好的問(wèn)題提前暴露出來(lái)省下的時(shí)間遠(yuǎn)不止調(diào)試那點(diǎn)功夫。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩国语字幕| 日韩久久.一级黄色片| 国产特级毛片AAAAAA高潮流水| 国模无码人体一区二区三| 免費黃色視頻觀看一| 九九九影院| 日韩一区二区精彩视频| 熟妇一区,二区,三区。| 韩国一级婬片A片AAAAA| 久久久久婷婷精品av电影| 免费啪啪av| 99精品免费| 玖色av| 黄色小视频日本txt| 久久啊哟| 午夜超爽| 综合网久久| 亚洲本色精品一区二区久久| 久久久久久久久久久999| 爱av免费| 欧美日韩婷婷中文| 色色色综合| 91丝袜美女视频| 久久午夜伦| av网站免费看| 丝袜狠狠草尤物人妻av91| 成人一级性爱| 亚洲国产一级精品毛一级精品看免费视频| 精品无码产区一区二| 日韩午夜精品一区二区三区电影| 91亚洲黄色网| 综合日本女人伊人| 探花精品视频| 日韩精品三级片长长久久| av橘色网站| 中文字幕aⅴ在线视频| 亚洲AV高潮| 91bbb| 青青草亚洲一区| 日本精品一区二区中文字幕| 欧美东京热精品A∨| 男人天堂2019亚洲| 九久9精品| 蜜奶av| 殴美日韩m| 日本天天人人狠狠在线日美女| 国产AAAAAABBBBB| 国产操逼网站亚洲一级黄色| 美国日韩黄片| 日本色色色视频| 国产激情在线| 亚洲一区二区麻豆影院| 内射中出日韩在线观看视频| 蜜臀AV成人精品蜜臀AV久久| 欧日韩不卡视.频| 极品五月天噜噜| 天天爽夜夜欢视| 日日AV加勒比| 亚洲 欧美 日本 国内 首页| 伊人操| 欧美宗合网| 欧美综合天天| 日本三级日本三级99| 精品国产少妇高潮视频| 97干天天| 五十路一区无码| xxx0国产在线播放| 超碰久久性爱| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 亚洲色图第四色| 欧美综合狠| 偷拍盗拍亚洲色图图片 | 日韩无码操逼片| 97在线精品| 日韩传媒在线| 84YTCOM性无码| 日本久久99| 国产熟妇一区二区| 欧美亚州综合网图片| 美女熟妇色| 一起草欧美| 午夜情侣自拍网站| 猛猛干| 90后性网国产欧美| 少妇久久久免费| 99色网| 激情综合五月| 久久久久久九九九| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 97精品综合| 色一区二区三区综合| 八戒无码国产午夜福利| 久久这里都是精品| 操国产逼| 天操天操夜操夜月月年年操操| 乱操乱伦AV| 韩国女主播青草在线| 少妇综合网| 懂色综合久久久| 国产精品一区二区a| 久久手机好看网站| 最新岛国大片| 国产精品69久久久久孕妇欧美| 在线无码视频| 五月天欧美色图| 91超级碰碰碰| 翔田千里爆乳巨臀无码| 国产日本一区二区三区蜜臀在线观看| 麻豆国产视频精品观看| 色综合久久久久| 涩涩涩综合| 国产亚州日韩欧美看片| 综合网欧美在线| 偷拍超碰| 人妻久久| 爽极品影院| 无码国产精品午夜不卡( | 亚洲熟妇极品| 蜜臀va69| 琪琪精品免费一区二区三区| 老司机老司机午夜影院| 熟女乱伦二区| 中日韩久久久免费看| 久久天天性久久伊人| 中文字幕久久亚州无码| 天天澡天天爽日日AV| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 色综合尤物| 欧美性暴力猛交| 自拍偷拍 日韩欧美| 欧美日日夜夜| 五月丁香啪啪| 日韩精品99999| 温婉少妇玩3p| 免费作爱一级视频| 综合操逼| 深田咏美亚洲精品福利社| 国产精品久久久久久亚洲色欲| 欧美色图99| 欧美精品另类人妖xxxx| 999狠狠综合| 97精彩视频网站| 欧美很很操视频| 欧美另类综合久久| 午夜福利成人免费视频| 717影院理论午夜伦八戒| 国产福利av精彩对白| 久久久久亚洲AV无码专区少妇| 国产在线综合网| 搡老熟女免费视频| 一类av片在线看| 亚洲精品尤物yw在线影院| 国产乱色国产精品免费视| 国产一区二区免费福利片| 激情小说图片亚洲首页| 国产家庭乱伦性爱视频| 青娱乐国产精品| 激情专区综合| 天美国产三级传媒| 裸体1区| 久久一区二区加油站| 青女偷拍网| 91精品婷婷国产综合久久| 鸥美中出| 免费在线黄片视频| 人人人人人人少妇| 一区二区三区色综合| 欧美高清16| 大JI巴好深好爽又大又粗视频| 被男人吃奶很爽的毛片| 美女自卫慰黄网站免费| n1038 一二三区| 蜜臀精品1区2区| 使劲用力艹少妇视频一区二区| 久久精品中文| 日韩操逼性鲍| 欧美性暴力猛交XXXX| 欧美亚洲韩国视频十五区| JuliaAnn丝袜熟女系列| 乱伦AVxx| 嗯~啊~快点 死我视频免费看网站| 国产尤物在线三区| 爆操无码| 精品综合久久久久久97| AⅤ片水多多| 欧美|91色综合| 999国产精品999久久久久久| 日韩亚洲精品一区二区| 亚洲色欲天天人妻无码系列专区| 成年人黄色视频免费| 99精品无码| 成人性爱美曰韩| 夜夜性| www.男人天堂| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 日本精品高清一二区一本到| 亚洲欧美在线观看无码| 欧美日日人人天天| 95精品在线| www.91逼逼.com| 91精品国产91熟女| 国产一区二区在线看| 欧洲精品网| 国产成自自拍在线观看| 亚洲日韩青青草色月| 国产原创自拍| 人妻天堂综合网| 九九亚洲视频| 久久草大香蕉| 五月激情在线| 色久桃花影院在线观看| а√天堂资源官网在线资源| 亚洲黄片免费在线播放| 国产精品精品系列在线观看| 97超级久久| 婷婷丁香人妻 | 欧美不卡五十路| 色色色网站| 天堂av2019| 天天操妹子| 欧美日韩m| 夜夜精品视频| 啊啊啊 在线观看| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 97视频在线观看高清资源| 茄子社区国产精品| Sekablack无码一区| 嗯嗯啊操我| 无码精品啪啪啪一区二区三区三州| 五月丁香激情四射| 丰满人妻一区二区三区在线| 久久中文字幕在线观看| 中文字幕在线观看视频www| 极品欧美一区二区三区| 国产日韩无码一区二区三区久久区| 370p日韩欧美亚洲精品| 欧美色图 色综合图| 97鸡把在线视频| 国产精品禁久久久精品| 亚洲色图A| 天天综合-91入口| 少妇久久久久久久久| a级免费在线观看| 欧美日韩精品久久久久东北老熟妇| 死我十八禁| 情色大香蕉| 丰满人妻-区二区三区免费看 | 日本熟女不卡视频| 黄色视频60分钟| 国语国产操逼伊人AV网| 首页亚洲国产高跟丝袜诱惑视频 | 欧美狠狠操| 色大香蕉97N| 久操视频在线| 亚洲欧美天堂| www…国产操逼| 亚洲在线观看| 日本高清一区二区在线| 麻豆蜜桃视频在线观看| 天天综合网~91综合网| 综合色一区三区二区| 91看黄片| 精品色色| 日本精品一区二区三| 成人怡红院| 亚洲码专区| 天美一区在线| 诱惑网综合| 国产高清精品一区二区三区毛片 | 色婷婷九月| 精品一区二区三区最新| 涩涩久久精品| 欧美999| 无码高清操逼网址| 夜夜操二区| 国产亚洲色婷婷99精品91| 天天操天天舔| 婷婷九月丁香| 一区三区啪啪| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 高清无码国产亚洲| 久久久999国产精品| 怡红院一区二区熟女人妻| 青青草在线视频美女| 99热综合| 极品出轨视频网站| 亚洲人妻在线精品| 夜夜嗨一区| 人妻精品一区二区三区| SUV一区二区在线看| 日韩三级在线观看mp4| 九九热九九| 国产日逼视频| 国产在线观看91精品一区| 四虎精品永久在线观看| 91高潮喷水美女| 欧美天堂日韩三级国产传媒| 人妻天天操天天爽视频免费| 人人贴人人摸| 免费看片黄| 91视频综合网| 丝袜美腿av女优在线| 欧美综合综合| 国产97综合| 中日韩久久久免费看| 黄站在线免费观看| 国产情色第一第二页在线观看| 国产乱弄免费在线视频。| 天堂av2019| a在线观看| 操逼操网| 欧日a| 一区二区三区黄片免费观看| 国产亚洲女v在线观看| 亚洲欧洲综合| 大香蕉中文201| 黄色成年| 9Ⅰ老熟女| 激情小说亚洲| 三男一女不戴套的A片| 狠久久| 国产亚洲精品激情| 免费精品无码一级毛片牛牛影视| 一本大道青青| 一区二区三区一亚洲中文字幕、综合区灬 | 特级丰满少妇一级AAAA爱毛片| 黄色免费网页无码| 色婷婷丁香五月| 99热66| 日本一区二区电影网站| laoshunv91| 国产精品粉嫩福利在线| 外国免费性情大片| 久久久一区二区三区三州| 中文字幕,人妻,日韩| 欧美亚洲| 日本久操视频| 亚洲吊色| 极品出轨视频网站| 久久大| 国产av强奸美女| 国产精品久久久久久久久AV大片| 人妻天天夜夜爽一区二区| 欧美黄色图片| 97鸡把在线视频| 亚洲国产成人精品久久久国产成人一区二区 | 久久久久久性爱片| 日本免费一区二区不卡| 97操| 91精品丝袜在线观看| 极品丝袜无码| 久9久9久9久9久9久9| 粉嫩av在线| 久久鲁夜| 色悠悠伊人网五月天| 我要去看2个日本美女.com曹逼| 亚洲色色探花| 黑丝91视频| 天天干夜夜操一区二区| 国产成人自拍视频视频| 国产丝袜视频| 欧美日韩系列| 国产一级内射无挡观看| 欧美精品四区| 欲综合网| 免费自拍三级综合| 求求你操操我| 亚洲国产精品无码AV久久久| 亚洲国男人的天堂| 色欧美在线| 少妇xx精品| 一区,二区,三区网站| 后入综合久久| 浪人综合网| 欧美婷婷久久| 中国一级αV| 9色在线| 老鸭窝日丰县女人| 人人看欧美性爱| 激情文学欧美| 又大又大又大又粗爽高潮观看| 国产一区二区三区影片| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 综合久欧洲| 高清孕妇孕交 交| 国产无马av| 国产中午字一暮区| 五月婷婷丁香中文字幕| 精品少妇一区二区三区| 亚欧Av| 欧美熟妇亚洲版| 在线中文字幕| 日本A级视频| 欧美亚洲国产91在线| 午夜天天碰综合视频| 欧美综合第一页| 色色无码| 爱爱啊啊啊| 日本在线不卡123| 四方色播| 日韩少妇丰满亚洲| 密乳AV免费观看| 超碰综合色| 国产一区二区三三视频| 久啪| 91美女色视频亚洲| 久久久精品91八戒| 少妇高潮对白在线观看| 丁香五月自拍| 污到发麻的视频 国产| 黑人与人妻| 久久久精| 啊啊啊啊啊好多水| 国内毛片国产专区二| 国产视频一区二区免费| 啊啊啊啊啊操我视频| 亚av顶级裸体一区二区三区四区五区 | 成人五月天丁香激情综合| 中文97国产| 欧美在线干| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 一牛一区二区三区久久| 九九九九九九综合| 国产精品白丝在线播放 | 天天插网| 久久xxxx| 骚人妻少妇视频| 2017天天拍大香蕉| 大香蕉国产中文自拍| 欧美最大综合网| 国产无码精品久久久久久| av无码av无码专区| 日本久操视频| 久草看看看| 欧美岛国精品在线观看| 日韩三级一区| 亚洲综合色图欧美| 免费av在线播放二区| www狠狠| 人妻熟妇久草在线| 黄色毛片A片| 亚洲天堂美臀在线| 人妻81p| 成人一区二区三区四区| 澳门黄片一香蕉视频| 日本91白丝| 97美日韩视频| AV污污污污| 亚洲欧美一区二区不卡视频播放| 国产亚洲福利第一页丝袜| 欧美97视频| 中文字幕av片| 少妇蜜汁| 深夜激情无码| 欧美资源| 久久超碰大香蕉| 国产一级黄色片在线观看| 欧美色图电影| 国内外毛片在线观看| 日韩啪啪啪啪啪| 久干9操| 啊啊啊好想要| 国产搭汕a级片| 日韩综合97P| 91人妻超碰| 天天摸,夜夜摸| 久久精品国产亚洲AV片多多 | 欧美九九九| 久久久9品一区二区三区| 在线一道啪| 国产精品黑人一区二区三区| 97伊人| 久久精品操| 九九九九精品一区| 日日夜夜噜| 在线观看AV不卡| 9久久精品| 久久久久9| 日韩乱伦视频| 久久欧美性爱视频| 欧美性爱五月天| 中日韩熟女| 乳欲人妻办公室奶水| www.av在线视频| 少妇一区二区三区精选| 天天操夜夜操狠很操| 日本性感人妻91| 国产午夜福利专区综合| 中文字幕精品免费一区二区| 天天色黄色影院天天操| 日本人妻中文字幕精品| a v网站在线播放| 日欧亚洲二三区大片不卡| 亚洲高清在线| 粉嫩久久久极品| 免费看黄片现成| 久久99草| 久久日本熟女精品一区| 夜夜操av亚洲一区二区| 91九九九小逼| 精品少妇人妻| 精品人妻一区二区蜜桃视频| 五月天婷婷社区| 日本成a人v网站在线观看| 久夜视频| 精品国产91内射久久| 日韩一二三区| 男人的天堂va在线| 国产东北女人在线视频| 欧美亚洲色图另类国产| 香蕉久久AⅤ...| 吖在线不卡一区二区国产剧情| 国产精品久久久久久久无码AV| 国产9熟妇视频网站| 少妇熟女一区二区三区| 伊人操你| 男女激烈网站最新| 性爱乱伦网址| 五月丁香六月婷综合成人综合| 五月婷婷丁香六月| 一道本东京热加勒比一区二区三区| 激情网五月天| 91久久午夜无码鲁丝片久久人妻| 日韩美女高潮喷水视频| 精品人妻一二三四区视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 超碰偷拍| 五月天婷婷在线看| 日本岛国黄色网址| 超碰超碰欧美| 亚洲自拍小说| 人人摸人人添人人操| 99国产精品人妻人伦| 91狠狠综合久久| 亚洲综合第一页| 国产操偷| 福利风月五月天影院| 色网综合网| 99re9| 在线A日本| 久久久工口| 超碰九九| 色99视频| 亚洲人人夜夜澡人人爽| 99xav| 亚洲熟久久| 亚洲一区二区三区中文字幕| 久久亚洲人妻| 新亚洲无码| 啊…啊…操我用力操我| 欧美男人的天堂| 色天使亚洲综合在线观看| 欧美AB在线观看| 少妇综合| 91丨国产丨白浆| 一起草视频在线| 人妻啊啊人妻啊| 欧美九九九| 亚洲高清在线| 97超碰色色| 久草久热| 第四色奇米影视777| 伊人玖玖网| 久久久精品中文字幕爱豆| 女人一区| 人妻少妇av在线观看| 精品免费囯产一区二区三区| 嫖老熟女A片一二三区| 无码精品啪啪啪一区二区三区三州| 综合久久久久久久综合网| 欧洲精品在线播放| 可以在线观看AV的网站| 天天干人人乐| 男人天堂站| 6080YYY午夜理论片在线观看| 亚州九九九精品视频| 熟女乱伦二区| 成人国产视频在线观看| 久久綜合很很很| 国产懂色精品国产av| 网友自拍第1页| 久久精品视频久久久| 岛园激情| 国产色产精品在线观看| 久久久久久夜夜夜夜夜| 成人性爱美曰韩| 国产v片在线免费观看| 一二三卡欧美日韩人妻免费精品| 日韩国语字幕| 亚洲色人妻综合| 91成人高清在线观看| 亚洲无码一区成人免费午夜| 91碰碰| 97欧美色资源| 日本一区二区不卡精品| 金莲网址| 午夜福利一区二区影院| 毛片一区二区| 国产精品国产精品国产| 亚洲丝袜综合| 国产精品久久久久久久久久二区三区| 少妇天堂网络| 激情欧美日韩女同久久| 色播丁香| 97在线精品| 少妇干B| 无码人妻精品一区二区中文| 欧美色亚洲| 大学生美女口爆| 91精品国产综合久久久蜜臀酒店| 亚洲一区二区av| 亚洲综合91| 亚洲久久久| 亚洲啪啪综合?v一区综合精品区| 国产97av| 国产剧情在线| 色色毛片| 看黄片视频免费| 嫖老熟女A片一二三区| 一类av片在线看| 草草影院日本第一页| 爽极品影院| 人人艹亚洲| 国产成年免费大片黄在线观看| 国产精品久久伊人| 日韩97超碰中文字幕| 黑人中出21连凳花野真衣| 麻豆婷婷成人一二三| 成人精品视频| 九热久| av网站免费线看| 亚洲成人性爱在线观看| 五月婷婷综合网| 综合网久久| 欧美第五页| 2017天天插| 国产专区第一页| 丁香激情五月天| 综合久欧洲| 国产欧洲精品亚洲午夜拍精品| 97se综合| 久久亚洲AV无码白度| www…国产操逼| 国产精品久久久久久久久久久久久久久久久久| 69丨亚洲丨精品丨入口免费播放| 免费国产电影一区二区| 欧美99| 一本色道熟妇| 黄色网址在线免费观看| 狠狠躁天天躁日日躁| 国产在线能看的你懂的| 96精品在线| 嗯嗯啊好大| 视频二区美腿制服人妻欧美| 青青伊人这里只有精品| 久久AV色| 26UUU欧美激情一区二区| 国产suv精品一区二区四| 九九九九97| 欧美日韩性爱电影在线| 伊人991| 天堂无码精品国产久| 美女黑人91神马| 久久性爱视频免费看| 精品视频久久久久九九九九9999 | 可乐操亚洲蜜911| 91丨九色丨熟女高潮| 色香91| 中文字幕在线免费观看视频| 久久亚洲一区二区色婷婷| 簧片免费看视频| 情色av电影| 欧美日韩另类在线播放| 人人操人人操人妻人| 九九玖玖精品| 香蕉人人操tv| 美女黄站| 久草在| 水澄无码AV| 久久夜夜| 男人天堂久久精品不卡| 亚洲激情AV| 天天看夜夜看日日干| 区一二区日韩亚洲乱码av电影| 国产亚洲精品美女久久久m| 国产免费小视频| 亚洲综合性网址| 99热这里都是精品| 黄视频免费| 亚洲情色 自拍| 日韩一区二区熟女| 国产欧美日韩在线不卡第一页| 91美女小视频| 97爱啪| 日韩女优中文字幕| 国语av最新自产拍在线观看| 人妻性爱一区二区| 97chaopengongkai| yaouchengrenav| 91美女色视频亚洲| 91N综合网| 日韩在线国产字幕| 激情五月丁香五月| 欧美亚洲日韩16色| 日本性爱视频一级| 操逼日韩无码 | 久久久一区二区三区麻豆| 亚洲欧美小说| 五月婷婷性爱| 嗯嗯啊啊啊啊轻点视频| 天堂av最新电影网| 国产最新小视频在线播放下载| 99久在线精品99re8热| 亚州九九九精品视频| 国产毛片毛片4p懂色| 欧美日韩操逼嗦吊| 久久久久久久久久黄色网| 中文字幕精品免费一区二区| 97干色天堂| 成人乱人伦一区二区| 青苹果影院男人的天堂| 久久精品 六十路 熟女 欧美| 少妇滛荡视频| 四虎影视永久在线观看精品免费网站| 无码av永久免费专区网站| 伊人国产av| ji熟女.com| 久久鲁夜| 精品久久久久av影院| 熟妇高潮一区二| 国产精品爱欲| 亚洲码和欧洲精品激情系列| 在线播放成人高清免费视频| 国产青视频| 成人无码影片视频在线| 国产成自自拍在线观看| 中文字幕精品免费一区二区| 国产精品第二页| 欧美视频在线视频免费va| 日韩av色图综合| 五月丁香六月综合缴清无码| 青木玲在线不卡| 九九热精品视频在线观看| 久久久久亚洲Av无码专区老牛影视 | 影音资源男人日韩| 婷婷亚洲综合| 1人人看人人摸人人操| 国产吹潮女在线观看| 热久久91婷婷| 免费看欧美美女黄色大片 | 国产精品麻豆视频网站| 天天狂操夜夜狂日| 天天摸天天舔天天操| 三级日本一区二区三区| 欧美日韩人妻精品一区二区三区| 色综合加勒比四四季| 色婷婷五月天| 肉嘟嘟www视频在线观看高清| 综合网亚洲1| 91九色丨国产丨爆乳| 欧美一区二区亚洲天堂| 国岛片视频| 1000部熟女视频在线观看| 欧美色另类| 在线岛国新天堂8| 欧洲亚洲国产综合在线| 亚洲丝袜诱惑| 精品国产乱码久久久影院| 美欧老女人97| 天天看综合网| www.99热| 丁香五月色| 久久五月份| 日韩人妻精品久久久久| 91在线无码精品秘 软件| 能直接看AV的网站| 黑丝少妇| 国产精品97视频| 成人草草视频| 精品一区二区三区18| 少妇天堂| 人妻熟女一区二区三区视频| 日本五十路在线| 久湿久久| 天天欧美| 强奸乱伦免费网站| 久久一区二区高清免费| AV无码久久久精品| 五月婷婷六月丁香| 欧美激情色婷婷花野真衣一区二区| av久日| 91天美免费| 凹凸视频在线一区二区| 久久精品久久九九精品| 久久肏大逼| 97免费在线视频在线观看| 簧片免费看视频| 精品久久99| 免费观看欧美日韩操逼视频| 日韩精品高清资源在线| 91老熟女91老女人| 色综合国产在线观看| 大色综合网| 中出789在线视频| 夜夜欢天天干| 人妻一区视频| 韩国女主播青草福利视频| 四虎影视 亚洲无码| 亚洲天堂7777| 人妻色偷色噜| 亚洲综合色婷婷| 久久一二三级一一一| 欧美超碰在线| 女人双腿搬开让男人桶| 操学生天天| 97精| 手机在线播放国产福利| 色播五月丁香| 91蜜桃传媒精品久久久一区二区| 男女啊啊啊啊啊| 中国国国产一级特黄毛片| 1204金沙人妻懂旧版免费| 青草综合| 国产精品 午夜福利| 操碰97| 97硬碰| 妇女性内射冈站HDWWWCOM| 91丝袜美腿网站| 亚洲无码超碰免费| 日韩精品大香蕉伊人在线| 亚洲乱伦图片视频| 色哟哟精品1精品2| 国产乱码久久| 国产精品视频麻豆入口| 日韩电影天堂视频一区二区| 黄片视频,下载| 亚洲综合夜色| 91一起操| 国产精品久久久久久高清无码免费看| 99九九久久| 中国国国产一级特黄毛片| 久久久久久人| 男生女生啊啊啊啊| 翔田千里AV无码秘 三区| 伊人天堂在线| 精品人妻一区二区视频| 久久9精品网站| 免费一级欧美片片线观看| 久一区久久蜜桃| 爱干爱射网啊啊啊| 成人av动漫在线观看| 久热这里只有精品9| 久久做97| 婷婷五月综合在线| 久久久久亚洲av综合波多野制衣| 99re9在线| 国产日韩区| juliaann欧美丝袜办公室| 国产精品久久久久久久久久久久久久久久久久| 日韩性爱1级片视频| 超碰美女97| 欧亚久久偷拍视频| 亚殴在线| 成年女人18级毛片毛片免费观看| 美国日韩黄片| 可乐操亚洲蜜911| 91国产丝袜美女| 美女裸体麻豆天美蜜桃91| 亚洲九九夜夜| 免费a在线播放v| 97资源站日韩| 亚洲自拍青操视频| 精品久久九| 欧美狠狠操| 97超碰天天爱天天爱| 午夜精品久久久久久久99蜜桃一| 大屁股人妻女教师撅着屁股| 中国91AV| 欧美翘臀视频网站一区二区三区| 久久久一二三四区| 91爱看| 色色综合97| 中文字幕一区二区三四五区日日骚| 亚洲第91页| 国产精品国产| 日韩在线电影| 琪琪精品免费一区二区三区 | 午夜人妻精品综合在线| 六六久久日韩不卡| 91女网站| 1二区9| AV男人天堂网| 麻豆亚洲AV成人无码久久精品| 91热| 色视频蜜乳| 亚洲另类电影| 国产成自自拍在线观看| 超清中文乱码字幕| 亚洲暴力强奸AV| 国产高清在线观看欧美| 亚洲五月丁香花狠狠干一区二区三区| 天操老女人| 久久超碰日韩精品| 国产乱码精品一区二区三区四川| 伊人久久艹| 亚洲激情深爱文学小说网站| 亚洲加勒比久久日本道| 一区二区影院| 国产人伦精品一区二区三区| 精品中文一区二区| 精品人妻一区二区视频| 91美女中出| 91久久国产精品| 亚洲成aⅴ人片不卡无码| 国产日本久久免费精品| 久艹伊人精品综合在线| 97亚洲色图| 婷婷亚洲五月***久久| 狠狠躁天天躁日日躁| 久久91| 男人午夜天堂| 日韩人妻大香蕉| 亚洲大色鬼| jizzjizz欧美| 人妻素股| 天天插天天插| 男人天堂2017| 日本超碰在线国产一区| 91w欧美| 亚洲欧美日产国产91毛片| 无码人妻精品一区二区三区99不卡| 久久极品一区二区| 东京热男人的天堂| 中文字幕一区二区三区人妻少妇在线| 91蜜桃传媒精品久久久一区二区| 黄在线| 91性网| 熟妇视频一区二区三区在线观看| 欧美熟妇成人一区二区| 精吧天堂| 亚洲天堂区| 久99在线免费观看视频| 丁香婷婷久久| 韩国三级一线观看久| 成年无码动漫av片无尽在线| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 国产成人在线观看网址| 97久久超碰国产网站| 国产一级高跟丝袜| 国产激情在线| 精品四五区| 日本欧美亚洲高清在线看| 91中文字幕制服丝袜免费视频| 青青草无码视频| 91人妻视频在线| 国产精品网址| 精品人妻一区二区三区日产| 丰满精品人妻少妇久久字幕| 99热在线播放| 欧美精品1区2区3区| 国产精品久久久久无码A√| 97操B| 欧美桃色网| 欲色啪| 精品国产99| 亚洲日韩一区电影| 国产乱码精品一区二区三区四川| 一级性爱视频免费观看 | 亚洲 欧美 日本 国内 首页| 97干天天| 国产又大又粗又长视频在线| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 亚州成人A√| 亚洲一区日韩精品| 91丨国产丨白浆秘 洗澡动漫| 日韩欧美天堂| 51一区二区三区| 99少妇内射| 男人的天堂在线| 亚洲黄a三级三级三级看三级| 久久伊人网视频一区二区三区| 亚洲AV无码黄色强奸| 青青青国产手线观看视频2| 欧美 精品国产制服第一页| 韩国一级做a久久久久| a片在线播放| 青青久久手机线视频| 激情看片网站| 91麻豆天美国产| 中文字幕伊人| 日本人妻最新在线中| 久久久免费的精品| 粉嫩绯色AV一区二区在线| 2024人人操人人摸| 啊啊啊啊啊在线观看网址| 国产精品久久久久久夜夜夜夜| 青青草久草AV| 嗯嗯啊啊好爽| 黄aaaaaaaaaaaaaaaaaa色网站| 亚洲精品国产精品乱码不99| 亚洲人成色9999精品久久| 久久夜夜夜| 九九九精品| 日本三级中国三级99人妇网站| 伊人天堂在线| 色777999综合| 日本熟女免费視颖| 国产一区二区三区久久久精品| 九色97| 台湾佬中文娱乐自偷自拍| 九99久久| 看黄片视频免费| 884t在线| 国模无码人体一区二区三| www.色操逼| 亚洲色图 图片| 色在线视频导航| 大香蕉伊人色偷偷在线| 国产精品丝袜在线| 日本Xx性爱| 屁股久久久久久久久| 狠狠操夜夜| 色五月AV在线| 久草免费在线一区二区| 国产第11页| 亚洲成人免费中文字幕| 日韩三级性| 日本免费一级AAA大片器| 亚洲色丰满少妇高潮| 国产一区二区免费福利片| 日韩999| 亚洲毛片基地专区| 欧美东京热精品A∨| 天天天操天天天爱| 操操啪| 亚洲男人久久综合天堂| 91天天爱| 中文字幕成人理论在线| 青青草在线视频美女| 天天综合91在线| 日韩丝袜二区| 一起草视频在线| AV在线资源| 中文字幕五区| 琪琪精品免费一区二区三区| 精品人妻一区二区三区-国产| 日韩福利综合一区| 床戏久久久av一区二区麻豆| 久久色激情一区二区三区| 天天干人人干天天日97| 草草草视频| 色777999综合| 四虎视频在线观看| 久久人人看| 成年人一级黄色毛片大全在线观看| 啊啊啊久久| 日韩精品作爱导航| 香一区二区三区| 丁香六月婷婷| 影音先锋每日最新资源在线观看 | 91网站18禁| 美日韩一卡二卡三卡免费人妻精品| 婷婷亚洲五月***久久| 色黄色美女大长腿午夜视频| 亚洲丝袜诱惑| 亚洲97资源| 超碰在线日韩一区| 欧美色图小说综合| 久久一二三四五六七八九区区| 九九毛片这里只有精品| 五月天激情小说| 亚洲第一在线视频| 一区不卡在线观看av| 亚洲av国产av综合av卡| 校园春色综合网| 欧美色性情| 日本五十路在线| 少妇内射www在线观看视频| 国产欧美精品日韩区二区麻豆天美| 97在线视频观看| 性做久久久久久免费观看软件| 成人免费不卡在线视频| 亚洲无码AV九九九| 天天操天天舔| 五月色综合| 久久嫩草国产成人一区| 亚洲熟久久| 人妻少妇精品无码专区二区密桃| 久久国产精品一区二区| 大象AV在线| WWW啪啪的com| 涩涩五月天| 亚州色图欧美| 2017天天操天天日| 国产强奸AV在线| 操逼逼福利视频| 天美传媒国产原创中文字幕亚洲欧美另类 | 国产av热热色| 夜夜高潮夜夜爽| 精品久一区免费| av婷婷色网| 欧美大干日韩| 啪啪视频免费在线观看| AA丁香综合激情| 久久精品欧美一区蜜桃| 亚洲丰满很很操| 亚洲乱妇p22| 乱伦av麻豆| 一区二区三区成人| 91在线欧美| 天天日天天色| 美女黄色91| 无码天堂| 国产 无码 一区二区| 91日日| 久久啊啊啊| 色色五月婷| 四虎影视永久在线观看精品免费网站| 久久久久久久精| 婷婷五月激情综合| 久久华人网| 俄罗斯一区二区视频在线观看| 97午夜剧场日韩| 精品人妻一区二区三区在线视频不卡| 多乙久久久久久| 亚洲91大片| 国产精品无码论坛| 日本一二区免费| 久久国产成人精品国产成人亚洲| 一牛影视成人片免费| 有码免费观看| 日韩成人性日韩成人性爱视频在线免费观看 | 自拍鲍鱼一区在线高清观看免费| 免费成人在线熟妇网| 人妻偷拍一区二区三区| 一区中文字幕二区日韩| 精品一区二区成人| 国产农村妇女毛片精品久久| 99热只有这里有精品| 粉嫩av一区二区三区天美传媒| 久久午夜伦| 天天色黄色影院天天操| 性交一区二区在线播放| www.超碰在线| 亚洲AV成人精品网站在AV| 超碰人妻久久人妻中文97| 国产精品免费日韩| 亚洲在饯| 亚州高清av| 青青草在线视频人人想人人上| 少妇3P性爱自拍| 91丝袜| 91中文精品日韩欧美在线| 精品成人av一区二区三区在线| 人妻性爱一区二区| 好爽要喷了| 9999免费精彩视频| 大JI巴好深好爽又大又粗视频| 锕锕好爽 死我在线观看| 大香蕉色网|