日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

Flutter實(shí)戰(zhàn):從零搭建信息流應(yīng)用,覆蓋網(wǎng)絡(luò)請(qǐng)求、緩存與狀態(tài)管理

Flutter實(shí)戰(zhàn):從零搭建信息流應(yīng)用,覆蓋網(wǎng)絡(luò)請(qǐng)求、緩存與狀態(tài)管理 1. 為什么第一個(gè)實(shí)戰(zhàn)項(xiàng)目我選了一個(gè)信息流小應(yīng)用而不是再寫(xiě)一個(gè) Todo我發(fā)現(xiàn)很多剛接觸 Flutter 的朋友學(xué)完基礎(chǔ)語(yǔ)法之后會(huì)卡在同一個(gè)地方教程里的每個(gè)知識(shí)點(diǎn)都看懂了Button、ListView、網(wǎng)絡(luò)請(qǐng)求都單獨(dú)跑通過(guò)但一說(shuō)到做個(gè)自己的項(xiàng)目就完全不知道從哪下手。這個(gè)系列就是為了解決這個(gè)問(wèn)題。這次實(shí)戰(zhàn)我給自己定的題目很簡(jiǎn)單——做一個(gè)可用的信息流閱讀應(yīng)用不做復(fù)雜特效不堆砌花哨交互但必須把真實(shí) App 的骨架搭完整啟動(dòng)頁(yè)、列表頁(yè)、詳情頁(yè)、網(wǎng)絡(luò)請(qǐng)求、加載狀態(tài)、錯(cuò)誤處理、本地緩存、下拉刷新、上拉加載、打包配置。為什么選這個(gè)方向而不是再寫(xiě)一個(gè)經(jīng)典 Todo原因很實(shí)際第一信息流是最常見(jiàn)、最不挑領(lǐng)域的應(yīng)用形態(tài)。選它能保證讀者把代碼跑起來(lái)之后能立刻想象到這東西換個(gè)數(shù)據(jù)源就能變成新聞閱讀器、商品列表、開(kāi)源項(xiàng)目導(dǎo)航。第二它天然覆蓋 Flutter 的核心知識(shí)點(diǎn)。列表渲染對(duì)應(yīng) ListView.builder網(wǎng)絡(luò)層對(duì)應(yīng) dio/http 封裝異步狀態(tài)對(duì)應(yīng) FutureBuilder以及后續(xù)的 Riverpod頁(yè)面跳轉(zhuǎn)對(duì)應(yīng)命名路由本地緩存對(duì)應(yīng) shared_preferences 或文件存儲(chǔ)。做一遍等于把 Flutter 日常開(kāi)發(fā)的高頻場(chǎng)景全部過(guò)了一遍。第三它足夠小。一個(gè)人一個(gè)周末能做出來(lái)不會(huì)因?yàn)楣こ烫蟀胪径鴱U。我見(jiàn)過(guò)太多的學(xué)習(xí)路徑是每個(gè)組件學(xué)三遍項(xiàng)目一個(gè)都沒(méi)做完整過(guò)。這次我反過(guò)來(lái)——直接開(kāi)干遇到什么補(bǔ)什么。提示這篇文章是項(xiàng)目實(shí)戰(zhàn)第一彈我會(huì)把從零到發(fā)布的全過(guò)程都寫(xiě)出來(lái)。如果你還在猶豫我現(xiàn)在水平夠不夠先別糾結(jié)完整跟一遍你會(huì)發(fā)現(xiàn)自己能走通的路比想象中長(zhǎng)。2. 開(kāi)工前我先把目錄結(jié)構(gòu)和依賴(lài)一次定好2.1 為什么一開(kāi)始就要定目錄結(jié)構(gòu)而不是寫(xiě)到哪里算哪里很多初學(xué)者最喜歡在 main.dart 里一口氣寫(xiě)五百行跑通了再說(shuō)。這種做法在五十行以?xún)?nèi)問(wèn)題不大一旦項(xiàng)目超過(guò)兩三個(gè)頁(yè)面就會(huì)發(fā)現(xiàn)自己陷入改一個(gè)變量滿(mǎn)文件搜的困境。這次實(shí)戰(zhàn)從一開(kāi)始我就把目錄按功能拆分目標(biāo)很明確每個(gè)文件只干一件事通過(guò)命名快速定位。我先定義了一個(gè)標(biāo)準(zhǔn)分層結(jié)構(gòu)lib/ ├── main.dart # 入口負(fù)責(zé)初始化 ├── app.dart # 根組件負(fù)責(zé)主題和路由 ├── constants/ # 全局常量、API地址、存儲(chǔ)key ├── models/ # 數(shù)據(jù)模型 ├── services/ # 網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)服務(wù) ├── providers/ # 狀態(tài)管理控制器 ├── pages/ │ ├── home/ # 首頁(yè)相關(guān) │ ├── detail/ # 詳情頁(yè)相關(guān) │ └── splash/ # 啟動(dòng)頁(yè)相關(guān) └── widgets/ # 通用組件這樣拆分的直接收益是等代碼量過(guò)了兩千行你仍然能在十秒內(nèi)定位出一個(gè)組件或接口的位置。后續(xù)加頁(yè)面、加功能也只是往對(duì)應(yīng)目錄里放文件不需要?jiǎng)悠渌K。2.2 依賴(lài)選型的思路依賴(lài)選型我遵循夠用、穩(wěn)定、生態(tài)好三個(gè)原則。下面是最終在 pubspec.yaml 里鎖定的關(guān)鍵依賴(lài)和選型理由依賴(lài)用途選型理由dio網(wǎng)絡(luò)請(qǐng)求攔截器機(jī)制成熟可統(tǒng)一處理日志、錯(cuò)誤碼、token社區(qū)使用量最大riverpod狀態(tài)管理編譯期安全調(diào)試友好不需要 BuildContext 就能讀取狀態(tài)適合中大型項(xiàng)目shared_preferences本地鍵值存儲(chǔ)輕量適合存設(shè)置項(xiàng)和簡(jiǎn)單緩存元數(shù)據(jù)cached_network_image網(wǎng)絡(luò)圖片緩存自帶內(nèi)存磁盤(pán)二級(jí)緩存列表圖片滾動(dòng)時(shí)省流量不卡頓flutter_screenutil屏幕適配按設(shè)計(jì)稿尺寸自動(dòng)換算省去不同機(jī)型手工調(diào)尺寸的麻煩intl日期格式化官方維護(hù)格式化相對(duì)時(shí)間很順手有一個(gè)容易忽略的點(diǎn)版本號(hào)我統(tǒng)一用了脫字符^限定大版本不鎖死具體小版本。這樣 pub get 的時(shí)候能拿到兼容范圍內(nèi)的最新版同時(shí)避免大版本升級(jí)帶來(lái)的破壞性變化。2.3 避免把依賴(lài)版本一直跟著最新走我知道有朋友習(xí)慣直接flutter pub add xxx然后一路 yes。跑是能跑但等過(guò)了兩三個(gè)月項(xiàng)目里可能會(huì)出現(xiàn)依賴(lài)間的兼容性沖突——你裝 A 的新版結(jié)果 B 的接口變了。我的做法是每次新增依賴(lài)之前先在 pub.dev 上看一眼它的更新時(shí)間、最后版本發(fā)布時(shí)間、以及 README 里有沒(méi)有提到 breaking change。穩(wěn)比新重要。3. 主題、路由、配置這幾塊決定了后面寫(xiě)代碼的手感3.1 全局主題的配置方式一個(gè)信息流應(yīng)用主題不需要復(fù)雜但配色和字體的統(tǒng)一是基本功。我在 constants 目錄下建了app_theme.dart用 Flutter 自帶的ThemeData把三套東西統(tǒng)一管理起來(lái)顏色主色、背景色、卡片色、文字主次色文本樣式標(biāo)題字號(hào)、正文行高、輔助文字顏色通用組件樣式卡片圓角、陰影、AppBar 返回按鈕風(fēng)格實(shí)際效果是頁(yè)面里幾乎不寫(xiě)TextStyle(fontSize: 14)這種散裝樣式全走主題引用。后面想要換夜間模式或者調(diào)整品牌色只改一個(gè)文件全 App 生效。這里分享一個(gè)細(xì)節(jié)很多人會(huì)在MaterialApp里同時(shí)設(shè)置theme和darkTheme但在項(xiàng)目初期其實(shí)沒(méi)必要先保證一套主題足夠統(tǒng)一比提前做多皮膚更重要。多皮膚會(huì)引入大量邊界判斷前期只會(huì)拖慢進(jìn)度。3.2 命名路由和頁(yè)面跳轉(zhuǎn)的取舍Flutter 里頁(yè)面跳轉(zhuǎn)有兩條路Navigator.push直接傳頁(yè)面實(shí)例或者用命名路由。我在這次項(xiàng)目里用了后者。routes: { /: (context) const SplashPage(), /home: (context) const HomePage(), /detail: (context) DetailPage(argument: argument), }命名路由的好處是跳轉(zhuǎn)時(shí)只需要拼字符串代碼里不會(huì)出現(xiàn)大量import頁(yè)面類(lèi)的引用而且在需要做登錄攔截、深鏈跳轉(zhuǎn)時(shí)會(huì)方便很多。當(dāng)然直接傳參數(shù)拼路由字符串有一個(gè)困擾——參數(shù)多了怎么辦我的處理方式是定義一個(gè)DetailArgument類(lèi)把列表頁(yè)傳給詳情頁(yè)的所有字段打包成一個(gè)對(duì)象路由只傳這一個(gè)對(duì)象。這樣點(diǎn)進(jìn)詳情頁(yè)時(shí)不會(huì)因?yàn)閰?shù)列表太長(zhǎng)而眼瞎。3.3 全局配置獨(dú)立成文件接口地址、緩存過(guò)期時(shí)間、分頁(yè)大小、圖片占位圖這些環(huán)境級(jí)常量我集中放在了constants/app_config.dart里。用abstract final class包一層靜態(tài)常量后面切換到正式環(huán)境只需要改一個(gè)文件里的 API baseUrl。abstract final class AppConfig { static const String apiBaseUrl https://api.example.com; static const int pageSize 20; static const Duration cacheExpire Duration(days: 1); }這個(gè)習(xí)慣再往后延伸到多環(huán)境構(gòu)建時(shí)你只需要配合--dart-define就能實(shí)現(xiàn)測(cè)試、預(yù)發(fā)、正式三套環(huán)境的切換?,F(xiàn)在先把配置文件獨(dú)立出來(lái)等于給未來(lái)留了條后路。4. 數(shù)據(jù)模型和網(wǎng)絡(luò)層先把數(shù)據(jù)能不能順暢進(jìn)來(lái)解決掉4.1 模型設(shè)計(jì)少一點(diǎn)手寫(xiě)多一點(diǎn)規(guī)范信息流應(yīng)用的核心數(shù)據(jù)無(wú)外乎一個(gè)文章摘要對(duì)象封面圖、標(biāo)題、摘要、發(fā)布時(shí)間、內(nèi)容正文。我定義模型時(shí)遵循了一條很實(shí)用的原則模型的職責(zé)只有兩個(gè)——序列化和反序列化。所有業(yè)務(wù)邏輯都不寫(xiě)在模型類(lèi)里。class ArticleModel { final String id; final String title; final String summary; final String coverUrl; final String content; final DateTime publishedAt; const ArticleModel({ required this.id, required this.title, required this.summary, required this.coverUrl, required this.content, required this.publishedAt, }); factory ArticleModel.fromJson(MapString, dynamic json) { return ArticleModel( id: json[id] as String, title: json[title] as String, summary: json[summary] as String, coverUrl: json[cover_url] as String? ?? , content: json[content] as String? ?? , publishedAt: DateTime.tryParse(json[published_at] as String? ?? ) ?? DateTime.now(), ); } MapString, dynamic toJson() { return { id: id, title: title, summary: summary, cover_url: coverUrl, content: content, published_at: publishedAt.toIso8601String(), }; } }注意幾個(gè)細(xì)節(jié)coverUrl和content我都給了空字符串兜底而不是直接as String強(qiáng)轉(zhuǎn)因?yàn)檎鎸?shí)后端返回的數(shù)據(jù)經(jīng)常缺字段空值處理不當(dāng)會(huì)在渲染層崩掉publishedAt用了tryParse加兜底當(dāng)前時(shí)間避免偶發(fā)的時(shí)間格式解析崩潰。4.2 dio 封裝把攔截器用到極致raw 的 dio 使用方式很簡(jiǎn)單但一進(jìn)入項(xiàng)目實(shí)戰(zhàn)我會(huì)立刻做一層封裝。不為了抽象而抽象而是為了三個(gè)非?,F(xiàn)實(shí)的需求統(tǒng)一設(shè)置超時(shí)時(shí)間和請(qǐng)求頭不用每個(gè)請(qǐng)求重復(fù)寫(xiě)統(tǒng)一處理業(yè)務(wù)錯(cuò)誤碼把請(qǐng)求成功但業(yè)務(wù)失敗和網(wǎng)絡(luò)異常分開(kāi)統(tǒng)一打印日志接口調(diào)試的時(shí)候用得上class ApiClient { ApiClient._internal() { _dio Dio( BaseOptions( baseUrl: AppConfig.apiBaseUrl, connectTimeout: const Duration(seconds: 10), receiveTimeout: const Duration(seconds: 10), headers: {Accept: application/json}, ), ); _dio.interceptors.add( InterceptorsWrapper( onRequest: (options, handler) { // 這里可以統(tǒng)一加 token handler.next(options); }, onResponse: (response, handler) { final code response.data[code]; if (code ! 0) { handler.reject(DioException( requestOptions: response.requestOptions, message: response.data[message] ?? 業(yè)務(wù)錯(cuò)誤, type: DioExceptionType.badResponse, )); return; } // 接口真正的數(shù)據(jù)藏在 data 里 response.data response.data[data]; handler.next(response); }, onError: (error, handler) { // 統(tǒng)一異常提示文案 handler.next(error); }, ), ); } static final ApiClient instance ApiClient._internal(); final Dio _dio; Dio get dio _dio; }這套封裝最常用的場(chǎng)景其實(shí)是后面調(diào)試階段——開(kāi)代理抓包時(shí)需要加自定義 header改動(dòng)只落在onRequest一處全 App 生效。我建議每個(gè)人在項(xiàng)目初期都做類(lèi)似封裝后面省下的時(shí)間遠(yuǎn)超前期花費(fèi)的時(shí)間。4.3 數(shù)據(jù)服務(wù)層的另一個(gè)職責(zé)把數(shù)據(jù)喂給頁(yè)面之前先處理成頁(yè)面想要的形狀有些團(tuán)隊(duì)會(huì)把 service 層做得很薄直接返回模型列表。我在這次項(xiàng)目里除了返回模型還封裝了一個(gè)重要的能力錯(cuò)誤轉(zhuǎn)換成用戶(hù)可讀的提示。比如網(wǎng)絡(luò)斷開(kāi)時(shí)Service 層會(huì)返回一個(gè)ApiException里面帶上messageUI 層拿到這個(gè)異常后直接展示在錯(cuò)誤視圖上不用做二次判斷。class ArticleService { FutureListArticleModel fetchArticles({required int page, int pageSize AppConfig.pageSize}) async { try { final response await ApiClient.instance.dio.get( /articles, queryParameters: {page: page, page_size: pageSize}, ); final listJson response.data as Listdynamic; return listJson .map((e) ArticleModel.fromJson(e as MapString, dynamic)) .toList(); } on DioException catch (e) { throw ApiException( message: e.type DioExceptionType.connectionTimeout ? 網(wǎng)絡(luò)有點(diǎn)慢請(qǐng)稍后再試 : 加載失敗請(qǐng)檢查網(wǎng)絡(luò), ); } } }這樣 UI 層永遠(yuǎn)只面對(duì)兩種結(jié)果成功拿到模型列表或者拿到一個(gè)用戶(hù)能看懂的錯(cuò)誤文案。判斷邏輯不散落在頁(yè)面各處長(zhǎng)期維護(hù)的體驗(yàn)會(huì)好很多。5. 狀態(tài)管理用 Riverpod但真正復(fù)雜的是頁(yè)面里怎么組織狀態(tài)5.1 為什么狀態(tài)管理從 Provider 換成了 Riverpod如果你早期用過(guò) Flutter 官方的 Provider能明顯感覺(jué)到它簡(jiǎn)單但也有幾個(gè)讓人別扭的痛點(diǎn)依賴(lài) BuildContext 才能讀狀態(tài)測(cè)試的時(shí)候必須包一層 Provider 結(jié)構(gòu)。Riverpod 最大的改觀是Provider 聲明和組件樹(shù)解耦了任何地方都能通過(guò) ref 讀到狀態(tài)代碼組織起來(lái)更接近依賴(lài)注入的思路。我在這次項(xiàng)目里用到的全局狀態(tài)只有兩類(lèi)文章列表的異步加載狀態(tài)、以及當(dāng)前的請(qǐng)求分頁(yè)參數(shù)??雌饋?lái)不多但 Riverpod 在處理頁(yè)面銷(xiāo)毀后狀態(tài)要不要保留這個(gè)問(wèn)題上非常順手。緩存的是 Provider 實(shí)例化的對(duì)象可以跨頁(yè)面保持這對(duì)詳情頁(yè)從列表頁(yè)讀取數(shù)據(jù)緩存很有用。5.2 AsyncNotifier 的寫(xiě)法省掉所有手動(dòng) setState我實(shí)際上用的是AsyncNotifier因?yàn)樗鸭虞d中、成功、失敗三個(gè)狀態(tài)統(tǒng)一塞進(jìn)了一個(gè)AsyncValue里。頁(yè)面里只需要看AsyncValue當(dāng)前的快照來(lái)決定渲染加載動(dòng)畫(huà)、錯(cuò)誤視圖還是列表。class ArticleListNotifier extends AsyncNotifierListArticleModel { int _page 1; bool _hasMore true; override FutureListArticleModel build() async { return _fetchPage(); } FutureListArticleModel _fetchPage() async { final list await ref.read(articleServiceProvider).fetchArticles(page: _page); return list; } Futurevoid refresh() async { _page 1; _hasMore true; state const AsyncLoading(); state await AsyncValue.guard(_fetchPage); } Futurevoid loadMore() async { if (_hasMore) { final next await ref.read(articleServiceProvider).fetchArticles(page: _page 1); if (next.isEmpty) { _hasMore false; return; } state AsyncData([...?state.value ?? [], ...next]); _page; } } }注意refresh()里我用了AsyncValue.guard而不是自己寫(xiě) try-catch這是 Riverpod 提供的便捷方法能自動(dòng)把異常包成AsyncErrorUI 層拿到它直接展示錯(cuò)誤視圖方便得很。5.3 列表頁(yè)的 UI 組裝邊角狀態(tài)幾乎比主要邏輯還多一個(gè)信息流首頁(yè)正常狀態(tài)是列表除此之外還要處理空列表、初次加載中、刷新失敗、加載更多失敗、加載到底部等狀態(tài)。大多數(shù)人寫(xiě)列表頁(yè)只放一個(gè) ListView結(jié)果一旦網(wǎng)絡(luò)慢或斷網(wǎng)用戶(hù)體驗(yàn)就很糟。我的做法是用AsyncValue.when分三路渲染再在error分支里區(qū)分是否已有歷史數(shù)據(jù)。如果當(dāng)前state.value不為空說(shuō)明是刷新失敗就保留列表并在頂部彈個(gè) SnackBar如果state.value為空說(shuō)明是首次加載失敗才展示全屏錯(cuò)誤視圖。final articlesAsync ref.watch(articleListProvider); return articlesAsync.when( data: (articles) RefreshIndicator( onRefresh: () ref.read(articleListProvider.notifier).refresh(), child: ListView.builder( itemCount: articles.length 1, itemBuilder: (context, index) { if (index articles.length) { return const _NoMoreFooter(); } return ArticleCard(article: articles[index]); }, ), ), loading: () const Center(child: CircularProgressIndicator()), error: (err, stack) ErrorView(message: err.toString()), );這個(gè)拆分是真的實(shí)用上線后愿意把列表頁(yè)做完善的人和只跑通 Demo 的人頁(yè)面的皮實(shí)程度一眼就能看出來(lái)。6. 圖片、緩存、還有那個(gè)下拉刷新的隱藏坑6.1 圖片緩存不要手寫(xiě)但要了解原理信息流頁(yè)面最容易卡的地方就是圖片。服務(wù)器返回的封面圖如果不做緩存每次滾出視野再滾回來(lái)就要重新下載基本等于災(zāi)難。這次我用cached_network_image一行代碼接入CachedNetworkImage( imageUrl: article.coverUrl, fit: BoxFit.cover, placeholder: (context, url) const ShimmerBox(), errorWidget: (context, url, error) const Icon(Icons.broken_image), )它內(nèi)部會(huì)緩存到內(nèi)存和磁盤(pán)滾動(dòng)回訪不再重新請(qǐng)求網(wǎng)絡(luò)。有一點(diǎn)必須提醒圖片占位圖不要用默認(rèn)的灰色方塊我只是寫(xiě)了一個(gè)極簡(jiǎn)的ShimmerBox一個(gè)帶淺色背景的 Container就能讓首屏加載的觀感提升一個(gè)檔次。一個(gè)背景色循環(huán)動(dòng)畫(huà)的封裝半天就能寫(xiě)好收益很值。6.2 列表詳情頁(yè)的本地緩存策略我這次給詳情頁(yè)做了一個(gè)先展示緩存、再靜默更新的策略。具體實(shí)現(xiàn)進(jìn)入詳情頁(yè)時(shí)先用文章的 id 去本地緩存找歷史記錄包括標(biāo)題、內(nèi)容、時(shí)間如果有緩存立即展示緩存內(nèi)容同時(shí)發(fā)起網(wǎng)絡(luò)請(qǐng)求拿到最新數(shù)據(jù)后刷新頁(yè)面并更新緩存如果當(dāng)前斷網(wǎng)就停在緩存頁(yè)面并提示當(dāng)前顯示的是離線緩存這個(gè)策略的代碼核心非常簡(jiǎn)單但能實(shí)打?qū)嵦嵘脩?hù)弱網(wǎng)體驗(yàn)。我用shared_preferences存緩存 JSON因?yàn)樗钱惒降?、開(kāi)銷(xiāo)小詳情頁(yè)數(shù)據(jù)這種單條對(duì)象用鍵值存儲(chǔ)足夠了。class DetailCacheService { static const String _keyPrefix detail_; final SharedPreferences _prefs; Futurevoid save(String articleId, ArticleModel article) async { await _prefs.setString(_keyPrefix articleId, jsonEncode(article.toJson())); } ArticleModel? read(String articleId) { final raw _prefs.getString(_keyPrefix articleId); if (raw null) return null; return ArticleModel.fromJson(jsonDecode(raw) as MapString, dynamic); } }如果換更大的項(xiàng)目建議改成數(shù)據(jù)庫(kù)或文件存儲(chǔ)一兩個(gè)頁(yè)面用 prefs 清爽夠用。6.3 下拉刷新的一個(gè)隱藏坑Flutter 的RefreshIndicator默認(rèn)嵌套在ListView里很順暢但有一個(gè)常見(jiàn) bug當(dāng)列表內(nèi)容不滿(mǎn)一屏?xí)r手勢(shì)下拉經(jīng)常觸發(fā)不了刷新。原因是ListView默認(rèn)只要內(nèi)容不到一屏就沒(méi)有足夠的滾動(dòng)空間下拉手勢(shì)會(huì)被識(shí)別成普通滑動(dòng)。解決辦法是給ListView加一個(gè)AlwaysScrollableScrollPhysics()ListView.builder( physics: const AlwaysScrollableScrollPhysics(), itemCount: articles.length 1, ... )這個(gè)小改動(dòng)如果你不提前知道真機(jī)調(diào)試時(shí)會(huì)覺(jué)得明明寫(xiě)了 RefreshIndicator 為什么拉不動(dòng)特別浪費(fèi)時(shí)間。7. 詳情頁(yè)、路由參數(shù)和返回刷新平時(shí)最容易忽略的聯(lián)動(dòng)邏輯7.1 詳情頁(yè)布局與生命周期詳情頁(yè)的布局相對(duì)簡(jiǎn)單頂部標(biāo)題、作者和時(shí)間、封面大圖、正文文本。但有一個(gè)業(yè)務(wù)細(xì)節(jié)值得注意詳情頁(yè)可能會(huì)從列表頁(yè)進(jìn)入也可能從收藏列表搜索頁(yè)進(jìn)入。不管從哪進(jìn)詳情頁(yè)都需要知道自己展示的是哪篇文章。我在前面提到過(guò)用一個(gè)DetailArgument打包參數(shù)class DetailArgument { final String articleId; final String title; final String coverUrl; const DetailArgument({ required this.articleId, this.title , this.coverUrl , }); }跳轉(zhuǎn)時(shí)Navigator.pushNamed(context, /detail, arguments: DetailArgument( articleId: article.id, title: article.title, coverUrl: article.coverUrl, ));詳情頁(yè)拿到articleId之后先裝飾性地展示傳入的標(biāo)題和封面讓用戶(hù)感覺(jué)頁(yè)面秒開(kāi)再實(shí)際請(qǐng)求正文內(nèi)容請(qǐng)求回來(lái)后再替換成完整數(shù)據(jù)。這比進(jìn)入詳情頁(yè)轉(zhuǎn)圈等接口的體驗(yàn)好太多。7.2 詳情頁(yè)返回列表頁(yè)時(shí)的狀態(tài)保留有時(shí)候用戶(hù)從列表點(diǎn)進(jìn)詳情在詳情頁(yè)喜歡了某篇文章回到列表時(shí)希望能反映這個(gè)狀態(tài)。我這次把喜歡狀態(tài)放在 Riverpod 的全局 Provider 里而不是 DetailPage 的局部 State。這樣詳情頁(yè)更新了喜歡狀態(tài)列表項(xiàng)通過(guò)監(jiān)聽(tīng)同一個(gè) Provider 自動(dòng)刷新。final favoriteIdsProvider StateProviderSetString((ref) String{});列表頁(yè)的 ArticleCard 用ref.watch(favoriteIdsProvider.select((v) v.contains(article.id)))來(lái)決定紅心是否點(diǎn)亮。返回列表時(shí)不用手動(dòng)刷新任何東西狀態(tài)天然同步。這是狀態(tài)管理分離 UI 和邏輯之后最爽的一點(diǎn)。8. 調(diào)試技巧、打包配置、以及我在這個(gè)項(xiàng)目里最想分享的三句話8.1 日志與調(diào)試Flutter DevTools 是神器聯(lián)網(wǎng)應(yīng)用調(diào)試時(shí)最剛需的是看請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)。dio 自帶的LogInterceptor在 debug 模式開(kāi)起來(lái)就夠了if (!kReleaseMode) { _dio.interceptors.add(LogInterceptor(responseBody: true)); }真機(jī)調(diào)試時(shí)我最常用的工具是 Flutter DevTools 里的 Network 面板和 Inspector。前者能看請(qǐng)求耗時(shí)和數(shù)據(jù)體后者能實(shí)時(shí)查看 Widget 樹(shù)排查布局溢出非常直觀。開(kāi)發(fā)時(shí)發(fā)現(xiàn)渲染問(wèn)題先打開(kāi) Inspector 看父級(jí)約束一大半問(wèn)題當(dāng)場(chǎng)就能定位。8.2 Android 打包的配置要點(diǎn)先用flutter build apk --release打出安裝包前有幾步別漏確認(rèn)ApplicationId改成自己的包名在AndroidManifest.xml里給發(fā)布版本加好網(wǎng)絡(luò)權(quán)限默認(rèn) debug 有release 可能沒(méi)開(kāi)如果用了網(wǎng)絡(luò)明文地址Android 9 以上系統(tǒng)默認(rèn)禁止明文 HTTP需要配置usesCleartextTraffictrue或者做網(wǎng)絡(luò)安全配置。一個(gè)小細(xì)節(jié)發(fā)布前把a(bǔ)ndroid/app/build.gradle里的minifyEnabled保持默認(rèn) false。Flutter 的 release 構(gòu)建體積本來(lái)不小開(kāi)啟混淆并不能像原生那樣顯著瘦身反而可能引入 runtime 問(wèn)題新手期沒(méi)必要碰。8.3 iOS 與 macOS 環(huán)境的注意點(diǎn)如果你主要在 Windows 上開(kāi)發(fā)最后需要一臺(tái) macOS 來(lái)打包 iOS 版本。這點(diǎn)我在項(xiàng)目開(kāi)始就提醒了Flutter 項(xiàng)目跨端能力確實(shí)好但 Apple 平臺(tái)的構(gòu)建環(huán)節(jié)繞不開(kāi) macOS。提前確認(rèn)好公司/團(tuán)隊(duì)有沒(méi)有 Mac再?zèng)Q定最終交付哪幾個(gè)平臺(tái)。也可以在項(xiàng)目早期就把 iOS 目錄生成好避免后面想發(fā) iOS 還得回來(lái)補(bǔ)配置。提示我在實(shí)戰(zhàn)中踩過(guò)一個(gè)特別無(wú)腦的坑——用flutter create .時(shí)沒(méi)有先生成 iOS 目錄結(jié)果真正要發(fā) iOS 時(shí)補(bǔ)生成導(dǎo)致丟了一些平臺(tái)特有配置。項(xiàng)目創(chuàng)建時(shí)就把所有目標(biāo)平臺(tái)的目錄一次性生成之后不想要可以刪但別等要的時(shí)候再補(bǔ)。8.4 三句實(shí)操心得第一項(xiàng)目實(shí)戰(zhàn)的進(jìn)度不取決于你會(huì)多少而取決于你能不能把一個(gè)功能從網(wǎng)絡(luò)走到界面完整跑通。比起反復(fù)研究十幾個(gè)包不如把一兩條數(shù)據(jù)流徹底打通。第二處理異常時(shí)的體驗(yàn)決定了別人愿不愿意持續(xù)用你的 App。網(wǎng)絡(luò)錯(cuò)誤頁(yè)面不能只顯示一串英文異常至少提供重試按鈕加載失敗時(shí)要保留上次數(shù)據(jù)而不是直接白屏。這套邏輯在初期就要寫(xiě)進(jìn)列表頁(yè)模板里后面每個(gè)頁(yè)面都復(fù)用。第三從一開(kāi)始就給工程留一層替換的余地。數(shù)據(jù)源的替換、接口的替換、ui 主題的替換分別隔離到 service、provider、theme 三層里。這個(gè)項(xiàng)目未來(lái)不管是接入真實(shí)后端、改成別的題材還是派生出新 App都會(huì)變得非常輕松。9. 關(guān)于這個(gè)項(xiàng)目的后續(xù)擴(kuò)展信息流只是骨架到這里第一個(gè)實(shí)戰(zhàn)項(xiàng)目的核心流程已經(jīng)完整走通了啟動(dòng)頁(yè)加載、首頁(yè)列表、網(wǎng)絡(luò)異常處理、詳情頁(yè)緩存、下拉刷新、返回聯(lián)動(dòng)狀態(tài)、打包發(fā)布的前置配置。說(shuō)實(shí)話這個(gè)骨架的復(fù)用性比我做之前預(yù)想的還要高。我真切建議你把這份代碼跑起來(lái)之后試著做三個(gè)方向的擴(kuò)展把數(shù)據(jù)源從模擬接口換成本地 JSON 或真實(shí)后端給列表加上分類(lèi) tab加一個(gè)簡(jiǎn)單的搜索頁(yè)。每一件事都不會(huì)動(dòng)搖已經(jīng)搭好的架構(gòu)——這就是分模塊帶來(lái)的底氣。如果你碰到與文章里不同的報(bào)錯(cuò)或現(xiàn)象大概率出在環(huán)境版本上。優(yōu)先確認(rèn)三樣?xùn)|西Flutter SDK 版本、dio 版本、Riverpod 版本。版本組合不同API 細(xì)節(jié)會(huì)有差異但整體思路完全一致。下次實(shí)戰(zhàn)我準(zhǔn)備把登錄流程和 token 刷新、本地?cái)?shù)據(jù)庫(kù)、通知推送這幾個(gè)更貼近商業(yè)項(xiàng)目的模塊拆開(kāi)講到時(shí)候再繼續(xù)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美在线天堂| 大色综合网| 99精品在线| 97频视在线| 91东北熟女| 91精品丝袜在线观看| 久操av在线| 亚洲国产成人福利在线观看| 免费看污网站| 欧美91在线| 天天综合,91综合永久| 清纯唯美综合亚洲| 婷婷色导航| 国产欧美日产一区二区三区 - 国产欧美日| 亚洲啪啪视频免费| 午夜成人福利影视| 四虎国产精品永久在线囯在线| 美女诱惑爱爱| 日韩国产精品人妻无码久久久| 91啪啪视频| 人妻激情在线视频| 自拍鲍鱼一区在线高清观看免费| 综合网 欧美| 91蜜臀在线久久久久| 91高潮| 丁香婷婷啪啪| 啪啪性爱免费视频| 伊蕉97蜜桃97狠狠综合干| 亚欧性爱无码| 中文字幕无码不卡啪啪| 午夜精品视频777| 亚洲狠狠入| 国产精品免费视频不卡| 日本爽爽爽爽爽爽免费视频| 亚洲精品欧洲精品| 国产精品成人福利在线| 国产日韩美女小穴视频网站不卡| 蜜桃臀av在线观看| 激情小说图片亚洲首页| 亚洲色丰满少妇高潮| 国产九九九九九九九九| 精品免费囯产一区二区三区| 亚洲男人天堂Av| 九九九九热| 殴美,日韩国产伦精品| 久久78| 99re3这里只有精品| 欧美一区二区日韩三区| 蜜桃臀久久| 欧美综合站| 国产兽交视频在线播放| 日韩特一级久久| 一区二区三区网站日日骚| 12一15性XXXX粉嫩国产| 久久综合av| 亚洲图片偷拍视频区| 91亚洲综合在线| 牛牛久久国产精品视频一二三| 福利伊人玖玖国产| 搡老女人老91二区| 日韩图区| 日韩国语字幕| 日韩A优精品在线观看| 一级AAA片一区二区三区| 无码99| 性在久久久久久| 密臀在线一区尤物| 蜜臀久久久| 日本高清一区二区在线| 操国产逼| 躁躁躁日日躁2020| 超碰午夜| 欧亚日韩三区| 成人精品视频一区二区| 久久久久国产一区二| 欧美少妇人妻| 在线色资源| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 五月婷婷激情| 免费啪啪一级视频| 蜜乳视频网站| 天天拍夜夜| 欧美高潮| 超碰97亚洲区| 麻豆性爱视频在线播放| 欧洲射精91| 婷婷五月天激情网| 在线国产一区二区av| 国产午夜精品理论片a大结局| 伊人亚洲综合| 超碰碰激情97+久| 亚洲情色电影网| 日韩成人性爱AV| 看免费的黄片| AV麻豆免费一区| AV色女综合| 搡老女人老91妇女熟女| 99综合自拍| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 欧美成人一区二区| 韩国三级三级BD在线| 中亚av| 亚洲AV成人无码久久精品播放| 国产91亚洲精品一区二区三区| 天天欧美| 99操逼| 亚州欧美综合| 校园春色家庭伦理欧美激情| 97一区二区三区视频| 青青草视频在线观看一区二区| 粉嫩国产精品久久粉嫩| 99热伊人| 麻豆精品久久久久久久| 日本天天吊| 欧美一区91大爱| 久久99亚洲精品久久99果| 国产高清精品福利| 日韩AV一起草| 国产又粗又长又爽又色| 99色在线| 综合熟女| 综合色图区| 中文字幕一区日韩精| 国产日本久久免费精品| 日本在线播放不卡一区| 大香蕉综合| 开心五月深爱五月| 亚洲老熟妇xxx| 男人的天堂2018东京热啪啪啪| 99色色网| 啊啊啊啊啊啊在线看| 97视频网站在线观看| 色五月婷婷麻豆在| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 色色色热| 欧美熟女少妇| 亚洲限制级| 男人的天堂日本东京热| 国产精品第一页国产大屁股视频免费区i| 中文字幕久久精品一区| 校园春色美腿丝袜 | av网站国产主播在线| 免费操逼91| 国内毛片欧美香蕉精品| 中文字幕日韩人妻视频一区二区三区| 色婷婷五月综合激情中文字幕| 国产免费一区在线观看| 韩国久久97| 九九九九88| 久久久久久久78| 嗯嗯啊好大| 婷婷激情五月综合| 精品九九九| 亚洲国产精品成人综合| 日韩免费大片一级播放| 69人妻人人揉人人躁人人精品| 91成人在线| 伊人久久亚洲中文字幕不卡| 国产精品白丝AV| 天天久久| 被男人添B超爽视频| 亚洲美女自拍偷拍视频| oumeisetu综合| 色女99一级片在线观看| 香蕉免费一区二区三区不读| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | av橘色网站| 亚洲欧美洲综合| 一区二区三区免费视频入口| 国产综合操逼高清| 国产精品久久9| 亚洲欧美setu| 亚洲熟女av中文字幕| 国产亚洲深夜激情| 日韩一级片在线看| 国产精品天干天干综合网麻豆| 91日产桃蜜| 国产美女自拍AV| 动漫爆乳3D奶水一区在线观看| 久久久久久夜夜夜夜夜| 日本性一区| 日韩性爱小视频| 福利伊人玖玖国产| 日欧美色| 日韩欧美女求操每天更新| 日本三级A片网站com| 黑人黄片在线免费观看| 人人澡人人弄| 久久精品一区二区三区四区五区| 97精品综合久久| 美腿丝袜高跟网免费视频免费视频| 国产精品3| 日韩 国产 欧美自拍| 一级久久性爱视频| 亭亭在线资源| 欧美高清无码免费视频高清版| 午夜高清成人在线视频| 日本A级视频| 91老司机在线| 丁香婷婷久久| 一二三四区电影| 在线综合 亚洲 欧美中文字幕| 亚洲人妻AV| 欧美日韩人妻婷婷一区| 日韩有码 一区二区三区| 国内精品久久久久影院亚洲| 热的中文 热的有码 热的国产| 91操操操操| 日韩精品一区二区三区四虎影视| 亚洲中文字幕久久无码精品| 强奸国产在线| 日本天天干天天搞一区| 国产精品日本无码A片| 五月天社区| 日韩欧美久久婷婷网站| 国产麻豆福利av在线播放| 五月天伊人| 96精品久久久久久久久| 最新欧洲欧美日本激情网站| 欧美第五页| 日韩人妻 中文字幕| 亚洲国产一级中文综合久久天堂在线免费观看| 欧美色另类| 九九色精品| 亚洲欧美综合网站| 另类 日韩 熟女| 一本久久精品中文字| 黄色片一区二区三区四区五区| 2025亚洲男人天堂| 极品销魂美女一区二区| 熟女一区二区| 精品无码欧美三级| 亚洲aw毛茸茸在线| 欧美一级AAAAAAA| 殴美日韩m| 久久精品国产Aⅴ| 欧美大码在线视频| 精品国产一区二区三区在线播出| 天天插夜夜爽| 中日韩久久久| 欧美日韩97在线| 国产激情在线| 天天综合网~91| www激情| 久久精品国产亚洲av水密被窝| 不卡啪啪视频| 人妻一区二区三区熟女| 东京太热久久久| 天天澡天天狠天天天做| 欧美中字二区| 久久久国产亚洲精品系列| 久久久噜噜噜久久人妻| 亚洲啪啪性视频| 久久久久久人| 麻豆婷婷成人一二三| 囯戸精品高潮呻吟旡码| 久久久久久裸体| 任你爽视频| 中日韓欧美高清| 18精品一区| 嗯啊视频免费在线观看| 91亚洲黄色网| 天天干2019| 人妻一二三区| 男人综合网| 欧美日日夜夜| 立川理惠无码一区二区| 日韩欧美日韩| 96久久久精品| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴| 久久久九九九| 91爱欧美| 婷婷激情啪啪| 亚洲第一精品在线视频| 亚洲中文sv| 中文字幕国产精品1区| 国产精品爽爽v| 97中文综合| 欧美有码亚洲中文字幕一区二区三区四区| 中文字幕日韩人妻视频一区二区三区| a啊啊啊啊啊啊啊啊一区二区| 狠狠久久四虎| 国产精品免费视频人成| 亚洲最新Av| 亚洲日韩东京热一区| 日本三级中国三级99人妇网站| 国产精品不卡一区二区电影| 亚洲影视第一页| 久久9 9 9精品| 国产网红精品| 91中出| 91天天综合在线观看| 亚洲AV乱码专区国产噜噜亚洲| 久热香蕉精品在线视频| 日韩国产精品人妻无码久久久| 韩日精品福利视频一区不卡在线免| 久久婷婷六月综合| 国产精品美女久久久久AⅤ国产馆| 99少妇| 伊人网在线视频| 日本三级久| 午夜理论片在线观看免费| 国产精品久久久啊| 中文字幕一区二区三区人妻不卡 | 亚洲美乱| 秋霞视频一区二区 | 亚洲激情欧美色图| 亚洲美女 晚间男人天堂| 99在线免费视频| 亚洲AV操| 国产精品无码av| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 91深夜夜| 不卡av在线中文字幕| 国内伊人久久久久久网站视频| 欧美洲精品一级| 乱老熟女一区二区三区| 少妇国产不卡| 女人的久久久| 另类欧美| 综合久久9| 日本操逼视频不卡直接放| 国产精品视频白浆免费| 国产品精品自在在线午夜免费| 综合欧美日韩在线| 殴美日韩m| 人妻激情偷乱视频一区二区三区 | 在线中文字幕| 久操视频在线观看| 久伊人网78| 久久精品高清无码一区| 农村妇女精品一区二区| 亚洲91亚洲| 素人美腿视频网站| 91oumei| 激情小说成人日本无码一| 日B操| 国产真实子伦对白| 天天干天天操天天操夜夜操天天操 | 综合久久99亚洲人妻中文在线| 国产老熟女| 青青欧美在线| 自拍视频一区在线观看| 熟妇色99| 亚洲天堂 视频你懂的| 精品无码一二三四区| 手机av天堂久久久久| 志村玲子视频一区二区| 日本青青草在线| 中文字幕一区二区三区人妻少妇在线| 女一区二区| 婷婷色香| 国产视频第2页| 亚洲成人妻日韩在线| 干B| 91欧美www| 亚洲熟女综合一区二区| 快灬快灬 一下爽蜜桃在线观看| 欧美韩日精品99综合| 清纯唯美综合| 偷拍精品一区二区三区| 国产综合色精品在线观看| 亚洲视频中文一区| 九九热三级片| 一起草av| 欧洲亚洲人妻无码高清久久三区四区| 91色综合色| 91亚.色| 9久综合网| 久久午夜伦| 日韩中文字幕二区| 日本91白丝| 亚洲熟妇熟在线电影视频| 欧美在线啊啊啊| 国产第11页| 91久久精品美女高潮喷水| 在线二区不卡| 啪啪啪东京| 国产AV激情无码久久无码| av中亚| 久久久久免费少妇| 男女一级A片大黄,一进一出| julia国产在线 | 精彩久久中文| 丰满人妻av一区二区三区| 91少妇香蕉久久精品| 91精品人妻啪啪间| 91亚洲欧美激情| 91AV入口| 91精品无码人妻系列| 美日韩成人| 丝袜综合| 青青草国产欧美非洲黑人| 三级精品三级在线观看| 欧美v亚洲v日韩v最新在线二区 | 欧美一区二区日韩传媒搭讪精品| 色777999综合| 欧美久久九九| 亚洲 日韩 欧美 国产综合体| 330dv亚洲成年视频网| 亚洲欧美精品一区天堂久久 | 欧美性高潮| 蜜乳成人AV| 国产AV高清AV无码| 欧美熟妇人体| 男人天堂新| 亚欧视频在线| 国产黄色动态精品| 91制服丝袜中文字幕| 大香蕉www.超碰| 婷婷五月天补不补| 欧美成人精品一区二区男人蜜臀| 欧美日韩大黄片| 99热官网| 亚洲一区二区中文字幕| h无码动漫在线观看| 一色网男人的天堂| 九九九九热只有精品| 亚洲h片在线免费观看| 九九无码久久精品视频| 婷婷10月天青娱乐| 国产成人bd在线观看| 中文字幕在线观看网页| 精…码一二三区| ?亚洲伊人伊成久久人综合网| 亚洲成人精品久久久| 色97干| 熟女突然公开看18禁影片| 干B| 亚洲日韩精品久久久久一区壹牛| 夜夜操二区| 欧美后入式| 日本视频在线观看污污污| 久草婷婷| 亚洲97成人在线观看| 久久久久久久极品香蕉视频| 9Ⅰ老熟女| 插欧洲美女欧美精品| 香蕉免费一区二区三区不读| 日本熟女免费視颖| 操死我了嗯嗯嗯| 欧美性生活男人的天堂| 国产精品久久发布| 国产精品日本无码A片| 亚洲情色电影网| 偷拍盗拍亚洲色图图片| 日本三级久| 色香欲综合| 天天干少妇| 啊啊啊好大好深| 激情小说五月天| 国产一区二区在线看| 久久欧美性爱视频| 精品国产乱码久久久久久久久久毛片| 国产精品99久久久www| 人妻大香蕉| 亚洲精品日日夜夜52| 在线播放中文字幕| www.91色| 凹凸精品熟女在线观看| 九九视品黄色| a片 xxxx受爽视频| 91暧暧| 久久久99免费| 国产精品天干天干综合网麻豆| 一区二区三区亚洲| 欧美综合传媒| 婷婷啪啪| 婷婷超| 97爱亚洲综合色| 国产亚洲女v在线观看| 久热大香蕉网站| 日本亚洲熟女视频| 欧美在线天堂| 亚洲色9| AV网站高清无码在线观看| 色五月激情AV在线| 午夜大香蕉| 日韩无码一级黄色av片| 99精品丰满人妻| 手机看片1024你懂的国产| 蜜桃臀av一区二区| 熟妇视频一区二区三区在线观看| 精品高清一区二区三区三州| 亚洲狠狠入| 青青草密桃在线播放| 国产强奸AV在线| 天天综合网~91入口| 亚洲精品aa久久伊人| 日本一二三免费久久| 无码人妻一区二区一牛影视| 色五天伊人| 插插综合网天天影视网| 亚洲人在线成线成人| 亚洲1区2区三区高清中文字幕| 深夜激情| 99青青草国产视频| 欧美日韩第一页| 91综合色噜噜| 综合网亚洲1| 在线啊啊啊啊| 亚洲偷拍自拍在线视频| 国产区日韩区在线观看| 日韩成人人妻网站| 日本一二三高清| 日韩乱码av| 精品久9| 东北女人的毛片| 高清国产av无码| www.色吧5.com| 丝袜视频网国产90| 午夜天堂精品久久| 丁香六月激情| 色嗨嗨在线| 放黄片放3级黄片没穿衣服| 亚洲污污网站| 有码免费观看| 色综合久久888| 国产AV色黄看到爽| 日本色日夜干| 欧美色爱综合| 粉嫩小泬久久久一区二区| 日韩精品 资源| 人人摸人人摸人人干| 中文字幕在线免费观看2| 九九久精品| 夜夜福利| 激情图片伦理国产一区二区日韩| 久久激情网| 日韩欧美中文| 一级性爱啪啪视频| 亚洲精品国产精品成人| 欧美激情在线观看视频| 国产精品动态一区二区三区四四| 99热导航| 丝袜喷水在线| 九九热精品在线| 99ri精品| 日韩性爱视频免费在线| av午夜影院在线播放| 很很操在线| 97伊人网| 亚洲高清欧美总合| 91精品久久久久久| 国产丸一视频| 青青欧洲黑| 欧美精品 - 91爱爱| 人人喜人人妻| 亚洲色图久久成人| 女优视频第10页| 99精彩视频| 久久曰曰| 综合久草| 国产精品久久久久999| 欧美色66| 中文字幕88av在线| 逼操网站| 欧美色老汉| 加勒比性爱成人在线| 九九国产| 日韩八十路老熟女| 久久精品日韩专区免费观看| 另类欧美| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 搡老女人老91二区| 亚洲欧美情色| 国产午夜在线观看| 强奸抽插av| 婷婷干黄色| 免费啪啪av| 欧美,日韩综合久久| 国产中文大片资源中文字幕| 亚一综合久久久久久久久久| 91天堂色男人的天堂| 久久久久久AⅤ无码免费肉站| 亚洲精品aa久久伊人| 99热这里只有精品地址| 五月婷丁香| 美女露胸露奶头| 操b网站亚洲无码| 91路www| 亚洲AV色图一区| 日韩无码人妻中字久久三区四区| 大香蕉中文在线| 欧美v日韩v亚洲v最新在线| 肉动漫无遮挡h在线观看| 综合影院永久入口国产| 日韩在线性爱免费视频| 国产情侣自拍在线播放| 偷拍 精品另类 凸凹了四区| 天堂国产AV| 97视频在线视频| 九九九九热只有精品| 久久一区二区三区四区五区| 国产精品第一区第一页| 开心五月婷婷激情| 福利社区午夜一区二区| 亚洲精品日韩国产欧美| 啊啊啊啊嗯嗯嗯用力好爽| 骚乳在线| 青青草日韩免费观看高清在线| 九九九国产精品| 欧美成人性活片| 五十路六十路七十路熟婆| 在线强奷到舒服的无码视频| 亚洲欧美精品91| 久久久婷婷| 自拍啪啪视频| 2017av无码免费无线播| 肉嘟嘟www视频在线观看高清| 久久精彩免费视频| 欧美大香蕉97| 超碰97综合在线| 一个色导综合| 婷婷五月天久久久| 2000亚洲男人天堂| 丰满人妻一区二区三区免费 | 探花精品视频| 久久精品72| 美女黄页网站| 乱伦1色页| 中文字幕二区日韩天堂| 精品欧美日韩在线观看| 很很操在线| 中文字幕一区二区三区视频播放| 久久99手机免费视频| 上床啊啊啊| 欧美成人AⅤ大片在线观看| 欧美日日网| 久久精品无码熟妇一区二区三区视频导航| 精品日韩人妻视频| www.夜夜操| 亚洲人久久久网| 欧美乱伦专区| 老子午夜伦不卡影院| 欧美色五月| 五毛骚逼极品美女怕怕| 中文字幕人妻资源在线| 九九成人视频| 四虎免费在线播放| 精品国产一区二区三区香蕉欧美| 亚洲欧洲小说图片视频 | 91天天综合在线观看| 色黄污美女啪啪啪免费网站| 国产成人精品日本亚洲语言 | 午夜超爽| 视频在线观看一二三区| 青青草原香蕉日本Ap| 91性感在线| 91另类| 六月婷婷色综合| 欧美色综合图片| 91亚洲色人| 三级片大波波| 天天澡天天狠天天天做| 五月天激情婷婷| 99草精| 美女黄频a美女大全免费皮| 亚熟hd视频在线| 亚洲精品白浆高清久久久久久| 日韩国语字幕| 精品国产乱码久久久久久蜜臀| 国产热RE99久久6国产精品首| 亚洲超碰综合网| 天天操天天射天天日| 婷婷情色五月天| 欧美18老人禁| 丝袜喷水在线| 操逼无码操逼| 久久精品老司| 人人做天天爱| 夜夜狠狠躁日日躁色视频| a级免费在线观看| 美日韩一卡二卡三卡免费人妻精品| 天天日天天干少妇日| 嗯嗯嗯好爽| 国产一国产一级毛片古装| 97精品国产97久久久久久| 天天综合网~91| 国产精品青青草| 婷婷超| 操b网站亚洲无码| 欧美 日韩 亚洲 春色| av72网| 人妻系列无码专区中文有码| 十八禁电影伊人网| 亚洲操人| www国产精品| 欧美亚洲性爱一区二区| 久久亚洲国产成人| 亚洲天天影视综合网| 人妻少妇被猛烈进入中| 91无码人妻| 日本在线视频导航| 久久人| 爱干爱射网啊啊啊| 熟女乱伦A| 久艹99| 婷婷五月丁香五月| 日本久久女同性恋视频| 99在线观看无大码| 黄色小视频日本txt| 蜜区区视频79| 超碰激情808| 插穴性爱视频在线观看| 97中文综合| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 午夜久久一区二区无码中出| 国产探花日韩援交| 福利五区| 亚洲一区二区三区久久 亚洲一区二区| 中文字幕丰满人妻日本| 中文幕97| 丁香五月激情啪啪| 强奸乱伦AV一天堂网| 激情小说亚洲图片| 丁香激情五月| 久久久久久亚洲Av无码| 色香网| 宅男91视频在线播放| 人人人人插| 97干在线视频| 国产熟女精品区| 99这里有精品| 被男人添B超爽视频| 欧美BT 亚洲色图| 97青娱乐超碰久久| 91free福利| 欧美不卡在线一区二区| 91欧洲入口| 色婷婷综合久久中文字幕雪峰| 国产精品视频白浆免费| 亚洲国产美女久久久久| 欧美激情亚洲情色| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 国产白丝在线| 五月开心网| 熟女五十路一区二区三| 亚洲影视综合| 操91| 97人亚洲综合字幕| 国产伦精品一区二区三区在线观| 激情黄色片在线观看| 久久久性少妇| 国产精品视频| 精品91摸| 啪啪啪综合网| 九月丁香综合网| 亚洲欧美日韩制服另类| 国产精品一区二区三区在线| 96国产污污污丝袜| 天天肏美女| 日本三级中国三级99人妇网站| 精品国产一区二区三区香蕉欧美| 69精品| 国产白丝网站| 99国产精品自在自在| 久久成年精品| 日韩女优中文字幕| 婷婷香蕉| 欧美特大黄一级片片免费| 18啪啪手机免费性爱| 夫妻天天操岛国视频| 九九九九九九综合| 嗯嗯啊啊的视频| 污污污8888| 亚洲精品欧美专业| 97网址www| 性站| 国产丝袜视频| AA丁香综合激情| 日韩黄色成人性爱| 日本一区二区做爱的视频| 日本五区不卡| 日韩久久激情精品| 色五月AV| 老熟女综合| 人妻第一页| 久久国产精品视频| 人澡逼| 亚欧洲一区二区视频| 国产天天看| 人妻精品一区二区全免费| 国语人妻精彩刺激| 人妻天堂综合网| 日本大片日本一区二区免费高清| 欧美一区二区亚洲天堂| 欧美成人黄网色网站| 粉嫩av在线一区二区| 日逼国产| www.人人cao| 97最新在线播放视频| 日韩去日本高清在| 亚洲欧美国产日本一区二区三区| 午夜黄色免费在线观看| 在线v中文字幕一区二区三区| 国产精品成人无码av无码免费| 中国国产精品一区视频| 亚州一区二区成人片免费| 国产乱伦亚洲| 不卡一区二区日本视频| 亚欧无码在线| 国产成人自拍视频在线| 91精品久久久久久77777| 久久99综合| 水澄无码AV| 色噜噜国产在线| 亚州色图狠狠干| www.AV有限公司一区| 欧洲自拍色图gif在线| 亚州国产成人精品女人久久| 精品少妇高潮久久| 日韩15p| 色呦呦国产精品免费看| 亚洲无码太久| 亚洲一区二区精品福利| 激情四射五月天| 91天天日| 亚洲欧洲第二视频在线观看色图| 老鸭窝日丰县女人| 本道综合精品| 在线播放成人高清免费视频| 乱伦1色页| 久久婷婷伊人| 一区二区首页| 91黑丝操| 91色狼| 日韩综合成人免费视频| 8050午夜少妇无码| 狠狠狠狠狠| 成人综合视频久久| 天天操熟妇| 啪啪啪综合网| 国产亚洲精品农村妇女| 乱老女人一区二区视频| 亚洲情色五月天| 中文字幕一区二区三四五区日日骚| 中文字幕第二页| 91丨国产丨白浆秘 洗澡动漫| 这里只有精品视频在线观看麻豆| AV中文在线| 日韩三级在线观看mp4| 久久亚州大香蕉| 国产女大学生AV| 欧美性爱中文字幕无线码| 丁香激情五月天| 粉嫩AV输入| 玖玖久久久| 最新三级网址| 花野真衣| 91亚.色| 日本人妻伦在线中文字幕| 欧美顶级黄片AAAAA在线免费看| www.操| 欧美狠狠狠| 日韩中文字幕精品一区在线| 五月婷婷大香蕉| 精品人妻一区二区三区视频| 欧美色院| 自拍偷拍2025在线观看| 久久亚州高清| 日日骚网站| 人人操人人插人www| 欧美天天拍| 97精品视频在线播放| 亚洲欧美色图小说| 天天综合色| 美女网站黄页| 成人av在线播放| 天天爽天天操| 中文日韩欧美熟| 国产精品久久久久久高清无码免费看| 综合啪啪| 欧美高潮| 一区不卡在线观看av| 亚州伊人色综台| 国产2.3.4区| 国产自产一区视频在线| 欧美成不卡网| 色婷婷一区二区三区久久| 亚洲无码一区二区三区三州| 都市激情人妻一区二区青青操视频| 9久精品| 久久五月视频| 99re在线视频这里只有精品| 嫩呦国产一区二区三区AV| 九九九九88| 一区二区影视| 97色干| 91综合天天看| 国产懂色精品国产av| 中国小夫妻勾搭露脸淫荡对白 | 又粗又长又爽在线观看| 夜夜爽妓女| 精品国产乱码久久久久久蜜臀| 女人高潮大叫一级毛片| 久操影视| 青青久久手机线视频| 精品小视频在线| 妇女性内射冈站HDWWWCOM| 熟妇高潮一区二区免费视频| 91天堂| 婷婷伊人綜合中文字幕小说| 午夜操操操| 日本高清一区二区在线| 亚洲欧美综合网站| 欧亚乱色熟女一区二区| 北野未奈加勒比av| 日本Xx性爱| 日韩色图 一区二区| 九月丁香综合网| 日韩精彩视频| 久久精品三级影视| 午夜九九| 亚洲精品三| 欧美丝袜91| 色情成人五月天| 中文字幕在线免费观看 | 精品国产72| 影音先锋日本一区二区| 超碰97最新人妻| 欧美国产欧美在线观看| 久草精品视频| 日韩午夜精品一区二区三区电影| 欧美色图在线视频少妇| 欧美成人黄网色网站| 青青草中出视频| 91丨九色丨43老版熟女| 亚洲成人ab| 免费啪啪av| 国产精品高清2021在线| 无码高清操逼| 超碰人妻中文在线| 欧美αv.com| 国内一区二区三区| 强奸a片网| 大香蕉 222| 久久久久深夜无码| 大香蕉啪啪啪| 成年无码动漫av片无尽在线| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 高清在线不卡一区二区 视频| 蜜臀久久久国产| 性爱乱伦网址| 精品久久久久综合无码| 九九九九88| 国产一区在线观看无码AV| 日韩中文9| 五月激情在线| 久久丁香久草综合网| jiujiujiujingpin| 日本污ww视频网站| 在线97视频| 狠综合网| 玖玖婷婷五月天| 亚洲自拍偷拍视频在线| 久久久久久久久久久久久久久久9| 99热在线观看| 97在线免费视频| 久久伦理视频久久大香蕉视频| 性爱av在线免费观看| 亚洲色图欧美色图另类图片| 黄色不卡视频| 久久久国产三级黄色片| 99久久无码| 欧美综合777| 人妻天天夜夜爽一区二区| 日韩中文字幕国产| 99热在线只有精品| 高清不卡视频| 久精品无码av一区二免费国产在线观看| 亚州男人天堂| 欧美大干日韩| 日韩99神马视频播放片在线播放| www.91理论| 美女诱惑一区| 97久久国产亚洲精品超碰热| 一本一道人妻久久一区二区三区 | 六月婷婷五月丁香| 天天干天天燥| 婷婷午夜清品久久久久久久性色视频观| 久久久av爱| 日本久久网| 激情无码日韩| 啊啊啊好想要| 日本亚欧爱爱| 亚洲综合影片| 久久思思热| 人人摸人人摸人人干| 亚洲欧美另类激情小说| 国产av色网| 天天舔九色婷婷| 久久,精品一二三| 亚洲日韩美女中文字幕乱| 成人国产视频在线观看| 日韩AV噜噜噜一区二区三区四区 | 欧美国产操逼| 人人摸人人干| 欧美毛片在线网| 欧美性爱十八禁| 中文字幕日韩电影人妻| 2017亚洲天堂| 蜜区区视频79 | 蜜臀少妇一区二区| 日韩中文字幕在线视频观看| 欧美亚洲第一页| 女人天堂av在线播放| 大香蕉性欧美| 啊啊啊不要嗯嗯在线观看| 男人天堂2012| 色爱综合网欧美| 久久久久国产精品久久久| 欧美一级AAAAAAA| 亚洲AV无码国产精品久久久久| 久久精品国产精品亚洲艾通辽熟妇 | 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 综合亚洲网| 性吧在线视频| 留下AⅤ黄色片| 人妻81p| 日韩啊V| 外站AV在线| 久久久91| 九九九国产| 清纯唯美亚洲另类| 人人摸人人舔一区二区| 嗯嗯啊啊好疼| 欧美另类自拍 | 永久免费av无码网站国产app| 天天干电影| 天天综合青苹果| 天天操天天干美女网址导航| 亚洲一二三四区在线免费看视频| 99久热精品99re6热| 色情亚洲日本成人| 91人妻视频| 97青娱乐超碰久久| 久久熟妇五十路一区| 中文字幕精品人妻丝袜| 日本免费不卡二区| 九九天堂| 九九久久一区二区三区| 91九久| 蜜臀亚洲中文| 日韩懂色网| 中文字幕十五区| 嗯嗯啊好大| 亚洲熟女乱色一区二区三区久久久 | 人妻精品综合中文字幕在线 | 国内毛片四区| 啊啊啊好大好深| 自拍六区| 91丝袜在线观看| 国产精品美女久久久久久网站| 日韩欧美性吧婷婷乱伦大香蕉| 精品人妻免费观看| 亚洲欧洲日本精品中文a∨| 久热影视| 特级毛片特黄久久免费看 | 97超碰色五月| 精品久久久久黄少妇| 麻豆天美传媒在线视频天堂| 和协影院中文字幕三区| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 亚洲91综合| 91模特在线观看| 天美传媒AV在线| 强被迫伦姧在线观看无码网站| 九九精品99| 日韩av影片在线观看| 9999久久久久| 不卡超碰护士AV在线免费播放| 久热精品色情| 老鸭窝日丰县女人| 午夜在线播放| 在线亚洲 欧美 日本专区| av在线免费一区二区| 国产精品国产拍高清AV| 熟妇熟女亚洲天堂网| 欧洲亚洲人妻无码中字久久三区四区| 亚热日本熟女| 97在线公开视频| 欧美成人免费在线观看| av网页一区二区三区| 狠狠狠狠狠狠| 欧美精品第四五页中文字幕在线观看| 91影视亚洲| 久热热| 色欲av一区二区三区蜜芽| 国产自偷| 91美女视频在线| 久久国产999| 精品午夜福利| 伊人精品久久网站| 久综合网| 97色诱| 欧美色图99| 亚洲欧洲日本精品中文a∨| 嫩草影院在线观看精品| 久久久爆乳翘臀一线天伦理视频| 91日日| 亚洲欧美综合网 | 欧美成人精品A片免费一区99| 亚洲AO在线| 欧美女同在线| 青娱乐福利99| 亚洲五月婷婷| 二级久久网| 青青操在线视频| 岛国激情视频在线观看| 97色碰| av东京热男人的天堂| 精品九九九九九九| 亚洲无码?第一页| 大稥蕉免费视频这里只有精品| www.男人天堂| 天天日天天干天天操| 亚洲欧综合另类无码一区| 欧美在线官网| 欧美女同在线| 久久 国产 无码| 99热这里只有精品9| 亚洲综合69| 99精品国产户外露出| 大香蕉综合| 亚洲凸凹超碰成人| 欧美国产精品久久九九| 色99视频| 色网综合网| 香蕉国产精品麻豆亚洲欧美日韩| 五月丁香激情综合| 日韩美女,国产传媒,视频一区| 淫荡网址| 色婷婷基地| 欧美天天在线| 91在线超高颜值国产| juliaann精品熟女一区| 久久精品区| 嫖老熟女A片一二三区| 日韩钢筋无码高清啾啾啾| 日韩啪啪视频| 91九色首页| 亚洲图片欧美另类综合免费视频大大香| 四虎午夜影院| 亚洲人精品久久久喷水| 欧美亚洲特P| 最新国产精品久久精品| 蜜桃一区二区三区| 国模无码人体一区二区三| 91在线页| 先锋女优在线观看视频| 激情五月天视频| 综合大香蕉美。| 干干干天天| 伊蕉97蜜桃97狠狠综合干| 四虎国产精品永久入口| 91丝袜美腿网站| 久久大黄片| 亚洲天堂性爱| 97在线视频观看|