亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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)用而不是再寫一個(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è)方向而不是再寫一個(gè)經(jīng)典 Todo原因很實(shí)際第一信息流是最常見(jiàn)、最不挑領(lǐng)域的應(yīng)用形態(tài)。選它能保證讀者把代碼跑起來(lái)之后能立刻想象到這東西換個(gè)數(shù)據(jù)源就能變成新聞閱讀器、商品列表、開源項(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 日常開發(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)——直接開干遇到什么補(bǔ)什么。提示這篇文章是項(xiàng)目實(shí)戰(zhàn)第一彈我會(huì)把從零到發(fā)布的全過(guò)程都寫出來(lái)。如果你還在猶豫我現(xiàn)在水平夠不夠先別糾結(jié)完整跟一遍你會(huì)發(fā)現(xiàn)自己能走通的路比想象中長(zhǎng)。2. 開工前我先把目錄結(jié)構(gòu)和依賴一次定好2.1 為什么一開始就要定目錄結(jié)構(gòu)而不是寫到哪里算哪里很多初學(xué)者最喜歡在 main.dart 里一口氣寫五百行跑通了再說(shuō)。這種做法在五十行以內(nèi)問(wèn)題不大一旦項(xiàng)目超過(guò)兩三個(gè)頁(yè)面就會(huì)發(fā)現(xiàn)自己陷入改一個(gè)變量滿文件搜的困境。這次實(shí)戰(zhàn)從一開始我就把目錄按功能拆分目標(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 依賴選型的思路依賴選型我遵循夠用、穩(wěn)定、生態(tài)好三個(gè)原則。下面是最終在 pubspec.yaml 里鎖定的關(guān)鍵依賴和選型理由依賴用途選型理由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)存磁盤二級(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 避免把依賴版本一直跟著最新走我知道有朋友習(xí)慣直接flutter pub add xxx然后一路 yes。跑是能跑但等過(guò)了兩三個(gè)月項(xiàng)目里可能會(huì)出現(xiàn)依賴間的兼容性沖突——你裝 A 的新版結(jié)果 B 的接口變了。我的做法是每次新增依賴之前先在 pub.dev 上看一眼它的更新時(shí)間、最后版本發(fā)布時(shí)間、以及 README 里有沒(méi)有提到 breaking change。穩(wěn)比新重要。3. 主題、路由、配置這幾塊決定了后面寫代碼的手感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è)面里幾乎不寫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è)面類的引用而且在需要做登錄攔截、深鏈跳轉(zhuǎn)時(shí)會(huì)方便很多。當(dāng)然直接傳參數(shù)拼路由字符串有一個(gè)困擾——參數(shù)多了怎么辦我的處理方式是定義一個(gè)DetailArgument類把列表頁(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)手寫多一點(diǎn)規(guī)范信息流應(yīng)用的核心數(shù)據(jù)無(wú)外乎一個(gè)文章摘要對(duì)象封面圖、標(biāo)題、摘要、發(fā)布時(shí)間、內(nèi)容正文。我定義模型時(shí)遵循了一條很實(shí)用的原則模型的職責(zé)只有兩個(gè)——序列化和反序列化。所有業(yè)務(wù)邏輯都不寫在模型類里。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è)非常現(xiàn)實(shí)的需求統(tǒng)一設(shè)置超時(shí)時(shí)間和請(qǐng)求頭不用每個(gè)請(qǐng)求重復(fù)寫統(tǒng)一處理業(yè)務(wù)錯(cuò)誤碼把請(qǐng)求成功但業(yè)務(wù)失敗和網(wǎng)絡(luò)異常分開統(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)試階段——開代理抓包時(shí)需要加自定義 header改動(dòng)只落在onRequest一處全 App 生效。我建議每個(gè)人在項(xiàng)目初期都做類似封裝后面省下的時(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)換成用戶可讀的提示。比如網(wǎng)絡(luò)斷開時(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è)用戶能看懂的錯(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)依賴 BuildContext 才能讀狀態(tài)測(cè)試的時(shí)候必須包一層 Provider 結(jié)構(gòu)。Riverpod 最大的改觀是Provider 聲明和組件樹解耦了任何地方都能通過(guò) ref 讀到狀態(tài)代碼組織起來(lái)更接近依賴注入的思路。我在這次項(xiàng)目里用到的全局狀態(tài)只有兩類文章列表的異步加載狀態(tài)、以及當(dāng)前的請(qǐng)求分頁(yè)參數(shù)??雌饋?lái)不多但 Riverpod 在處理頁(yè)面銷毀后狀態(tài)要不要保留這個(gè)問(wèn)題上非常順手。緩存的是 Provider 實(shí)例化的對(duì)象可以跨頁(yè)面保持這對(duì)詳情頁(yè)從列表頁(yè)讀取數(shù)據(jù)緩存很有用。5.2 AsyncNotifier 的寫法省掉所有手動(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)畫、錯(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而不是自己寫 try-catch這是 Riverpod 提供的便捷方法能自動(dòng)把異常包成AsyncErrorUI 層拿到它直接展示錯(cuò)誤視圖方便得很。5.3 列表頁(yè)的 UI 組裝邊角狀態(tài)幾乎比主要邏輯還多一個(gè)信息流首頁(yè)正常狀態(tài)是列表除此之外還要處理空列表、初次加載中、刷新失敗、加載更多失敗、加載到底部等狀態(tài)。大多數(shù)人寫列表頁(yè)只放一個(gè) ListView結(jié)果一旦網(wǎng)絡(luò)慢或斷網(wǎng)用戶體驗(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 圖片緩存不要手寫但要了解原理信息流頁(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)存和磁盤滾動(dòng)回訪不再重新請(qǐng)求網(wǎng)絡(luò)。有一點(diǎn)必須提醒圖片占位圖不要用默認(rèn)的灰色方塊我只是寫了一個(gè)極簡(jiǎn)的ShimmerBox一個(gè)帶淺色背景的 Container就能讓首屏加載的觀感提升一個(gè)檔次。一個(gè)背景色循環(huán)動(dòng)畫的封裝半天就能寫好收益很值。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ū)嵦嵘脩羧蹙W(wǎng)體驗(yàn)。我用shared_preferences存緩存 JSON因?yàn)樗钱惒降?、開銷小詳情頁(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)容不滿一屏?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é)得明明寫了 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)題和封面讓用戶感覺(jué)頁(yè)面秒開再實(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í)候用戶從列表點(diǎn)進(jìn)詳情在詳情頁(yè)喜歡了某篇文章回到列表時(shí)希望能反映這個(gè)狀態(tài)。我這次把喜歡狀態(tài)放在 Riverpod 的全局 Provider 里而不是 DetailPage 的局部 State。這樣詳情頁(yè)更新了喜歡狀態(tài)列表項(xiàng)通過(guò)監(jiān)聽同一個(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 模式開起來(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 樹排查布局溢出非常直觀。開發(fā)時(shí)發(fā)現(xiàn)渲染問(wèn)題先打開 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)開如果用了網(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)不小開啟混淆并不能像原生那樣顯著瘦身反而可能引入 runtime 問(wèn)題新手期沒(méi)必要碰。8.3 iOS 與 macOS 環(huán)境的注意點(diǎn)如果你主要在 Windows 上開發(fā)最后需要一臺(tái) macOS 來(lái)打包 iOS 版本。這點(diǎn)我在項(xiàng)目開始就提醒了Flutter 項(xiàng)目跨端能力確實(shí)好但 Apple 平臺(tái)的構(gòu)建環(huán)節(jié)繞不開 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ù)而不是直接白屏。這套邏輯在初期就要寫進(jìn)列表頁(yè)模板里后面每個(gè)頁(yè)面都復(fù)用。第三從一開始就給工程留一層替換的余地。數(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í)后端給列表加上分類 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)目的模塊拆開講到時(shí)候再繼續(xù)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
草草网站影院白丝内射| 青青草好吊色| 91天天| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 久久久久久亚洲Av无码精| 眼镜人妻101.com| 国产精品久久久久久无码红治院| 在线观看一卡二卡| 91美| 欧美日韩99| 草b在线| 91痴汉| 国产剧情AV不卡在线观看| 久久精品国产亚洲AV片多多| 97色欧州| A片A5445444| 中文字幕av乱伦| 96免费视频在线| 亚洲一区在线观看欧洲| 嗯嗯啊啊啊好舒服| 日韩视频精品在线观看| 人人色97| 精品国产一区探花在线观看| 国产精品白虎| 国产深夜福利| 色老汉色| 曰韩av中文字幕专区| 97欧美久久久久久久| 国产人妖视频一区在线观看| 91美女视频电影| 97在线观看播放视频| 99蜜桃臀亚洲成人在线观看| 精品伊人久久久大香线蕉小说| 97超碰亚洲| 乱伦图一区| 天天综合,91入口| 六月天婷婷| 日本亚洲嫩草影院啪啪| 国产最新AV| 噜噜噜在线视频| 丝袜美腿欧美| 超碰碰激情97+久| 中文字幕91综合| 最新AV在线| 日本高清电影欧美色图| 2017人人操,人人摸| 看看日B真人视频| 国产亚洲日本精品在线| 久久精品国产精品一区| 久99在线免费观看视频| 骚逼一区二区| 日日日啊啊啊| 精品一区二区亚洲国产| 国产精品黑人一区二区三区| chaopen97久久| 快点操死我| 人人干人人搞人人摸| 蜜桃久久一区二区| 黄色工厂这里只有精品| Aa东京男人的天堂| 欧洲精品在线播放| 亚洲天堂性爱| 日韩人妻操B| 亚洲自拍天堂| 欧美一区二区三区另类精品| 亚瑟国产精品久久无码| 91免费看一区二区三区 | 久久婷婷五月天| 边做饭边操逼逼| 91人妻人人澡人人爽人人精品| 久久久亚洲精品中文字幕人妻| 一道本久久棕合爱| 夜夜嗨一区二区| 久色网| 久久久久免费看少妇A片特黄| 亚州综合在线| 99操99| 亚洲污污网站| 亚洲精品久久久久久| 色综九九九一区| 亚洲欧洲激情卡通另类文学四射小说网站| 久久人妻熟女一区二区| 97日韩| 91丨国产丨白浆秘 洗澡动漫| 丰满少妇一区二区三区免费看| 国产精品网站免费| 97丝袜亚洲在线播放| 久九九九九九九九热| 九九九九九精品视频| 密臀在线一区尤物| 欧美日韩另类在线| 色噜噜婷婷| 国产精品网站免费| 天天做天天爱| 激情婷婷五月天| 日韩不卡码| 久久久月天| 欧美激情性久久久久久| 一本一道人妻久久一区二区三区| 久日91在线| 久久久天美| 91在线超高颜值国产| 亚洲日韩欧美一区二区| 国产在线观看一区二区三区| 亚洲操人| 密臀在线一区尤物| 亚洲一区二区三区欧美日韩| 情色五月天久久久| 中文乱码字字幕在线第5页| 日韩精品亚洲专区在线影视| 亚洲精品一卡二卡三卡福利视频网站| 99久久无码| 深爱五月天| 久久天堂网| 黄页av| 人妻天天夜夜爽一区二区| 欧洲精品一二三在线| 三上悠亚在线毛片91| 大香蕉乱伦视频网| 超碰4A| 久久高清欧美国产| 精品一区二区三区18| 美国一区二区免费视频| 欧美色吧综合| 97任你吞精| 成人熟女区| 中文字幕日韩人妻视频一区二区三区| 亚精品无码毛片一区二区三区| 国产网站在线播放| 国产成人午夜视频网址| 天天看特黄的免费网站| 亚洲综合九九| 日本韩国国产精品一区| 天天日美女的B| 日本污ww视频网站| 无码直播久久久| 操逼短片| 91老司机在线视频免费观看| 国产黄色小视频网站| 都市激情人妻一区二区青青操视频 | 人人摸.人人色| 夫妻AV网站| 熟女人妻av在线资源,黄色的资源| 国产辣妈在线视频福利| 婷婷五月天激情四射| 久久久久久久久久久久黄色| 玖玖97综合| 国产曰批免费观看久久久| 国产精品久久久久久久久久久久久久久| 亚洲色图综合| 2017天天插| 懂色AV一区二区三区| 久久久久久亚洲中文| 亚州精品人妻一二三区| 大屁股国产在线视频| 91chinese在线| 欧美亚洲情色| 欧美日韩亚洲天堂| 91M一社| 欧美极品女人的天堂| 人人插人人搞人人操| 久草精品国产99| 欧美性夜| 可免费观看的av毛片中日美韩| 青青草在线视频播放器| 视频二区美腿制服人妻欧美| 婷婷五月天色网| 十八禁一区二区无码观看| 久久宗合亚洲| 操美女人妻| 丁香五月激情综合国产| 黄色高清无码无码破解免费暗网| 99久久久无码国产精品性男| 嫩草影院在线观看精品| 国模无码一区二区三区在线| 这里只有精品视频在线观看麻豆| 久久91视频| 日韩去日本高清在| 91蜜臀在线久久久久| 91爱综合| 在线 欧美 亚洲| 鸥美中出| 欧美爱三级日韩久久| 天天爽夜夜爽夜夜爽精| 亚洲黄网在哪免费看| 国产成人精品亚洲日本| 男人天堂综合| 色噜噜国产精品视频一区二区| 欧美大香蕉久| 亚洲无码99| 韩国女主播青草在线| 日本不卡一区二区三区| K8久久久久| 青青草中文字幕| 亚洲 无码 偷拍| 亚洲高清无码免费观看视频| 久久精品免费| 丝袜美腿av女优在线| 天天色,天天干,天天干| 99热综合在线| 欧美偷| 一级乱伦网站| 五月婷婷AV| 亚洲日韩少妇一道本视频| 日产精品久久久一区二区| 男女啪啪啪18禁网站| 人妻乱仑一区二区三区| 伊人96在线| 亚洲黄色网址视频| 国产第二页| 97爱爱| 啪啪啪大香蕉| 91精品人| www.婷婷五月天| 欧美性高潮在线| 日本肉体xxxx裸交| 后入式福利| 国产一级高跟丝袜| 综合视频91| 天天干人人干天天日97| 色噜噜国产在线| 嗯嗯啊啊啊啊轻点视频| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 人妻精品一区二区全免费| 亚洲精品电影| 熟女丰满人妻一区| 九九九精品成人免费视频小说| 超踫中文字幕| 美女极品一区二区三区| 美女91网址| 黄色乱论网站| 蜜乳av一区二区| 亚洲AV不卡在线观看尤物| 亚洲砖码砖专无区2023| 18精品一二区| 欧美亚洲高清不卡| 久热伊人| 成人午夜小视频手机在线看| 大香蕉欧美| 欧美色图下一页| 免费观看啪视频| 大香蕉天天看妹子| 岛国黄| 亚洲不卡一| 欧美操逼视频二区| 骚逼高潮久久精品| 岛国片在线观看视频亚洲| 亚州欧美另类| 久久黄人人爽视频| 久久久久921| www四虎| 亚洲av夫妻操穴网| 女人高潮大叫一级毛片| 日韩啊V| 女人18精品一区二区三区| 91女神在线视频| 无码聚合| 国产h片在线观看视频| 国产自制av蜜乳| 久久99九九九九6666免费观看软件| 国产女同性恋视频| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 偷拍片久久| 精品176精品2| 男人精品天堂一区| 91精品操美女| 激情小说亚洲| 69av一区二区三区| 视频在线观看免费一区二区三区| 亚洲乱码国产乱码精网站| 成人无码在线视频网站| 国产精品蜜臀久久久久无码AV| 91天天| 中文字幕精品一区二| 91在线精品一区二区三区| 欧美一级在线观看成人| 高清在线不卡一区二区 视频| 欧美日韩大黄片| 福利社区午夜一区二区| 久草免费在线一区二区| 日本午夜精品理论片A级APP发布| 91成人久久| 色婷婷综合视频| 男人的天堂啪啪啪啪啪蜜桃不卡| 97人人中文网| 啪啪啪综合| av一区二区三区不卡| 日韩欧美一级特黄大片| 国产精品一区二区在钱播放| 伊人影院综合是一个与深夜成人在线 | 99操| 亚洲爽图| 日本激情免费大片| 婷婷丁香六月| 国产精品久久久久久久久久久久久久久久久久 | 丁香五月天社区| 久久精品视频一区三区小泽玛利亚| 亚洲se电影| 麻豆国产精品午夜视频| 天天插天天插| 欧美高清91| 日本三级一区二区 在线| 亚洲熟妇乱女区二区三区| 91 综合网| 亚洲欧洲精品视频发布| 操死我了嗯嗯嗯| 97操97干| 超碰人人在线| 欧美精品一二三| 激情综合五月| 4虎在线观看| 久久久com| 日日日日做夜夜夜夜做无码97| 色操逼网| 伊人9| 亚欧韩av| 欧美情色亚洲| 日本不卡三级网在线播放| 人人人摸人人| 欧美 亚洲 综合 制服 另类| 亚洲成?V人片在线观看福利| 青青草国产一区二区三区| 欧美极品性爱天天射| 黄色小说亚洲| 精品国产久热在线观看| 美女黑人91神马| 黄色香蕉视频网站一区| 色偷综合| 欧美日韩国产中文精品字幕自在自线, | 中文字幕av亚洲精品| 九九九九九九九精品视频| 日韩99999| 97久精品| 中文字幕一区二区三区视频播放| 96精品久久久久久久久久| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 久久xx| 26uuu性| 超碰九7| 色呦色呦色精品| 日本在线一二| 中文字幕精品资源在线| AV乱伦国产| 新怡红院| 蜜桃狠狠色伊人亚洲综合 | 九九人妻| 久久鲁夜| 久久免费老司机精品| 久久久久久AⅤ无码免费肉站| 91美女小视频| juliaann欧美丝袜办公室| 亚洲自拍一区夜夜操| 亚洲乱色视频一区、二区在线| 香蕉久久国产AV一区二区| 大香焦A片| 成人26uuu| 性色A∨91| 男同专区一区二区三区在线| 一本色道人妻久久| 欧美日韩欧美| 综合色一区三区二区| 精精品人妻一区二区三区| 精品久久久久久久| 国产综合久久久麻桃个| 亚洲欧美清纯| 久久这里只有精品9| 老司机福利社视频在线观看| 成人三级片一区二区三区视频| 亚洲有薄码区久久在线一区| 天干天干天干天天做| 精品十八在线观看| 精品久久久久综合无码| 国产精品福利视频| av三级电影在线播放| 国产无码精品成人| 久久久久九九九| 一级A片女人高潮叫床| 逼操网站| 免费黄色A片| 国产熟女完整版中字| 影音先锋新男人| 国产大学生口爆吞精合集| 日本在线一二| 日本不卡一区| 97天天综合网| 国语人妻精彩刺激| 国产精品视频精品一二| 小说区 图片区色 综合区| 日本天堂网| 中文字幕一区 二区三四五 区日 日骚| 97免费在线视频在线观看| 欧美色图 人妻| 加勒比aⅴ| 日本操逼无码| 97色婷| 欧美一区二区三区大综合| 中文字幕久久精品一区| 精品日韩| 深夜操逼网| 蜜乳视频网站| 国产成人无码高清| 不卡六六在线91| 国产18精品亚洲精品| 曰韩香蕉97| 啪啪91| 欧美亚洲中文| 亚洲宗合网| 欧美极度丰满熟妇hd| 亚洲日本大香蕉1| 九九热免费国产视频婷婷伊人五月| 97色色色| 福利五区| 色91综合网| 国产欧美日韩在线不卡第一页| 色偷偷超碰亚洲| 亚洲91少妇| 国产9 9在线 | 亚洲| 超碰97综合网| 三级网站超变态精品| 欧美在线播放aaaa| 国产中文字幕在线点播| 综合自拍| yazhouzaixian| 日韩伦理视频| 亚洲无套久久嗯嗯| 日韩中文字幕视频在线观看| 亚洲欧洲日本精品中文a∨| 干妹子| 欧美成人综合| 久久九七| 中文字幕av久久爽Av| 久9热| 免费观看国产不卡av| 久久9久| 日韩91网| 国产精选视频| 久久亚洲一区女同性恋中文字幕| 欧美日本视频一区| 91女优在线观看| 丝袜美女诱惑 91 视频| 欧美 传媒 麻豆 日韩 偷拍| 欧色综合| 午夜精品久久久久| 日产成人久久| 日曰骚久久精品| 在线视频资源| 欧美黑人熟妇精品91| 粉嫩av一区二区三区天美传媒| 久久久久久久久久久久欧美日| 九X超碰| 人人妻人人色| 中文字幕午夜精品久久久| 久久骚| 麻豆熟妇乱妇熟色A片在线看| 久操视频在线| 免费人成毛片乱码| 国产99热| 人人妻人人操人人乐| 中文字幕国产精品1区| 99.色网| 亚洲免费97免费| 天天天堂影视日韩亚洲91| 欧美色图自拍| 精品国产Av无码久久久亚洲| 亚洲第一免费视频| 欧美色婷婷| 免費人妻夜夜爽天天爽爽一区| 91总综合网| 久久免费精品96| 久久久激情| 国产60页| 日韩精品 视频一区二区| 在线观看日韩av不卡| 天天干一区二区| 久久人妇| 2017av无码免费无线播| 精品超碰国产| 久日91在线| 日本一区二区中文字幕久久| 国产三级中文有码在线视频| 超碰 另类 欧美 | 日本中文字幕熟妇| 天天做天天爱夜夜爽毛片试看| 国产大学生高潮在线播放| 好看的91视频| 久久只有精品| 久久久工口| 狠狠爱夜夜| 婷婷五月天色色| 国产精品一级二级在线| 人妻日日干| 麻豆天美在线喷水AV| a片在线播放| 欧日韩不卡视.频| 亚洲电影91| 亚洲无码成人精品| 综合网久久| 久久久久921| 亚洲一区二区三区播放在线| 屁股久久久久久久久久| 亚洲猛交| 欧美美逼| 日本 情色 1区| 欧美日韩美女精品久草一区二区三区 | 超碰97日韩| 日本一二三免费久久| 久久视频,这里只有精品| 成在线人在线观看视频| 囯产精品强| 不卡六六在线91| 天美传媒精品久久视频| 丝袜色综合| 久久精品六区| 久久九九99| 国产精品高潮久久久无码| 久久久成人国产精品无码| 亚洲中文字幕熟女少妇一区二区| 蜜臀av在线播放一区二区三区| 成人在线视频二区| 91久热| 粉嫩国产精品久久粉嫩| 久久成人国产| 国产亚洲日韩欧| 久久青青草在线视频| 日日嗷| 欧美日韩另类字幕中文| 久久久久久99AV无码免费网站| 少妇丝袜在线观看AV| 琪琪精品免费一区二区三区| 色路综合| 国精综合一二三区影视| 91色狼| 久久成人午夜狠狠| 在线观看A啊啊啊| 丝袜熟女2P| 婷婷91| 伊人久操| 丰满人妻一区二区三区四区| 麻豆国产97在线| 久久日韩肥臀| 国产搭汕a级片| 青青久久久| 欧美少妇高潮久久91| 久久久久9999妇女| 亚洲色图激情小说| 精品久久久久9999| 亚洲最大黄网| 日韩精品人妻中文字幕久久久| 亚洲色图久久成人| 热天堂一区二区| 日韩精品三区四区| 亚洲污一污二| 久久美国毛片| AV中文字幕三四五| 日韩精品一二三| 超碰人妻久久| 中国AV美女| 欧 美 自 拍 偷 拍| 波多野42部无码喷潮在线观看| 国内精品a| 青椒国产97在线熟女| 久久精品三级影视| 人妻啊啊人妻啊| 欧美日动态视频| 综合情欲网| 国产精品电影大全| 深夜国产一区二区三区在线看| 久久精品国产72国产精品福利| 国产CHASE男男GAYGA 毛多色婷婷| 国产高清成人传媒影视| 久久久久骚| 国产吹潮女在线观看| 丝袜亚洲综合| 91操人| 精品99999久久久久久| 国产免费一区| 九九精品99| 久久人妻办公室视频| 少妇色综合| 日韩免费a级毛片无码a∨| 成年人性爱日韩| 激情欧美日韩女同久久| 少妇综合网| 日日操天天操| 人妻91少妇| 小情侣高清国产在线视频| 97日视频| 92性色国产午夜福利在线661| 人妻av在线| 伊人久日| 爱我干综合| 国产精品97超碰| 91高清无码下载| 97操在线| 亚洲 国产 精品一区| 欧洲亚洲人妻无码中字久久三区四区 | 日韩三A大片在线观看| 色综合五月天| 91亚洲综合在线| 亚码激情| 日韩啊V| 东京热av男人的天堂| 欧美自拍偷拍综合图片| 久久99999| 人妻系列无码专区中文有码| 四虎影视 亚洲无码| 国产福利精品最新在线| 九九热国产| 天天摸天天插天天日| 亚洲日韩在线a不卡99精品| 久久人人爽爽爽人久久久| 日本十八禁免费看污网站| 性爱AV天堂| 99人人干| 日韩偷拍一区二区三区| 少妇熟女视频一区二区三区| 99精品在线观看| 综合影院永久入口国产| 久久久久久久久国产| 青青草视频久久| 日韩精品国产一区二区| 婷婷丁香人妻| 欧美日韩人人早| 久久性视频| 成人小说视频在线精品欧美| 99热在线只有精品| 久草资源在线视频官方总站日韩丝袜美腿| 欧美午夜一区二区三区| 人妻性爱一区二区| 亚洲影视高清第一页| 一二三四日本视频高清| 日本网色| 日韩亚洲Av人人夜夜澡人人爽| 亚洲本色精品一区二区久久| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 婷婷五月丁香五月| 亚洲毛片久久| 激情婷婷丁香| 日本护士高潮| 九九玖玖精品| 九九九九热只有精品| 美国美女AV在线| 亚洲91少妇| 国产又大又粗又长视频在线| 久久久专区| 97超碰中文在线| 日韩av一级黄片| 青青草自拍视频在线播放| 欧美熟女逼久久久久久| 精品无码欧美三级| 又黑又大又粗| 1二区9| 91bbb| 十八禁视频网站| 亚洲大色堂| 国产精品网址| av国产无码| 色天堂在线观看| 亚洲乱码精品一区二区| 毛片电影一区二区三区| 人妻丝袜肏逼| 亚州免费啪啪视频| 国产乱弄免费在线视频。| 五月婷亚洲精品天堂| 免费视频无码| 男人天堂资源| 日本黄 R色 成 人网站| 超碰 欧美| 8050午夜少妇无码| 亚洲精品久久一区二区三区蜜桃臀| jizz啪啪| 久插不卡| 2019天天干天天操| 青青草久草AV| 国产精品熟女丝袜一区二区| 欧美中字不卡| 色婷婷视频| 亚洲97| 日韩国产十八禁| 欧美的性爱网站免费| 东京成人一区| 中文字幕亚韩| 人妻久久一区二区三区 | 秋霞一级A片黄色视频| 亚洲国成人情色好看电影| 成年人黄色小视频网站| 亚洲精品蜜桃久久久| www.狠狠操| 日韩簧片免费看| 欧美性第1页| 超碰人人乐97| 91 国产丝袜在线放观看 | 欧亚日韩综合精品国产| 99热线麻豆 | 97人人草| 久操在97| 一本色道久久综合精品婷婷| 国产精品高潮久久久无码| 欧美,日韩综合久久| 色婷婷久久| 亚洲婷婷丁香在线| 强奸a片网| 日本高清熟女久久一区| 国产精品久久久久久久无码AV| 女人爽到高潮潮喷18禁网站| 天堂精品小草| 欧美成人免费在线观看| 综合色图区| 婷婷10月天青娱乐| 精品四五区| 亚洲天堂资源| 欧美日韩岛国大片在线观看| 日韩97视频| 搡老人老9丨女老熟人| 99RE在线视频精品,这里只有精品| 97超碰美女| 立川理惠无码一区二区| 久久熟妇五十路一区| 97综合网| 91日日夜夜| 操学生天天| 91人人爽人人爽| 95人妻爽爽人人做人人澡 | 欧美性爱第一区| 欧美91精品国产自产| 五月天日日操夜夜操| 老女人碰碰在线碰碰视频| 大香蕉免费中文| 99精品久久久久久久婷婷蜜桃| 久久久久久人妻一区精品色欧美| 国产自制av蜜乳| 国产精品不卡少妇白| 久久久久成人网| 91精品国| 人妻少妇无码| 丝袜狠狠草尤物 91| 新视频sss国产| 歐美一級亂黃99在綫精品| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 亚洲AV资源| 亚洲另类久操网| 日韩偷拍色图| 久久综合女优| 综合色拍| 99re在线视频这里只有精品| 超碰久久精品| 丝袜美腿91| 亚洲天堂2020| 日本不卡一区二区| 少妇厨房愉情理伦片bd在线观看| 亚洲av噜噜噜噜噜噜| 国产真乱mangent| 中文字幕交换人妻| 亚洲一区中文字幕一区| 天天爽天天干| 亚洲情色在线| 九九九九九精品| www.99在线| 亚洲影视高清第一页| 日韩欧美经典在线观看| 三级三级三级日本99| 亚洲精品 欧美97色色| 精品成人动漫一区二区| 日本精品国产视频| 国产乱不卡| 国产黄色影片在线观看| JULIA一区二区三区在线播放| 天天色悠悠激情| 国产丁香精品露脸视频 | 69久久久久久久久久久久久| 少妇的嫩逼图片| 曰本人妻人人澡人人夹| 大香蕉男女超碰精品在线| 操逼日韩无码| 欧美曰韩国产精品| 97中文热色| 太久视频| 日韩 欧美 国产 麻豆| 午夜精品久久久久久久久久久久久 | 51一区二区三区| 亚州日韩97| 麻豆天美久久91| 久久婷婷欧美| 日本乱人伦片中文三区| 极品白嫩美女白浆成人福利在线看| 欧美亚洲手机在线| 一区二区三区探花在线观看| 日骚逼视频| 国产福利视频精品视频| 日韩AV电影网站| 欧美丝袜91| 一道本东京热加勒比一区二区三区| 日韩熟女精一区二区三区不卡| 欧美综合骚| 伊人久久综合影院| 成人三一级一片aaa| 欧美日不卡| 东京热一区二区三区四区五区六区| 无码人妻一区二区三区色欲aⅴ | 91久久久久久久久18| 精彩国产视频播放1区2区| 欧亚乱色熟女一区二区| 97干97色| 久久精品一区二区三区蜜桃臀| 五月丁香在线| 一牛影视成人片免费| 91亚洲欧洲| 亚州九九九精品视频| 天天看少妇| 久久久婷婷| 黄色网址在线免费观看| 婷婷五月成人| 少好三P| 色综合国产在线观看| 超碰资源亚洲97| 国产 三级自拍| 日韩99999| 激情综合五| 17c嫩草51久久91嫩草| 亚洲熟妇乱女区二区三区| 午夜成人爽爽爽爽A片李冰冰| 欧美日韩人人早| 日韩在线一区二区| 国产午夜精品一区二区三区牛牛| 日本天堂网| 操逼国产免费| 嗯嗯啊啊啊好爽| 91熟女综合| 曰韩av中文字幕专区| 伊人影院日本| 国产无遮挡| av大香蕉| 日本免费中文字幕在线| 日韩字幕一区| 91偷拍欧美亚洲| 97视频在线| 成人免费性爱视视| 久久香蕉国产线看观看猫咪av| 超碰偷拍| 亚洲精品 欧美精品| 色狠狠综合噜一二三区| 欧美亚洲日本激情在线| 国产美女口爆吞精视频| 爱av免费| 高清无码 国产精品| 99精品视频在线观看免费| 东京热精品97综合网| 亚洲小电影免费涩涩成人在线高清| 欧美中文字幕一区| 蜜乳av一区二区| 午夜精品人妻二区三区| 一级黄色性爱A级片| 97超碰资源网| 成人无码影片视频在线| 中文字幕国产| 麻豆人妻精品一区二区| 久久亚洲AV无码白度| 黄色小说亚洲| 懂色av色欲av蜜臀av| 欧美性视频二区三区| 99视频精品| 天天干天天操天天操夜夜操天天操 | 中文字幕乱妇免费视频| av天天在线观看| 丰满人妻区一区二区三| 91精品国产综合久久久蜜臀| 97色97干| 亚av顶级裸体一区二区三区四区五区| 亚洲乱码尤物193YW| 日本不卡一二区| 97色爱| 上海一级黄片| 久久久成人免费av电影| 96AV精品| 午夜福利精品| 欧美亚洲情色| 骚人妻少妇视频| 黑操B| 人干人人人操人人摸| 美女性91| 97一区二区三区视频| 久久99久久99精品免视看婷婷| 午夜男女爽爽大片免费观看| 国产精品一级二级在线| 老鸭窝亚洲毛片| 亚洲欧洲综合av在线| 精精品人妻一区二区三区| 久久深夜无码| 激情六月天| 久久精品毛片免费不卡| 色五月AV| 97国产精选| 欧美在线啊啊啊| 人妻AV 中文字幕的| 亚洲欧美自拍偷拍| 欧美激情综合| 天天欧美97| 加勒比海成人视频网| 久久亚洲影院一区二区| 日本色色色色色视频| 久久性爱视频免费看| 欧美韩日精品99综合| 久啪| 欧美亚洲丝袜美女电影| 99色在线| 欧美疯狂做爰xxxx| 波多野结衣一级视频| 精品九九| 91白嫩| 啊啊啊啊,啊啊好多水| 美日韩在线不卡人妻| 97干在线看| 国产精品老熟女一区二区| 性做久久久久久免费观看软件| 欧美日韩国产另类综合| 黄色大片视频在线免费看| 国模不卡| 国产黄色视频久久| 91天天看| 丁香九月婷婷| 香蕉99秘 一区精品蜜桃臀| 性色高清..……| 亚洲综合夜色| 欧美天堂亚洲电影院一区在线播放| 岛国小电影| 97久精品| 久jiu久神马影院| 校园春色制服丝袜中文字亚洲| 久久婷婷精品| 91超级碰| 99操| 久久久久人妻| 婷婷月色| 大香蕉97久久| 久久精品视频久久久| 久热色情精品| 色 婷97| 91九九九小逼| 粉嫩小泬久久久一区二区| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 午夜福利在线视频1000| 18岁禁 茉莉成人久久| 亚洲精品欧美专业| 你草精品在线视频| 人妻少妇色综合| 天美传媒av在线| 欧美日日人人天天| 亚洲情色 自拍| 欧美色图 色综合图| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 久操网视频| 国产精品成人无码av无码免费| 国产97视频免费观看| 精品国产肉丝袜在线拍国语| 国产热RE99久久6国产精品首| 超碰av在线| 美女露胸露奶头| 啊啊啊快操我视频| 夜夜操夜夜高潮夜夜爽国产精品区| 超碰 国产熟女精品一区| 黄页网站成人免费| 亚州性9| 国产真乱mangent| 亚洲啪啪视频一区二区| 啊v视频在线观看| 蜜色网色哟哟| 国产欧美成人精品| 久区视频| 久久国产AⅤ| 国产三级日产三级韩国三级| 婷婷五月天成人网| 成人色女网| 五月天欧美色图| 一本久道久久综合狠狠爱一密臀精| 人人人干干人人干| 国产www色在线观看| 日本三级黄页| 色天堂综合| 亚洲中文字幕一区二区| AⅤ片水多多| 一区三区啪啪| 江都AV在线| 久久久天美| 人人看黄色视频| av凤凰久久久| 欧美成人亚洲精品| 亚洲人精品久久久| 99视频这有这里有精品| www久| 97精品国产手机| 九久精品| 亚洲精品一区二区三区在线播放| 午夜精品一区二区三区三上悠亚| 搞中出视频在线观看| 天天伊人| 手机看片1024你懂的国产| 玖玖爱综合| 欧美丝袜亚洲| 欧美国产欧美在线观看| 天天日老熟妇| 亚洲中字慕不卡| 影音先锋少妇| 97人妻色| 暴力av在线| 欧美午夜一区二区三区| 欧美一区二区三区大综合| 久久国产精品m码| 加勒比久久综合网高清| 黑人中出21连凳花野真衣| 亚洲视频精选| 中国亚洲呦女专区| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 99色视频| 青青草导航在线视频| 黄色片,com| 蜜臀在线免费观看在线免费观看| 啊啊啊慢点| 天天色播亚洲综合网站| 亚洲男人的天堂网| 日韩激情无码影院| 国产不卡精品91| 人人妻人人澡人人爽人人精品浪潮| 太久视频| 久久久久斤小| 精品视频免费在线一区| 日韩无码极品| 欧美色偷拍| 九九热九九| 欧美九9 9 9| 玖玖久久久| 可以看的av| 伊色久人大在线| 色五月首页| 男人天堂毛片| 色综合色色| 91n处女在线观看| 色香蕉影院| 欧成人精品一区二区三区| 激情五月天色色| 天天日天天干天天摸天天操| 国产粉嫩出水在线播放| 欧美色图小说综合| 国产做?爰片久久毛片?片美国| 中文在线视频| 熟女视频久久| 日逼97| 天天肏美女| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 色综合91| 国产呦精品系列在线观看| 操我啊啊啊啊啊| 亚洲av综合伊人久久| 97久久免费| 97欧美性爱| 精品人妻久久久| 日韩一级二级| AV乱伦国产| 欧美夜色| 成人免费不卡在线视频| 91色欧美| 人妻在线臀日韩| 久久精品日韩| 色欧美色交综合| 人妻啊啊人妻啊啊| 五月天我淫我色av| 欧美一级专区免费大片| 午夜色婷婷| 久久专区| ai欧美亚洲小说| 欧亚在线视频| 久久专区| 很很很很操| 涩五月婷婷| 黄视频免费| 性欧美第一页| 91黑丝少妇| blacked精品一区国产| 超碰97综合在线| 综合网欧| 激情av| 亚欧免费| 98超碰欧美| 欧美精品第四五页中文字幕在线观看| caoni国产亚洲av| 精品78| 中文一区在线日| 国产精品一二三区福利| 亚洲自拍天堂| 综合色好色| 天天超级碰碰碰| 欧美久久九九| 粉嫩av在线一区二区| 欧美一级A一级a爱片久久| 久草精品一区| 久久久久久久久久久久久久久性生活视频| 欧美一区二区福利在线| 欧美在线电影| 色网综合网| 国产视频一区二区在线观看| 日韩欧美字幕亚洲一区二区| 偷拍 欧美 日韩| 亚洲欧美综合图片| silk lablo在线观看一区二区| 精品区9| 国产成人精品日本视频| 国产精品ⅴ无码大片在线看.| 999热日韩精品| 中文字幕在线2| 青青草亚洲一区 | 一起草高清无码| 亚洲资源吧| 任你干在线视频| 成人综合网 欧美| 综合日本女人伊人| 亚洲欧美中文日韩视频中国语| 51久久夜色精品国产麻豆| 久久9久| 亚洲性天堂| 校园春色美腿丝袜 | 97亚洲综合电影| 操人91| 国产精品自产拍在线观看社区| 看免费的黄片| 视频一区二区免费在线| 啊啊啊啊好多水| 欧洲亚洲人妻无码高清久久三区四区| 4虎在线视频| 亚洲一二三| 久久欧洲| 麻豆婷婷成人一二三| 日韩av三四区| 国产免费内射视频| 欧美色图自拍| 青青青草伊人精品| 超碰在97| 男女性扦B| 日本精品九九九| 粉嫩久久久久| 欧美在线中M| 97欧美色综合| 久久视频,这里只有精品| 怡红院成人av| 91丝袜在线视频| 97丝袜亚洲在线播放| 久久久久久久六六| 国产免费一区| 熟妇一区,二区,三区。| 黄页网站成人免费| 色色97爱| 91w欧美| 国产精品视频内谢女人| 青春草莓视频在线观看网址| a片自拍直播视频| 亚洲男人综合| 久久久久亚洲AV无码专区少妇| 国产性爱在线视频一区二区| 国产熟女完整版中字| 黄色网址在线免费观看| 偷看洗澡一二三区美女| 开心五月婷婷激情|