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

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(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)最容易被低估的部分它決定用戶從哪個(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í)間線、獎(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)要輪詢待辦數(shù)量學(xué)生檔案頁(yè)要維持篩選條件獎(jiǎng)懲記錄頁(yè)可能有正在編輯但未提交的草稿。如果切換 Tab 時(shí)把這些狀態(tài)全部清掉用戶每次回來(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 渲染不依賴系統(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)這類系統(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í)間線、獎(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)證像深鏈這種依賴系統(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)入緩存列表不再銷毀。代碼不復(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)航層不依賴具體頁(yè)面類后續(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)類型要穩(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è)備類型。環(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è)端觀感統(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è)邏輯像素以內(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 里的類型信息在路由轉(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)類型參數(shù)類。前期可能覺(jué)得多寫(xiě)幾個(gè)類很繁瑣但后期維護(hù)時(shí)收益明顯編譯器能檢查類型錯(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è)備類型模板構(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ò)誤但日志信息并不直觀。我建議第一次跑通后馬上備份一份可用的配置文件后續(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的懶加載、告知路由觀察器當(dāng)前頁(yè)面位置。為什么要告知路由觀察器因?yàn)槿绻脩粼谀硞€(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è)面?;畹耐暾溌肥沁@樣的用戶點(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)有銷毀滾動(dòng)位置、篩選條件都還在。但這里有個(gè)細(xì)節(jié)要注意如果學(xué)生列表頁(yè)內(nèi)部用Navigator.push到詳情頁(yè)詳情頁(yè)返回后列表頁(yè)是正常的但如果用戶正在詳情頁(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)航?;ゲ挥绊懛祷匦袨橥耆嫌脩纛A(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è)方便用戶繼續(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 異常比較頭疼的一類問(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)不依賴系統(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)前熱重載觀察編譯輸出改為全量編譯抽出配置常量寫(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
返回資訊列表
日本三级A片网站com| 国产一级高清免费观看| 久久五月丁香| 99精品国产户外露出| 超碰98综合网| 内射日韩大臀美女| 91粉嫩萝控精品福利网站_精品影音先锋国| 人妻欧美| 亚洲色图欧美| 91综合天天| 欧美激情色婷婷花野真衣一区二区| 亚洲高清无码免费观看视频| 免费一级特黄特色大片在线观看看 | 91色综合色| 亚洲精品男人的天堂| 97人妻免费中文字幕| 91精片| 78m啪啪啪| 久肏视频字幕| nuu12国产麻豆精品| 国产suv精品一区二区四区999| aaa一级黄片| 乱论91| 日本操逼视频不卡直接放| 欧美亚州综合网图片| 免费中文在线| 盗摄女人妻在线| 2017天天操| 欧洲自拍第一页| 丝袜综合| 在线亚洲丝袜视频网站| 熟妇高潮一区二| 岛国AV一区二区电影| 日本免费不卡二区| 粉嫩AV输入| 欧美精品第四五页中文字幕在线观看| 免费看污网站| 日日干夜夜欢| 欧美色图自拍| 久久久久久久| 96精品久久久久久久久久| 国产精品日日摸天天碰| 国产捆绑一区| 97干天天| Aa东京男人的天堂| 亚洲欧美综合网 | 日逼97| 亚洲精品电影| 成人国产视频在线观看| 亚洲精品国产无码高清| 精品一区二区成人| 亚洲欧美中文日韩视频中国语 | julia ann久久| 97香蕉网| 神马麻豆福利院| 亚洲图片欧美| 无码av永久免费专区网站| 国产91精品福利在线| 国产精品久久久久综合| 性色高清在线| 亚洲 欧美 综合 91| 999熟女精品| 在线观看啊啊啊啊啊| 98久久超碰| 99亚洲国产精品色一区二区三区| 日本九九九九| 伊人aaa| 99精品在线| 亚洲九九视频| 尹人免费观看视频在线| 国模吧 一区二区三区| 色哟哟的毛片| 成人久久久精品| 伦理第一页| 亚洲天堂中文字幕无码男同| 久草毛片电影怡| 久超碰这里只有精品| 男女一进一出视频久久| 国产精品自在线发布| 日韩内射视频| 久久中文字幕在线观看| 日韩无码黄色片| 欧美久久九九| 亚洲双插| 手机在线播放国产福利| 91精品国久久久久久无码| 天天欧美97| 精品国产91内射久久| 欧美啪啪女女| 男同专区一区二区三区在线| 成人av影院在线观看| 日日干夜夜干| 一二三区视频在线观看| 国产成人精品日本亚洲语言| 久久久久78| 亚洲人妻在线精品| 91美女中出| 在线小视频| 国产最火爆久久国产网站网站| 超碰在线99| AV中文字幕剧情1区2区3| 欧色网址| 婷婷五月天丁香花| 欧美人妻制服| 99re在线观看| 78m啪啪啪| 99爱在线视频| 美女黄网| 中文久久一区| 后入式免费视频| 99久久综合网| 欧美男人的天堂| 日本不卡高清视频| Aa东京男人的天堂| 欧美大香蕉同搞| 国产嫩草精品A88AV在线| 九九九九亚洲| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 成人精品电影| 国产福利精品98视频| 成人情色一区二区| 欧美色亚洲| 在线天堂999| 亚洲成aⅴ人片不卡无码| 九九九网页| 天天草天天日| 小草av不卡亚洲二区| 亚洲精品xxx| 欧洲精品一二三在线| 爽极品影院| 新精精品久久精品| 国产成人网址| 天天色天天干天天射| 91视频伊人| 操一区| 91老司机视频| 国产视频三区四区| 国产综合永久精品日韩鬼片| 懂色Av| 欧美中字二区| 日韩少妇一区二区三区| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 亚洲五月婷婷| 热99这里有精品综合久久| 手机av天堂久久久久| 久久av无码| 99re在线视频国产| 人妻熟女字幕一区二区| 中文字幕国产| 天天伊人| 98福利在线视频| 九月丁香婷婷| 亚洲黄色视频在线观看视频| 农村妇女精品一二区| 亚洲日韩国产精品| 国产第11页| 成人精品在线| 九九久久一区二区伦理| 日本一级特级毛片视频| 网友自拍第1页| 大香蕉综合| 97国产高清视频在线观看| 欧美色另类| 综合网欧| 九九玖玖精品| 九九玖玖精品| 久99视频| 免费精品人妻一区二区三| 日韩天天综合| 人妻无码一区二区三区久久99| 亚洲 91 在线| 国产成人无码久久精品| 秋霞网—男女啪啪亚洲免费体验区 | av大香蕉网站| 99国产在线绯色一区| 在线观看黄色电话| 十八禁的黄污污免费网站| 神马久久久久久久| 日本媚薬中文字幕在线| 日本道人妻久久久在线不卡色视频| 亚洲 欧美 中文 日韩超碰 | 中出20p| 丝袜综合色图| 久久伊人在线五区| 玖玖视频在线资源一区二区三区| 亚一综合久久久久久久久久| 欧美日韩中文亚洲v在线综合| 久久久久久久免费A片国产成a人亚洲精∨品无码| 亚洲三级网址久久最新| 色综合98| 99色色网| 国产高清26uuu| 波多野结衣之双飞调教在线播放| 91人人操| 欧美精品三区| 男人的天堂在线2| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 欧美肥臀在线| 久热这里| 亚洲狠| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 韩国国产欧美情侣视频在线| 国产精品网站免费| 97免费视频网| 欧美久久婷婷| 亚洲最大黄网| 国产精品一区二区三区四区五区| 色综合99999| 黄污污污污| 五月丁香六月激情综合| 成人午夜视频免费播放| 色官网在线| 黄片不用下载在线观看| 久久亚洲婷婷| 亚洲色图久久精品蜜| 亚洲色图大香| 熟妇视频一区二区三区在线观看| 碰超人人在线一区二区三区| 夜夜躁狠狠躁日日躁av| 无遮挡又黄又刺激的视频| 放黄片放3级黄片没穿衣服| 少妇久久久久久| 久久精品国产亚洲AV清纯| 国产一区在线播放| 另类亚洲一区二区三区| 国产精品无套内谢| 久久久久久久久久8888| 91狠| 夜夜黄| 98久久超碰| 99999精品| 另类图片欧美激情综合| 中文字幕91页| 啊啊啊好爽快点啊啊啊嗯嗯| 久久久久ab| 九九av| 亚洲一区中文字幕| 国产偷拍网站| 99色色网| 亚洲色香| 国产99999| 亚洲成人黄色在线观看| 国产精品香蕉热久久新品| 色色五月婷婷| 91撸色网 玖玖网 欧美| 久超碰这里只有精品| 精品人妻一区二区三区在| 国产精品视频自拍在线| 久久亚洲av成人无码国产| 国产天美欧美| 91模特在线观看| 老熟女乱伦片| 久久婷婷精品| 激情情色五月天| 欧美色网| 亚洲 日韩 欧美 国产综合体| 日韩精品9999| 四虎精品永久在线播放| 久热大香蕉| 神马久久久久久久久久久久| 99久草| 中文字幕日韩专区精品系列| 一本久久久精品| 无码操逼视频一下| 久久欧美1卡2卡3| 土豪酒店各种姿势玩弄极品幼稚| 成人乱人伦一区二区| 人妻天天夜夜爽一区二区| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 青青草天天亲夜夜操网| 中文字幕av丝袜| 国产精品点击进入在线影院高清| 大香蕉人妻| 熟女精品一区二区在线观看| 日韩一区二区精彩视频| 97天天爽| 亚洲中文字幕精品一区| 最新加勒比丝袜在线| 国产91 丝袜在线播放| 91 亚洲 欧美 日韩 国产 综合| 91欧美偷拍| 视频不卡中文字幕| 精品久久久无码| 日日干日日摸| 人妻嗯啊啊在线播放| 噜噜瑟| 在线国产一区二区av| 亚洲综合骚逼| 亚洲免费成人在线高清无码视频| 麻豆精品A片免费观看| 91精品人| 德国一二三不卡| 成人精品在线免费视频| 手机av天堂久久久久| 欧美色图亚洲激情| 天天综合网网欲色| 啊啊啊啊啊啊啊国| 国产无马在线| 超碰人妻中文在线| 手机看片1025| 啊啊啊啊操死我| 亚洲欧洲小说图片视频| 国产在线播放成人免费| 欧美久久人妻少妇一区二区| 男女真人网18| 69精品| 日本美女性生活久久久久久久| 亚洲精品99999| 混色激情av| yw尤物av无码点击进入麻豆| 亚洲欧美一区二区不卡视频播放 | 久久熟女人| 你懂的在线观看区国产 | 操www| 久艹99| 91超级碰| av爱爱爱| 少妇内射视频| 久久人妻办公室视频| 日本精品五区| 97精品久久久久中文字幕| 午夜男女爽爽爽在线视频| 色九九久九九| 97日视频| 这里只有精品久久| 嗯啊视频免费在线观看| 另类欧美综合| 97精品97久久| 亚洲精品欧美专业| 成人电影一区| 国产福利夜| 操逼不卡中文字幕| 狠狠色伊人亚洲综合网站色| 国产av色网| 亚州色交| 国人欧美精品一区二区| 在线视频97| 国产热av| 99热 按摩 日韩| 亚洲丝袜色| 在线a v| 97在线免费看视频| 欧美综合自拍亚洲综合图| 国产精品天美传媒| 国产精品探花在线| 老熟女乱子伦中文字幕一区二区 | 长长久久免费视频| 国产小u女在线观看| 91无码西班牙视频在线| 少妇贴图| 日本精品九九九| 麻豆国产原创AV色哟哟| 色婷婷视频| 久久久久久久亚洲Av无码| 青青草国产欧美非洲黑人| 男人的天堂日韩| 99 国产丝袜在线| 四虎影视在线| 91亚·色| 女优视频第10页| 久久久国产亚洲精品系列| 日韩啊V| 欧美亚洲手机在线| 超碰天天去日穴| 亚洲精品不卡一二三区| 白丝jkav| 婷婷精品国产一区二区三区日韩| 午夜超碰| 欧美综合亚洲综合| 91麻豆天美传媒在线| 久久久久国产精品人妻aⅴ天堂| 97超碰逼| 久久久久元码视频| 操逼999| 丝袜综合| 搞中出视频在线观看| 91AV老熟女视频| 麻豆久久视频在线地址| 99啪| 黄网站黄视频网站进入口| 狠狠躁AV| 秋霞男人网| 香蕉一区二区三区在线视频| 91美女在线精品视频| 午夜激情床戏激情| 国产精品制服丝袜中文字幕日韩一区二区三区| 久久久久久久久久久97| 青青草在线视频欧美| 91网18| 亚洲综合小视频小说在线观看| 日本不卡码黄色| 有码色中文字幕在线观看| 亚洲永久AV无码精品秋霞| 日韩钢筋无码高清啾啾啾| 精品乱码久久久久| 色综合超碰超| 91成人精品| 国内毛片热久久思思热| www.伪伪| 久久婷婷五月天| 激情自拍 校园春色| 无码91| 亚州高清色综合| 人妻 欧美亚洲| 亚洲男人天堂av| 国产成久久综合片| 欧美综合网1| 蜜桃臀久久| 久久αⅴ| 中文字幕一区二区三区高清| 色婷婷综合视频| 九九无码久久精品视频| 天天综合麻豆视频| 无码78| 中文字幕五月婷婷免费| 综合一区中亚洲国产成人综合精品| 亚洲1区| 日日干夜夜操视频h| 欧洲性人爱视频| 欧美性爱一区二区| 亚洲成A∨人影院在线欢看| 日韩另类色图| 98超碰日本| 日本色日夜干| 日本在线播放不卡一区| 玖玖蜜臀资源网| 国产精品毛片| 麻豆视频国产一区二区| 婷婷五月天小说| 青青草成人视频在线观看二区| yazhououmeizongya| 91成人高清在线观看| 久热大香蕉| 欧美乱妇狂野欧美在线视频| 老司机福利青青草| 久久婷色| 欧美极品少妇| 日韩黄片视频试看| 欧美少妇一区二区三区| 国产白丝网站| 96久久精品一二三区色欲| 99久久com免费视频′| 影音资源男人日韩| 色婷婷激一区二区三区 | 亚州综合色| 大香蕉一线视频| 日本操逼视频免费| 精品 码产区一区二-1080P高清在线www-B029AV | 国产精品伦理| 日本亚洲熟女视频| 激情视频一二三| 91国产操逼视频| 丝袜 亚洲 偷拍| 黑丝制服中文字幕| 亚洲黄色影视| 人妻少妇无码 | 国产熟女自拍| 亚洲乱码国产乱码精网站| 超碰在线人妻不卡| 最新日日夜夜天天干干| 亚洲综合113页| 国产色图乱伦| 亚洲人在线| 伊人热综合| 一二三啪啪专区| 精品一区二区三区国产| 日韩国产品视频中文字| 日本欧美中文字幕| 超碰97男人| 中文字幕高清精品一区| 伊人久久大香线综合无码| av在线播放国产一区| 探花激情视频| 97在线欧| 婷婷大香蕉| AV女优男人的天堂| 极品五月天噜噜| 日日夜夜精品视频| 你草精品在线视频| 少妇xx精品| 国产麻豆一区二三区| 国产精品久久久久中文字幕| 国产91专区| 激情小说五月天| 五月天黄色激情视频| 久湿久久| 9l视频自拍9l九色成人| 欧美精品宗合| 91天天c| 秋霞免费AV| 亚洲狠狠入| 成人综合色网| 性暴力欧美猛交在线直播| 久干网| 国产精品久久久久久久久AV大片| 999国产精品999久久久久久| 好湿好紧好爽 视频| 一级@啪啪视频| 91天天综合在线| 久久久久久久 九九九九九九九| a片 xxxx受爽视频| 精品网站99999| 激情久久久| 乱欲视频| 玖色av| 日韩二级| 九九99精品视频在线观看| 又粗又长又大国产不卡| 加勒比少妇AV婷婷六月天超碰超碰| 精品久久久亚洲AV成人网站| 豆花视频操逼网址| 91色射| 天天日日本| 狠狠色婷婷777| 免费久久一级毛片大黄| 一区二区影视| 亚洲骚男同com| 97色97好| 亚洲色人妻综合| 人妻aa| 囯戸精品高潮呻吟旡码| 另类小说欧美激情校园春色| 少妇精品久久久| 亚洲精品久| 性爱av在线免费观看| 91精品无码久久久久久久| 大香蕉一人| 中文字幕人乱码中文字的预防方法| 亚洲高潮影院| 蜜桃久久久久久久久久久久| 国产精品情侣啪啪| 婷婷在线视频| 亚洲国产一区二区三区四区国产| 亚洲国产婷婷在线播放| 中文字幕在线免费观看2| 97网站在线观看 | 熟妇一区,二区,三区。| 青青草吊丝| 思思热在线观看| 粉嫩在线一区二区懂色| 久久亚洲AV无码专区国产精品| 国产真实子伦对白| 丁香七月婷婷| 偷拍亚洲| 亚洲成人激情小说视频| 亚洲天天综合| 中文字幕精品探花视频| 秋霞 色色| 超碰成人人人爽人人爽| 国产传媒av天美传媒在线| 日本亚洲嫩草影院啪啪| 欧美色亚洲色| 欧美激情 亚洲色图| 亚州,欧美在线| 国产97综合| 久久久久幕乱码| 欧美色图在线视频少妇| 啊啊啊啊在线播放| av2014 日韩在线中文字幕| chaopen97久久| 九九热只有精品| 超碰97人人乐| 97干在线视频| 国产强奸乱伦欧美| 国产乱伦亚洲色图高清无码| 免费人成在线观看网站品爱网| www.99色| 日本五十路熟女一区二区| 一区二区三区 日韩欧美| 一级特级aaaa毛片免费观看| 青娱乐日韩无码| 天天插天天射| 中文字幕丝袜人妻| 91人妻精华帖| 成人免费在线网站| 91在线色综合| 夜夜狠狠躁日日躁色视频| 久偷拍欧美日韩三区| 精品人妻一区二区三区蜜桃视频| 精品97久久| 日韩av在线精品观看| 福利操逼| 精品色色| 一直超碰| 97碰碰色| 精品欧美А∨无码黑人大荫蒂| 成人免费不卡在线视频| 美女啊啊啊啊啊啊啊| 10000部十八禁看电影| 操淫穴亚洲五月丁香 | 黄片无码在线制服| 少妇一线天久久久久久| 丁香婷婷激情五月天无毒不卡| 欧美极品少妇| 国产一级舔足在线观看| 黄色性爱网网| 欧美 中文字幕 一区| 日本高清加勒比| 亚洲欧美黄| 日韩不卡在线一区二区| 加勒比无码一区二区三区| 素颜老阿姨乱情色| 亚洲精品97| 图片区小说区| 青青草大香蕉在线视频| 天天影视色香色欲| 亚洲AV在线资源| 人人么人人操| 99热这里只有精品8| 人人澡综合涩| 热99这里有精品综合久久 | 日本性爱欧美性爱| 激情综合五月婷婷| 日本九九久久99| 日本人妻最新在线中| 一区二区三区四区免费视频| 性色乱AV一区二区| 91无码精品| 日韩精品亚洲专区在线影视| 好看的91视频| 神马久久久久久| 九九人人操| 自拍第一页| 欧美国产精品| 天天看片麻豆| 日本性爱视频一级| 亚洲91av| 欧美狠狠| 天天干天天干天天干| 91插B网站| caoni国产亚洲av| 色大师网站www永久网站视频| 久久78| 91 亚洲 欧洲| 97爱综合| 欧美日韩国产传媒在线精品| 97Ai亚洲| 国产乱码久久| 97在线免费观看| 人妻加勒比东京热| 国产精品久久| 少妇无码太爽| 中文字幕天堂在线| 佐山爱中文字幕| 人人操人人插 - 百度 - 百度| 欧插网站| 日本成人免费一区二区三区| 国产精品。| 国产一区自拍欧美日韩| 亚洲色丰满少妇高潮| 亚洲免费在线探花| 亚洲偷91色| 日韩欧美经典在线观看| 欧美色91| http://qxhbdz.com| 欧美国产精品久久九九| 国产精品 午夜福利| 欧美一二三级精品在线| 97免费在线观看视频| 不卡在线观看视频| 美日韩男女操屄视频| 免费视频a级毛片免费视频| 91激情综合| 亚洲最大无码中文字幕网站| 超碰久久.com| 人人乐大香蕉| 日本伦乱九九九综合| 色狠人在线99| a v网站在线播放| 天天操福利视频综合网站| 91操人| 永久电影三级在线观看| 蜜臀AV成人精品蜜臀| 人摸人人操人| 国产97视频| 国产又大又粗又长视频在线| AAAAAAAAA黄片| 国产精品97视频| 欧美亚男人的天堂| 国语精品内射在线观看| 久久尹人大香焦视| 日日夜夜噜| 久久久久久久人妻| 国产成人无码a| 91久热| 蜜臀在线免费观看在线免费观看| 成人性爱av.com| 欧美情色亚洲| 成人熟女区| 99精品在线观看| 翔田千里Av在线| 超碰精品97| 国产污视频麻豆传媒一区二区 | 无码一区二区三区四区五区六区七区八区九区十区视频 | 久久黄黄| 久久久精品无码亚免费| 99无码狠狠久久| 中文字幕av片| 亚洲情色在线| 精品妇女一区二区三区| 干干干天天| 国产 日韩 欧美一区| 久肏视频字幕| 9999亚洲精品| 亚洲乱色视频一区、二区在线| 久久久国产成人一区二区三区在线| 欧美18老人禁| 日本一区二区三区四区五区六区七区八区九区| 天天射夜夜| 97玖玖超碰| 伊色综合天堂色97| 超碰久热| 欧美国产日韩高清在线| 欧美一级久久久久久久大片动画 | 日本99视频| 久久久久亚洲Aⅴ无码| 亚洲乱色熟女一区| 精品国模无码| 精品人妻一二三| 超碰美女97| 国产91丝袜 在线播放| julia ann久久| 久久九精品| 亚洲色图美腿丝袜| 九九英色视频| 国产传媒日本欧美专区| 狠狠躁AV| 九久9热| 青青青国产| 老女人爆菊| 欧美视频在线第3页| 五月天婷婷色| 蜜桃成人1区2区3区| 五月天婷婷综合| 婷婷久久久| 99性爱视频| 97五月天| 天天日老熟妇| 人妻精品综合中文字幕在线 | 啊啊啊久久久视频| 99日免费视频中文字幕| 人妻素股| 91精品91久久久久77777| 国产精品夜夜夜| 日韩BBN| 啊啊啊好大好深| 婷婷五月天激情四射| 日韩兔费看黄片| 久久精品午夜国产亚洲AV无码| 欧美日韩大香蕉| 午夜超爽| 日韩乱插| 懂色综合久久久| 久久熟妇五十路一区| 欧美A√综合网| 国产成人啪一区二区| 亚洲欧美综合图片| 蜜臀99久久| 亚洲一区二区三区不卡国产欧美| 久久直播国产| 色啪网| 亚洲不卡不卡中文字幕不卡 | 国产偷拍网站| 精品偷拍13p欧美dodk视频| 婷婷视频在线免费观看| 加勒比大香蕉视频在线| 欧美 综合| 夫妻AV网站| 欧美激情久操网| AV网站高清无码在线观看| 操美女高潮抽搐白浆| 在现视频女上位好爽| 亚洲网污污污污| 日韩99999| 婷婷在线视频在线观看| 国产一区二区啪啪视频| 国产不卡片| 伊人久久亚洲色欲综合网站| 国产久久久久久| 草草影院最新网址| 91校园春色长篇| 一本一首道人妻少妇免费久久| 91欧洲入口| 亚洲欧美国产va在线播放频| 亚洲Av无码成人精品国产| 天天看片天天爽| 色噜噜狠狠色综无码久久| 久久久新亚洲AV| 国产 三级自拍| 成人色女网| 97超碰9| 日韩激情中文字幕有码| 91女在线观看| 欧美在线亚洲| 日日操丁香五月天| 欧美熟妇精品黑人巨大一二三区| 婷婷九月丁香| 一级黄色视频网| 亚洲青青青视频在线| 大干人妻| 欧美黄片免费在线观看视频| 神马久久久久眼| 日韩内| 日本成人电影资源网| 国产精品国产自产拍高清AV| 婷婷人妻激情| 333kkkk·亚洲com久久| 精品视频97| 男人的天堂 在线一区| 一区二区三区机械有限公司| 色九九九综合| 夜夜草天天| 午夜天天碰综合视频| 96国产精品| 婷婷AV一区二区三区| 欧美日本天堂| 欧美一级美片在线观看免费| 国产精品青青草| 另类欧美色| 色一情一乱一乱一区91Av| 亚洲人精品午夜不卡| 久久精品中文字幕观看| 久超超碰| 免费1级a做爰片观看| 午夜性| 人人模人人看| 国产视频一区二区三区久久亚洲天堂| 九九九九九九九九九国产精品 | 97视频观看| 超碰97精品| 国产视频三区四区| 日韩性爱长视频免费| 国产精品老熟女一区二区| 国产一区在线看| 亚洲国男人的天堂| 中文视频在线观看| 欧美少妇一区二区三区| 国产肏逼网站| 丝袜无码a片| 激情网色| 中文字幕第95页| 人人操人人狠狠操| 91色插| 欧美美女啪啪视频| 看免费一级在线播放毛片| 91天美传媒精品| 97精品熟女少妇一区| 久久久久久久综合,国产| 黄片不用下载在线观看| 日逼97| 青青操97| 一区二区三区黄片免费观看| 性色高清..……| 激情五月天综合网| 久久精品国产Aⅴ| 久久精品视频在线观看| 无码聚合| 丝袜综合网| 神马午夜久久久| 综合欧美日韩在线观看| 久久久久白虎| 中文字幕视频2区| 93人人操人人| 亚洲高清欧美总合| 国产欧美一区二区| 国产区91柔拿会所技师| 久久线上视频免费看| 中文字幕视频2区| 国产第25页在线观看| 丝袜 中出 制服 人妻 美腿 中文字幕| 伊人亚洲国产一成人久久精品,久久| 日韩福利电影网| 免费超碰97久久| 91大学精品激情戏| A级毛片在线看免费| 99精品综合久久久久五月天| 精品国产乱码久久久久久影片| 91视频伊人| 九九九九一区| 美女97超碰| 久久激情综合| 亚洲密乳AV| 96超碰网| a片亚洲一本通视频| 9九九九九视频在线观看| 国产精品亚洲一级av第二区| 一二三区精品视频| 亚洲男人综合网| 天美av在线观看| 成人性爱高清视频免费看| 99无码狠狠久久| 日韩欧美蜜桃精品久久中文字幕久久 | 无码人妻丰满熟妇奶水区毛片| 操逼逼无码| 五码视频在线观看| 天堂性色| 青青久久久| 美骚妇av高清在线| 超碰97爽| 日本三级大片| 日韩av在线免费网站| 大屁股人妻女教师撅着屁股| 久久久极品| 十八禁电影伊人网| 四季AV一区二区凹凸精品小说| 亚洲日本成人动漫| a级理论午夜日本| 五月婷婷六月丁香网址| 亚洲国产一级黄色视频| 91综合网站| 久久爱97| 青青草原香蕉日本Ap| 欧美在线视频播放| 久久欧洲| 69AV女优男人的天堂| 蜜臀久久99精品| 91色综合激情| 偷拍欧美激情| 超碰79人人乐| 久久黄黄| 东京日日夜夜| 99操| 天天插天天插| 久久九九99| 精品久久99| 97人人操人人干| 久久精品国产免费观看99| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 影视综合无码少妇| 成人av在线播放| 亚洲密乳AV| 伊人精品久久网站| 新久久AV| 免费簧片在线观看| 亚洲二区精品在线观看| av日韩在线观看电影| 久久久久九九九| 欧美性爱伊人| 久草视频分类在线| 欧美久热| 天天日老熟妇| 动漫片子网站3黄| 亚洲另类色图片| 精品一久久久| 激情人妻另类| 天天搞欧美| 精品少妇99| 91亚洲欧美| 欧美 精品国产制服第一页| 极品综合| 欧美十八禁导航成人| 九月丁香综合网| 超碰91在线| 欧美日韩高潮喷水91| 国产13区| 国产免费一区| 亚洲精品国产拍免费91在线| 色97干| 日韩精品在线放| 日韩视频啪啪| 人妻嗯啊啊在线播放| 99爱久久视频频| 91美女看B| 91中出视频| 免费国产电影一区二区| 久久大线蕉一区| 欧洲精品欧洲精品| 91精品网站| Av手机版天堂网| 久久性爱免费送| 欧美人妻精品| 97网址97| 97视频在线看| 一区二区影院| 亚洲天堂区| 偷拍在线观看视频| 男人天堂新| 久久久久亚洲AV无码专区少妇| 欧美久久伊人| 中文字幕天天天天天| 97久久国产精品| 日本操逼视频免费| 亚洲一区二区精品福利| 麻豆蜜桃视频在线观看| 97精品久久久久中文字幕| 九月伊人中文字幕| 国产精品呦一区二区三区| 夜夜爽33333| 呦女网站| 久久性爱视频免费看| 91狼人| 9久久美女首页| 欧美综合第一页| 国产操逼逼网| 欧美一二三区四五区| 综合亚洲网| 中文字幕精品一区欧美| 爱爱60秒免费视频| 伊人久日| 日本狂喷奶水在线播放212| 人妻啊啊人妻啊| 五十路成人在线视频二区三区| 69XX一中文字幕人妻91| 日韩AV片| 日日爽熟女| 日va操| 97免费免费视频网| 欧美色网| 国产精品一二三区福利| 一二三四区操操Av| 国产一区二区精品久久99| 国产天天骚| 78久久| 丁香五月婷婷基地| 91模特在线观看| 久久riav中文精品| 97日视频| 日欧操屄| 亚洲色图 欧美热图 清纯唯美 另类自拍| 麻豆熟妇乱妇熟色A片在线看| 国产 亚洲 丝袜 制服| 亚洲情色在线| 18禁在线视频| 天天综合有色网| 亚洲无码电影久久久| 亚洲日韩AV视色| 999精品乱码| 色婷婷影视| 欧美亚洲手机在线| 一区二区激情国产熟女| 97久久超碰国产精品| 五月婷婷丁香| 日韩久射综合| 亚洲综合五月天婷婷丁香| 国产精品久久久亚洲第一牛牛_在线观看 | 色穴精品| TS人妖另类精品视频系列| 日韩偷拍色图| 91香蕉国产尤物视频| 99999久久久久9国产精品| 91肉丝| 不卡码视频| 熟女这里只有精品6| 校园春色亚洲无码| 中文字幕123| 五月天精品| 色欧美天天| 久久国产在线一区二区| 中文97国产| 超碰在线观看av不卡| 性九九九九九九| 久久xxxx| 碰碰97| 久久久久久久久久久久黄色| 人人潮人人摸| 久久天堂网| 99热精品在线观看| 黄片www视频免费| 99色日| 国产AV超爽| 国产传媒一区二区三区| 亚洲一二三精品久久网| 18禁精品网站在线看| 啊啊啊 在线| 欧美三级不卡| 日本熟女免费視颖| 天天性射网| 在线观看十八禁| 精品无码不卡视频| com 首页 18岁 禁区 女优 免费 精选 同城| 丁香五月久久| 69XX一中文字幕人妻91| 超碰欧美在线欧美| 午夜天堂精品久久久久91| 91精品人| 熟女露脸激情自拍视频| 在线黄页看毛片| 777AV电影| 亚洲色图欧美色18直播在线| 亚洲精品蜜桃久久久一区二区三区| 一级二级三级黑人无码| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚洲美女av无码| 久久偷偷色综合蜜桃| 亚洲,欧美,春色,另类| 在线色导航| 久久97精品久久久久久久不卡| 97视频在线观看高清资源| 日本韩欧美在线播放a| 强奸乱伦AV一天堂网| 久久超碰天天| 日本不卡二三区| 午夜免费视频1000| 日韩一区二区高清在线观看的| 久久啊啊啊| 精品一区99999| 久久久久久久久九九久孕交| 色墦五月丁香| 国产精品无套内谢| 亚洲乱码精品一区二区| 国产麻豆91欧美一区二区久久婷婷国产精品| 一区中文字幕二区日韩| 五月天婷婷激情| 国产浮力影院第1页| 在线毛片片免费观看| 入口操逼网站| 成人小说视频在线精品欧美| 啊啊啊啊好多水| 人妻少妇无码| 色网综合网| 69人妻精品丰满熟女区| 日韩免费人妻色情网站| 日韩婷婷| 天天日B夜夜干B时时操B| 欧美亚洲素人制服精品| 亚洲天天操| 欧美性爱一区二区三区| 色天天野狼综合社区| 蜜桃一区二区三区| 69人妻精品丰满熟女区| 欧美制服网站美腿丝袜| 狠狠五月天| 91色久| 日本一本道A级黄色毛片试看60分钟| 一本色道久久天天射天天干| 日韩97| 日韩精品人妻| 日韩啪啪视频| 欧美人妻少妇| 91丝袜美女视频| 日本女人久久久| 熟女少妇视频| 蜜臀久久久99久久久久 | 人人 操人人 操人人| 强奸抽插av| 日韩精品资源专区二区| yiqicaoav| 丰满人妻被猛烈进入中| 欧美不卡五十路| 国产在线能看的你懂的| 立川理惠被中出无码| 密乳视频在线| 欧美极品美女aaaaaa级黄片| 热99这里有精品综合久久 | 九一性生活免费视频| 丝袜亚洲91| 中文无线日韩一区| 日日AAvv| 校园春色亚洲色图| 国产9区| 一级性爱视频免费在线| 100啪啪视频大全| 91精品久久久久五月天精品| 欧美一级久久久丰满| 国产第25页在线观看| 免费毛片在线播放| 四虎AV在线观看| 欧美综合加勒比在线| 91国产美女丝袜足交精品视频 | 天天插夜夜操|