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

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(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)境的切換。現(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í)用上線(xiàn)后愿意把列表頁(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)前顯示的是離線(xiàn)緩存這個(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)目里最想分享的三句話(huà)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í)話(huà)這個(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
返回資訊列表
亚洲国产精品久久AV| 久久极品一区二区| 国精综合一二三区影视| yw尤物av无码点击进入麻豆| 色一射色一射| 99re在线视频这里只有精品| 欧美国产精品| 少妇人妻精品| 无码动漫av中文字幕| 这里只有精品视频在线| 97操综合| 免费一级毛片在线视频观看| 亚洲超碰综合网| 欧美国产精品| 嫩草影院永久在线制服丝袜| 干我久操| 熟妇一区,二区,三区。| 操逼片中文| 欧美国产一区二区三区麻豆传媒| 搡老熟女免费视频| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚 | 欧美熟妇精品黑人巨大91| 欧亚性爱啪啪| 久久97超碰| 六月婷激情福利天堂69| 曰韩操B| 日本999精品视频| 99久久久无码国产精品性啊聊| 中文字幕第页| 亚洲春色一区二区三区| 日产国产精品中文久久婷婷| 男人的天堂午夜av| 人妻娇喘 激情视频| 99热婷婷| 欧美福利视频啊啊啊啊 | 国产树林里野战在线看| 精品免费成人久久| 电影69乱码96| 亚洲丝袜诱惑| 伊人少妇久久久| 日韩精品黄片免费观看| 亚洲有薄码区久久在线一区| 看看小穴| 亚洲在线欧美| 9精品在线| AV麻豆免费一区| 久草资源在线视频官方总站日韩丝袜美腿 | 偷拍自拍在线视频观看| 久久禁| 在线观看亚洲专区| 免费岛国一级片| 久草新免费| 中日韩熟女| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 熟女突然公开看18禁影片| 色爽——AV| 久久性视频| 欧美18老人禁| 清纯唯美综合亚洲| 激情五月天社区| 欧美日韩不卡传媒| 人妻免费观看| 五月综合婷婷久久网站| 人人看黄色视频| 9 9无尺码天堂网| 日韩精品一区二区三区四虎影视| 国产视频一区二区三区在线免费观看 | 色吊丝 日日骚 清纯唯美| 欧美制服网站美腿丝袜| 精品无码久久久久久久杏吧| 天天在线91| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 婷婷探花久久精品一区| 色噜噜人妻av 中文字幕| 欧美探花网| 超碰一区二区| 人妻精品4K4K4K4K4| 操逼操网| 2019天天干天天操| 亚洲本色精品一区二区久久| 久久久91福利姬| 天天综合色电影| 亚洲欧洲精品视频发布| 国产偷人伦激情在线观看| 青苹果影院男人的天堂| 久热9| 丰满岳乱妇一区二区三区| 精品无码一区二区三区| 狠狠干妹子| 91日日| 成人看片网站| 色官网色综合| 91伊人久| a片在线播放| 性交一区二区在线播放| 国产美女口爆吞精| 欧美97视频| 国产精品久久9| 亚洲精品成人激情在线| 欧美不卡二区| 日韩性爱视频在线免费观看| 久久无码成人| 激情 欧美 亚洲 小说| 久操视频在线观看| 欧美另类天堂| 中文字幕人妻丝袜乱一区三区| 日韩人妻精品中文字幕| 欧美熟妇亚洲版| 综合日韩激情另类图片| 久久久一热在线播放| 麻豆久久久一区二区| 亚洲中文日韩精品| 亚洲成人美女无吗| 亚洲精品aa久久伊人| 又粗又长又爽在线观看| 国产偷人伦激情在线观看| 欧美碰碰综合色| 人妻天天爽夜夜爽2| 精品久久艹| 91视频综合在线| 乱久久久| 天美一区在线| 天操天操夜操夜月操月年年操操| 成人资源中文字幕在线观看| 97在线视频网站| 免费在线视频97| 欧美亚洲中文字幕| 亚洲情色视频| 一级二级三级黑人无码| 黄色AAAAA欧美| 伊人黄色视频免费观看| 国产精品国产拍高清AV| 日日爽夜夜爽| 亚洲天堂第一页| 99xav| 一二三四视频在线社区中文字幕| 亚洲做性| 夜色91| 免费观看日本操逼视频| 国产91av在线播放| 欧美性猛交美女自慰91| 丝袜av一区二区三区| 人妻少妇三级| 欧美综合色,www| 久久精品国产Aⅴ| 亚洲国产成人精品999| 日韩亚洲国产视频| 伊人久久艹| 天天爽爽爽爽| 人妻黑丝袜电影| 99色热| 97chaopengongkai| 天天操天天射天天日| 久草免费福利在线播放| 伊人久久婷婷| 97色爱| 欧美超碰人妻97| 色网亚洲人| 国产外初女出血视频| 天天干18禁| 国产精品分类在线观看| 天美麻花大全视频| 香蕉久久精品| 久久香蕉国产线看观看亚洲女人 | 91久久久久久久久18| 久久久久成人蜜桃精品| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 婷婷四五区| 熟妇高潮一区二区免费视频| 精品大全99999| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 婷婷香网站| 蜜桃网熟妇| WWW啪啪的com| 亚洲日韩精品一区二区| 约操熟妇| 欧美午夜色妇色鬼| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 在线天堂999| 大香蕉日韩欧美| 欧美日韩日产免费网站看| 色情乱伦AV| 日本少妇va7777| 欧美日韩小说| www九九热| 女生自91网站| 日本爽爽爽爽爽爽免费视频| 黄色视频特级毛片| 丝袜美腿校园春色| 国产探花日韩援交| 中美日韩毛片| 日韩精品在线视频,日韩精品……| 国产精品一级片在线看| 一区二区视频你懂的| 97超碰人人操人人操| 色婷婷五月综合| 女人天堂网| 国产无码精品成人| 日韩素人无码一区二区三区三州| 美女性91| 欧美日韩性爱操大逼| 东北老女人的激情视频| 老熟妇乱轮| 精品一区二区三区蜜桃臀赵总 | 男人天堂欧美| 亚洲性爱高潮影院| 91爱网| 亚洲免费人妻在| 热的中文 热的有码 热的国产| 少妇一级婬片免费放一级a性色.| www.99热在线只有精品| 亚洲一区日韩精品| 天堂资源站| 伊人影院综合是一个与深夜成人在线| 插老姨肥穴| 国产亚洲日韩欧| 黄色大片一区二区密桃丝袜| 精品无码秘 人妻一区二区| 日本久久久久久久久| 欧美综合亚洲综合| 97超碰美国| 午夜精品久久久| 欧美三级不卡| 五月婷婷六月丁香网址| 色拍偷亚洲| 亚洲国产成人福利在线观看| 东京热不卡视频| 国产色呦呦| 99re久久| 欧美婷婷五月天| 伦理第一页| 天美av在线观看| 污电影在线观看| 日本午夜福利影院| 凹凸精品熟女在线观看| 四虎影视在线| 高清成年美女黄网站免费大全| 98福利在线视频| 26UUU欧美激情一区二区| 91在线丝袜| 资源在线观一 二| 国产色图乱伦| 青青草中日韩在线| 国产13区| 国产欧美精选激情视频| 综合网亚洲在线| 97超级久久强资源| 成人性爱视频在线看| 亚欧美综合网。| 97精品综合| 无遮挡男女激烈动态图| 中出在线视频| 裸模AV女优| 午夜福利视频在线一区| 精品综合久久久久久五月天| 天天插天天操天天摸天天射天天看| 国产亚洲精品无码三区| 日日骚一区二区三区| 色999亚洲人成色| av激情亚洲五月天| 成人热久久精品| 免费一级精品啪啪视频| 久久久久女教师免费一区| 国产伦精品免编号公布| 国产一区二区三区久久久精品| 无码人妻丰满熟妇区毛片| 99热婷婷| 亚洲天堂热| 探花视频免费观看国产专区| 婷婷久久久精品| 精品视频97| 色婷婷亚洲婷婷| 波多野结衣一级视频| 麻豆区久久久久亚| 亚洲精品国产av天美传媒| 中文字幕五区| 超碰人人色| jizzjizz欧美| 日韩性爱1级片视频| 无码二级三级| 综合久欧洲| 國產尤物AV尤物在線觀看| 牛牛AV人人夜夜澡人人爽| 久久精品无码不卡| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 欧洲无码一区二区| 天天综合网亚洲综合网| 中文伊人大香蕉视频| 一区中文字幕二区日韩| 伊人久大| 日韩一级特黄av毛片| 久久伊人五月天| 精品一区二区麻豆| 在线视频 亚洲精品| 无码丰满熟妇一区二区浪潮AV| 萌白酱自拍视频| 欧美大香蕉卡久久| 欧美se综合| 91人妻做a观看视频| 美女诱惑1区2区| 我要色综合网站| 久久东京伊人一本到鬼色| 中文字幕精品一区二区精品| 欧美最婬乱婬爆婬牲视频| 国产精品露脸在线观看| 香蕉一区二区三区在线视频| 欧美97色| 淫妻综合网| 最新制服中文第一页| 色黄色美女大长腿午夜视频| 天天日日日射| 99久久精品无码一区二区毛片免费 | 97久久国产精品| 国产av强奸美女| 五月天激情婷婷| 中文三一区| 最新欧洲欧美日本激情网站| 97久久超碰| 91在线|亚| 一级性爱视频免费在线| 天天操夜夜操| 国产欧美日本亚洲精品| 欧美色院| 西西美女视频网| 日本影视久久免费| 亚热日本熟女| 亚洲欧洲综合视频在线| 欧美日韩在线小说 | 日韩精品人妻中文字幕久久久| 第四色奇米影视777| 97超碰中文| 色色五月天婷婷| 精品人妻一区二区三区在线视频不卡| 欧美欲色| 九九热视频在线观看| 另类图片综合| 欧美综合亚洲| 黑人中出21连凳花野真衣| 国产精品无码av在线 | 成人精品久久久午夜福利| 91超碰碰在线| 97欧美精品综合| 日本九九九九| 密乳AV免费观看| 9丨久久九九九| 综合激情97| 综合网色| 一级性爱aaaa| 日本三级一区二区 在线| 97超碰欧美精品| 乱日视频| 97精彩视频网站| 亚洲av乱伦色图网站| 翔田千里无码一区| 男人天堂东京热| 国产91丝袜在线播放蜜月| 91亚洲精品青草| 开心激情婷婷| www.91久久| aaaa黄片| 婷婷亚洲五月***久久| 欧美性生活男人的天堂| 欧美Ⅴ性爱| 伊人热综合| 91丝袜| 亚洲精品电影| 久久精品导航| 99re在线精品78| 欧美熟妇操操视频| 色婷婷激情| 超碰国产精品久| 东京日日夜夜| 夜夜操天天肏| 少妇一区二区三区| 婷婷激情五月天小说网| 欧美日本天堂| 91久久免费视频互動交流| AA丁香综合激情| 国产人妻久久精品一区二区三区| 国产强奸超碰AV| 人妻激情视频| 国产操逼逼网| 中出789在线视频| 久久久久亚洲Av无码专区老牛影视 | 小视频国产| 久久久成人免费av电影| 国产精品福利视频播放| 九九拍拍精品视频在线播放| 日小BB小视频| av草草在线电影| 亚洲五月婷| 日韩大香蕉| 亚洲一二三四区机械| 人人摸人人入| 婷婷五月天综合网| 亚洲色图A| 夫妻AV网站| 欧美呦呦性爱| 又黑又大又粗| AV99热18这里只有精品| 亚洲成人av色网| 欧美高潮| 麻豆精品三区视频| 尤物网址| 欧洲久久一二线| 亚洲 国产 精品一区| 人人澡综合涩| 青青青国产手线观看视频2| 青青草白白色| 亚洲有码 视频一区| 人妻夜夜爽天天爽麻豆三区网站 | 日本中文熟女视频| 日韩色| 日本一二区免费| 欧美偷拍| 婷婷伊人綜合中文字幕小说| 18一区二区三区| 98超碰欧美| 色九区| 清纯唯美第一页| 久久久久久国产无码精品| 99操| 亚洲精品毛片在线观看| 日韩欧美中文字| 日韩综合无码色欲vv| 色婷婷丁香五月| 天天干18禁| 丁香五月婷婷基地| 91岛国动作片| 人人澡综合涩| 国产中文字幕曰本毛片| 国产久久天堂资源| 国产精品久久久亚洲一区| 蜜臀久久99精品久久久久久婷婷| 婷婷精品视频| 欧美人人操人人插| 亚洲熟女乱色一区二区三区久久久| 人妻中文字幕精品无码| 9997se| 黄色AV影视| 日韩免费在线观看不卡| 伊人影院在线理论播放| 日韩激情毛片一级久久久| 香蕉大久久久| 一区二区你上我| 国产综合在线视频网站| 精品免费成人久久| 五月天伊人| 久久久久国产一区二| 亚洲综合首页| 99最新日韩偷拍视频| 久青草影院| 99久久久无码国产精品性啊聊| 天美传媒Av在线| 五月天开心网| 777奇米影视777四色| 97干色| 超碰欧美COM| 性性欧美| 99re69综合| 日本狠狠干| 999岛国大片| jizzjizz欧美| 男人天堂2017| 欧美日韩亚洲少妇寂寞影院正在播放| 久久精品老司| 全球成人中文在线| 久久91精品国产9丨久久分亭| 久久久成人免费av电影| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 一区二区三区黄片免费观看| 欧美性色欧美| 日韩91网| 日韩欧美久久婷婷网站| 伊色久人大在线| 亚洲熟女av中文字幕| 蜜臀99精品国产高清在线观看| 色香天天| 操操逼视频| 操我无码| 精品一区二区三区蜜桃臀赵总 | 天天日夜干| 少妇熟女1区2区3区| 欧美日日操| 91麻豆va国产精品| 91九九九馒头| 色阁阁AV综合网| 久久香蕉国产线看观看亚洲女人 | 99色热| 超碰成人人人爽人人爽| 国产最新小视频在线播放下载| 亚欧高清在线| 中文字幕av色| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 97jingpin| 女生91网站| 亚洲h片在线免费观看| 亚洲AV成人在线| 97视频620| 熟女少妇视频| 干婷婷综合网| 91久久国产综合精品| 天美传媒AV在线播放| 日韩av不卡在线看| 天天看综合网| 成人青青草原伊人| 亚洲成人无码影院| 在线观看A啊啊啊| 久草加勒比一区在线| 国产a级午夜毛片| 91精品国久久久久久无码| 999久久久九九九九| 天天日天天干天天整| 欧美色图私拍91| 久夜视频| 自拍盗摄一区| 日韩成人私密一级精品av| 东京日日夜夜| 999热这里只有精品| 五月婷婷基地| 亚洲黄色AV电影| 九九99久久| 日本视频在线中文字幕| 啊啊啊好爽快点啊啊啊嗯嗯| 婷婷国产精品一区二区| 色九九九九久| 熟妇色99| 韩国轻伦国内自拍一区| 国产欧美日产一区二区三区 - 国产欧美日| 日韩电影中文字幕| 久热大香蕉| 色色九区| 美女高潮视频91| 国产Av超碰| 色超碰综合| 久久免费精品视频免一| 乱操9999| 色情综合网| 3PAV乱伦视频| 超碰免费欧美7| 国产一区二区视频在线播放| 三及片网站| 亚洲图片欧美制度| 蜜臀久久久99久久久久 | 欧美97免费| 性爱动态120秒| 国产隔壁老王影院在线| 丝袜狂射91| 久久久久久久久久久97| 99在线免费公开视频| 久久久精品九| 安徽熟妇视频| 麻豆久久久一区二区| 九九视频黄色片| 亚洲第一男人天堂| 青久操| 久久久久人妻| 国产亚洲精品农村妇女| 欧美懂色综合网| 东北熟女91| 欧洲一区二区三区免费| 亚洲人妻一区二区三区| 操逼网站地址| 911av网站免费观看| 久久超碰日韩精品| 青青草原成人| 色香91| 情色五月天网| 成人久久精品| 东北女人的毛片| 日本青青草在线| 国产丝袜视频| 天堂岛av| 欧美亚洲综合色| 九九Av| 人妻少妇色综合| 99久久婷婷国产综合精品草原| 青青操综合网| 欧洲一级性爱视频在线观看| 亚洲天堂人妻熟妇视频| 亚洲第一精品在线视频 | 天天躁日日躁狠狠躁| 激情欧美97| 欧美天天综合网| 日本国产欧美一区三区二区| 久久久久久9| 最新无码国产| 丁香六月激情| 无码少妇精品一区二区60岁老人| 看日韩操逼| 亚洲第一页色| 日日干夜夜操视频h| 91成人社区| av日韩中文字幕| 亚洲人妻日日日| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 一区二区视频在看| 久热香蕉精品在线视频| 思思热国产高清| 不卡av免费在线网址| 久久久三区二区一区| 在线色导航| 无码视频一区二区| 日韩欧美性吧婷婷乱伦大香蕉| 五月丁香六月激情| 先锋女优在线观看视频| 久碰视频| 一二三区操逼国产91| 国产精品久久久777| 又黄又硬又粗又长国产视频| av天堂5| 国产视频97| 婷婷亚洲天堂| 亚洲综合第一页| 蜜臀久久99精品久久久久免费观| 啪啪视频免费在线观看| 亚洲网自拍| 中文字幕精品一区二区精| 校园春色欧美| 啊啊啊不要好疼视频| 欧美日韩大香蕉| 日本天天干天天搞一区| 自拍鲍鱼一区在线高清观看免费| 久久久青青草| 久久成年精品| 午夜男女爽爽爽在线视频| 久久精品国产亚洲av水密被窝| 精品熟女一区=区三区| 国产日产精品久久快鸭的功能介绍| 老鸭窝在线视频播放| juliaann精品熟女一区| 日本Xx性爱| 九九九精品| 久久久精品一区二区| 国模一区二区三区| 欧美亚洲尤物久久| 97超碰超碰| 欧美日韩亚洲国产中文永久天天看 | 综合久久久久久久综合网| 大香蕉中文网| 道久久五香丁月婷婷激情综合| 欧美日韩高潮喷水91| 欧美日本国产日韩激情视频| 粉嫩av在线| 99re99在线视频| 男人的天堂VA| 人人搡人人肉久久精品| 美女啊啊啊啊pc| 中文字幕成人| 激情五月天社区| 91快色色色色色| 被男人吃奶很爽的毛片| 欧美96精品在线| 欧美综合色,www| 五月天精品| 九99久久| 精品二区三四区五电影| 久久人爽| 污电影在线观看| 丝袜狂射91| 九99久久| 999热日韩精品| 精品玖九九久| 美欧色综合| 亚洲欧美电影| 国产51色综合久久免费| 97视频在线看| 豆花视频操逼网址| 国产视频一区二区三区在线免费观看| 97干色| 国产美女口爆吞精视频| 黑人精品XXX一区一二区| 日本1区2区不卡视频| 十八禁的黄污污免费网站| 色噜噜精品一区二区三| 伊人久久大香大香线蕉中文| 久久美女福利是上海美女| 9久久精品| 色哟哟国产精品免费网址| 欧美日本久久精品一区| 久久精品国产久精国产| 日韩成人小视频| 无码精品久久久久久亚洲| 家庭乱伦国产精品| 免费操逼视频下载| 九久久九精品视频| 熟女网站最新| 亚洲欧美小说| 深夜激情无码| 97干色天堂| 夫妻AV网站| 在线播放成人高清免费视频| 国产精品久久久久久 百度| 天综合网| 嫩草 我啊~嗯~在线| 日本不卡一区二区| 在线观看精品国产免费| 久久久久久久久九九久孕交| 天天欲望网| 黄片无码在线制服| JULIA人妻风俗店中出电影| 精品丰满熟妇人妻一区| 清纯唯美亚洲综合| 欧美97av| 久久久久女教师免费一区 | 大吊色| 久久久久久久久久久六六| 破苞ⅩXXX性无码动漫无码| 免费看A片毛毛片在线播| 精品亚洲成人免费在线| 久久精品国产亚洲AV清纯| 天天综合~91| 亚洲一二三四区| 天天日天天干天天操| 激情小说日韩无码| 精品美女久久久久| 波多野结衣AV无码一区| 人人模人人看| 国产黄色影片在线观看| 国产精品久久久久无码A√| 五十路六十路素人熟女| 伊人黄色片| 成人亚欧免费视频| 国产精品免费美女视频| 色九九综合| 国产精品对白内射| 在线观看午夜婷婷久久久久清性观看| 亚洲综合一| 婷婷人妻激情| 日韩性爱小视频| 精品国产91内射久久| 国产h片在线观看视频| 天天视频综合在线观看视频| 性做久久久久久免费观看软件| 亚洲激情在线| 精爱久久| 久久男人| 精品人妻一区二区视频| 熟女精品一区二区三区| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 日韩免费三级黄片电影| 中文激情网| 婷婷另类小说| 青娱乐淫乱1314| 密桃99999| 日韩综合色网| 少妇高潮特黄A片| 性感女人网页在线观看视频| 国产999精品久久久| 五月婷网站| 亚洲情色在线| 亚洲天堂精品日韩电影| 丁香九月激情| 中出20p| 强奸乱伦av电影| 亚洲视频二区 | 伊人在线大香蕉二。| 色就色综合| 91九九九小逼| 亚洲精品一区二区精品| 欧美不卡在线一区二区| 亚洲一二三四区| 男人亚洲91首页在线| 无码直播久久久| 97精品免费视频网站| 亚洲欧美另类小说| 天天综合欧美综合| 色一情一乱一乱一区91Av| 曰韩精品视频一区二区| 超碰九7| 日日噜噜夜夜久久亚洲一区二区 | 综合大香蕉美。| 久久久久久久久久久97| 少妇滛荡视频| 亚洲天天做日日做天天谢日日| 天天干人人乐| 91在线国产后入风骚翘臀美女素人| 久操B网| 天天流夜夜操| www.色婷婷色综合| 国产高清MV操逼视频| 国产亚洲精品一区二区三区| 色悠久| 中文字幕欧美丝袜07资源| 精品国产乱码久久久影院| 天美传媒AV国产在线| 天天日天天射天天干| 三级片大波波| 综合网久久| 99re99视频在线免费观看| 久久一区,青青青青草视频在线播放| 久99热| 920日本午夜免费| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 日本免费一级AAA大片器 | 色臀AV| 欧美天天性| 亚洲美女AV无码| 性色av大全| 亚洲精品国产专区在线观看| 亚洲国产成人福利在线观看| 13小男生GAY自慰脱裤子| 天天日天天搞天天干| 天天操女人| 久久熟妇五十路一区| 91五月天| 日韩内| 欧洲亚洲少妇| 18禁免费视频| 激情五月天色色网| 啊啊啊com| 久久久久久久78| 狠狠亚洲| 麻豆91熟妇人妻中文字幕茄子| 欧美性天天| 国产精品久久天天干| 伊人黄色视频免费观看| 久久国产精品91| 欧美午夜色妇色鬼| 欲综合网| 亚洲电影中字一区二区| 免费人成在线观看网站品爱网| 秋霞一级视频在线观看免费| 婷婷亚洲天堂| 久久9精品网站| 五月婷婷六月丁香网址| 日韩精品区二区三区不卡| 久久av色| 竹菊一区二区三区AV线| 精品九九国产无码| 美女露胸露屁股| 天天影视网色欲色香| 囯产精品久久久久久久久久梁医生| 国产麻豆福利av在线播放| 日韩女优中文字幕| 日本不卡中文| 91一区二区三区蜜桃| 99热亚洲| 亚洲亚洲亚洲天堂天堂| 综合国产影视三级| 99热aaa| 男人的午夜天堂| 天天添天天干电影| 香港日本韩国人妇99www.wccm20| 99久久99九九99九九九| 天天搞在线综合网| 久久中出在线| 欧美日韩啪啪电影| 啊啊啊啊啊操我视频| 亚洲超碰97| 91亚州日韩高清| 老熟女阿 国产91| 欧美很很操视频| 熟女91网| 大香蕉婷婷| 亚洲丝袜在线观看| 五月色综合| 日韩精品一二三| 开心激情婷婷| 亚洲欧美骚| 免费视频a级毛片免费视频| 9997se| 综合婷婷| 青青草在线视频播放器| 一二三四免费视频| 国产白丝av| 久久亚洲婷婷| PMv在线观看| 久久超碰日韩精品| 亚洲另类色图片| 国产熟女免费观看久久| 免费国产| av操操不卡| 少妇高潮对白在线观看| 殴美性天天| 亚洲五区熟女| 午夜理论片在线观看免费| 五十路成人在线视频二区三区| 六九九九| 亚洲成人久久美女| 亚乱色| 久久精品国产亚洲AV无码做| 亚洲啪啪视频免费| A级在线视频| 国产又黄又粗又猛大片| 极品销魂美女一区二区 | 亚洲精品尤物yw在线影院| 日韩9区| 日韩中文字墓| 国产精品无码成人精品| 国产真乱mangent| 操逼视频色| 国产aⅴ无码片毛片一级网站| 淫荡熟女乱伦网| 欧美黑人精品一区二区| 97碰在线视频| 男人的天堂亚洲| 欧美一级黄片免费播放| 欧美一级久久久久久久大片动画| 最新日本中文字幕| 欧美在线播放| 肏逼视频日本| 翔田千里A片一区二区| 中文字幕国产在线天堂| 久操视频在线观看| 男人天堂网站| 性色av大全| 久久久精品电影| 操日韩第| 国产亚洲精品玖玖玖在线观看| 国产精品999zyz| 新婚人妻扶着粗大强行坐下| 丰满人妻av一区二区三区| 超碰成人国产| 狠狠干综合| 人人污日韩一区二区| 欧美日韩在线小说 | 97超碰总站| 性老妇一区二区三区| 日韩精品操少妇| 风月影院男女十八禁| 亚欧操逼片在线观看 | 亚洲综合99999| 久久激情视频| 亚洲毛片久久| 性色亚洲| 肏逼福利网站| 立川理惠被中出无码| 91少妇人妻| 不卡在线观看视频| 色欲天天综合久久久无码网中文| 日韩免费在线观看不卡| 日本黄大片在线观看视频| 大香蕉www.超碰| 熟女被操视频网址| 久久最新免费视频23| 亚洲伊人久久精品影院| 美女高潮国产高清| 免费观看性欧美一级| 亚洲夜夜欢无码一区二区| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 立川理惠被中出无码| 国产小黄片在线免费观看| 青青草日韩无码| 殴洲老熟女| 老鸭窝成人免费毛片视频| 亚洲AV成人无码一二三久久| 一区二区娱乐网站| 蜜臀人妻少妇久久在线观看| 91狠狠狠| 国产美女口爆吞精视频| 久操精品网| 欧美激情片一区二区| 青女偷拍网| 少妇一区二区三区高速| 大香蕉免费中文| 欧美色日| 天堂69亚洲精品中文字| 99色色网| 久久久久久九九九九九九| 天天透伊人| 亚洲成人免费在线| 久久神马影院| 日韩欧美中文字幕搭讪巨乳美人妻视频| 乱伦熟妇一区二区| 国产少妇肉丝在线观看| 另类TS人妖一区二区三区| 亚洲欧美综合图片| 人人操人人摸人人看人人插| 狠狠综合| 污电影在线观看| 无码人妻精品一区二区三区99不卡| 无码自拍SM| 国产精品高潮久久AV| 欧美天天弄| 97天堂| 精品少妇一区二区三区| 在线国产福利网址导航| 中文字幕日韩精品一区二区三区| 日本久久超碰| 五月天久久久| 精品二区久久| 人人操人人摸人| 亚洲综合射| 一类无码操逼视频| 91久久18禁| 国产福利电影| 日本人体九九九九九九| 999色欧美中文字幕| 国产av又色又爽又黄| 一区二区三区四区五区高清无码永久视频 | 欧美天天综合站| 少妇无码av专区线| 欧美久久婷婷| 极品欧美一区二区三区| 一个人在线看的黄色电影网站| 青青草福利视频| 69精品少妇一区二区三区蜜桃| 亚洲欧美碰碰| 男人天堂一区二区| 舔足天天操天天射| 欧美|91色综合| 97干在线| 麻豆九九九| 91人妻精华帖| 日本顶级天天操狠狠操夜夜操中文字幕| 成全在线观看免费观看| 色哟哟av网址| 成人日本视频人妻在线| 肥佬影院91| 嗯嗯嗯啊啊啊在线免费观看| 日语五十路和六十路亚洲国产精品| 人妻一区二区三区| 人妻啪| 青青草久草AV| 超碰在线人妻| 一起草在线视频| 少妇天堂网络| 国产亚洲精品av一区| www久久精品| 五月丁香婷婷综合| 国产一区二区三区高清视频| 美骚妇av高清在线| hd成人一区二区在线| 97超碰欧美精品| 99爱久久视频频| 人人潮人人摸| 国产尤物在线三区| 日本熟妇熟色97一本在线观看| 日本乱人伦片中文三区| 天美传媒av在线| 91久久婷婷| 日韩强奸av| 大香蕉在线SuP| 96精品在线| 日韩在线性爱免费视频| 97中文字幕一区| xxx亚洲午夜天堂| 玖玖玖玖精品国产剧情| 性色A∨91| 超碰1997| 91亚洲人电影| japan日本高清乱xxxx| 亚洲天堂加勒比| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲国产综合久久久性感熟妇| 视频黄色国产一级| 精品天堂| 亚洲国产青青| 18一区二区三区| 亚洲超碰AV| 日韩欧美福利视频看看| 亚洲日韩狠狠撸视频| 91美乳| 激情第四色| 国产精品黄色三级av| 丰满人妻-区二区三区| 另类视频在线| 热久久91婷婷| 久久香蕉综合一本到3atv| 日产操逼| 清纯唯美第一页| AV99热18这里只有精品| 国产成人亚洲精品自产在线| 亚洲91在线播放影院| 欧美色宗合| 天天操福利视频综合网站| 加勒比综合九九99视频在线播放| 九九色精品| 欧美日韩性爱无码| 国产日韩手机视频在线| 九九热九九| 亚洲精品九九九九九九| 一区二区视频你懂的| 黑操B| 婷婷丁香在线| 国产精品久久久久久久黄无码| 日产操逼| 97超碰超碰| 精产品久久| 国产中文字幕在线观看| 天美传媒在线一区| 日韩精品人妻系列无码天堂| 九九这里只有精品| 亚欧Av| 亚洲精美粉嫩嫩泬在线观看 | 欧美综合综合| 色综合 加勒比| www被窝色com| 大香蕉综合久久| 欧美狠狠弄| 亚洲中文字幕乱码无码一区二区| 夜色五月天| 婷婷伊人| 中文字幕永久在线| 爱射综合| 婷婷综合久久| 激情五月综合网| 九九久久精品| 天天日天天色| 91日韩在线| 天天草天天干天天日| 玖草在线视频| 久久久久久裸体| 日韩精品大香蕉伊人在线| 97精品综合久久网| 亚洲青色欧美| 情色五月天网| 啊啊啊啊啊好大好舒服想要| 成人日韩中文字幕| 97 超碰 人人做 人人爱| 超碰AV在线| 欧美很很操视频| 色香蕉影院| 青青草中文-久久青草精品一区二区三| 中文色综合| 强奸乱伦AV网站| 自拍偷拍 高清无码| 午夜精品五区| 日本国产欧美高清在线| 中文字幕91综合| 精品精品精品| 大香樵伊人网| 久久久久久性爱片| 亚洲黄色AV电影| 在线有码中文字幕| 亚洲成aⅴ人片不卡无码| 日本性爱视频一级| 国产强奸91| 手机在线人成免费视频| 久久久成人国产精品无码| 久草免费在线一区二区| 久综合网| 亚洲人成色9999精品久久| 日韩精品人妻系列无码天堂| 99国产人成精品| 亚洲成人av色网| 丝袜制服字幕在线| 亚洲欧美另类少妇精品| 日韩电影天堂视频一区二区| 青青草久草AV| 伊人久大| 天久久久噜噜噜久久国产精品爽爽| 骚日日av| 亚洲色棕合| 欧美情色亚洲| 国产一国产一级毛片古装| 搡老熟女免费视频 | 欧美淫乱视频| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 色丁香五月婷婷| 91亚洲不卡一区| 操操操操网黑人| 久操免费电影| 久久久久亚洲熟妇熟女| 国产精品蜜乳AV| 婷婷五月天激情四射| 日韩精品人妻系列无码天堂| 久久久久深夜无码| 测评在线观看AV|