精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

現(xiàn)代化Flutter架構-Riverpod數(shù)據(jù)層

開發(fā) 架構
使用Repository模式來隱藏數(shù)據(jù)層的所有實現(xiàn)細節(jié)(如 JSON 序列化)。這樣,應用程序的其余部分(領域層和表現(xiàn)層)就可以直接處理類型安全的模型類/實體。您的代碼庫也將變得更有彈性,可以抵御您所依賴的包中出現(xiàn)的破壞性變化。

設計模式是幫助我們解決軟件設計中常見問題的有用模板。

說到應用程序架構,結構設計模式可以幫助我們決定如何組織應用程序的不同部分。

在這種情況下,我們可以使用Repository模式從各種來源(如后端 API)訪問數(shù)據(jù)對象,并將它們作為類型安全的實體提供給應用程序的領域層(即我們的業(yè)務邏輯的所在層)。

在本文中,我們將詳細了解Repository Pattern:

  • 它是什么,何時使用
  • 一些實際示例
  • 使用具體類或抽象類的實現(xiàn)細節(jié)及其取舍
  • 如何使用Repository測試代碼

我還將分享一個帶有完整源代碼的天氣應用程序示例。

準備好了嗎?讓我們開始吧!

什么是Repository Pattern?

要理解這一點,讓我們來看看下面的架構圖:

圖片圖片

在這種情況下,Repository位于數(shù)據(jù)層。它們的任務是:

  • 將領域模型(或實體)與數(shù)據(jù)層中數(shù)據(jù)源的實現(xiàn)細節(jié)隔離開來。
  • 將數(shù)據(jù)傳輸對象轉換為領域層可理解的有效實體
  • (可選)執(zhí)行數(shù)據(jù)緩存等操作

?

上圖顯示的只是架構應用程序的多種可能方法之一。如果您采用不同的架構(如 MVC、MVVM 或簡潔架構),情況會有所不同,但概念是相同的。

還要注意的是,Widget屬于表現(xiàn)層,與業(yè)務邏輯或網(wǎng)絡代碼無關。

?

如果您的 widget 直接使用來自 REST API 或遠程數(shù)據(jù)庫的鍵值對,那您就做錯了。換句話說:不要將業(yè)務邏輯與用戶界面代碼混在一起。這會使你的代碼更難測試、調試和推理。

何時使用Repository Pattern?

如果您的應用程序有一個復雜的數(shù)據(jù)層,其中有許多不同的端點返回非結構化數(shù)據(jù)(如 JSON),而您希望將這些數(shù)據(jù)與應用程序的其他部分隔離開來,那么Repository Pattern就非常方便。

廣而言之,以下是我認為最適合使用Repository模式的幾種用例:

  • 與 REST API 通信
  • 與本地或遠程數(shù)據(jù)庫(如 Sembast、Hive、Firestore 等)通信
  • 與特定設備的 API(如權限、攝像頭、位置等)通信

這種方法的一大好處是,如果您使用的任何第三方應用程序接口發(fā)生重大變更,您只需更新版本庫代碼即可。

僅憑這一點,Repository就值得 100%使用。??

讓我們看看如何使用它們!??

實踐中的Repository Pattern

舉個例子,我構建了一個簡單的 Flutter 應用程序(這里是源代碼),從 OpenWeatherMap API 獲取天氣數(shù)據(jù)。

通過閱讀 API 文檔,我們可以找到如何調用 API,以及一些 JSON 格式響應數(shù)據(jù)的示例。

Repository模式非常適合抽象掉所有網(wǎng)絡和 JSON 序列化代碼。

例如,這里有一個抽象類,定義了Repository的接口:

abstract class WeatherRepository {
  Future<Weather> getWeather({required String city});
}

上述 WeatherRepository 只有一個方法,但也可以有更多方法(例如,如果您想支持所有 CRUD 操作)。

重要的是,該Repository允許我們?yōu)椋绾螜z索給定城市的天氣定義一個接口。

我們需要用一個具體類來實現(xiàn) WeatherRepository,該類可以使用網(wǎng)絡客戶端(如 http 或 dio)進行必要的 API 調用:

import 'package:http/http.dart' as http;

class HttpWeatherRepository implements WeatherRepository {
  HttpWeatherRepository({required this.api, required this.client});
  // custom class defining all the API details
  final OpenWeatherMapAPI api;
  // client for making calls to the API
  final http.Client client;

  // implements the method in the abstract class
  Future<Weather> getWeather({required String city}) {
    // TODO: send request, parse response, return Weather object or throw error
  }
}

所有這些實現(xiàn)細節(jié)都與數(shù)據(jù)層有關,應用程序的其他部分不應該關心或知道這些細節(jié)。解析 JSON 數(shù)據(jù) 當然,我們還必須定義氣象模型類(或實體),以及用于解析 API 響應數(shù)據(jù)的 JSON 序列化代碼:

class Weather {
  // TODO: declare all the properties we need
  factory Weather.fromJson(Map<String, dynamic> json) {
    // TODO: parse JSON and return validated Weather object
  }
}

請注意,雖然 JSON 響應可能包含許多不同的字段,但我們只需要解析將在用戶界面中使用的字段。我們可以手動編寫 JSON 解析代碼,或者使用代碼生成包(如 Freezed)。

在應用程序中初始化Repository

一旦定義了Repository,我們就需要一種方法來初始化它,并使應用程序的其他部分可以訪問它。執(zhí)行此操作的語法會根據(jù)您選擇的 DI/狀態(tài)管理解決方案而改變。下面是一個使用 get_it 的示例:

import 'package:get_it/get_it.dart';

GetIt.instance.registerLazySingleton<WeatherRepository>(
  () => HttpWeatherRepository(api: OpenWeatherMapAPI(), client: http.Client(),
);

下面是另一個使用 Riverpod 軟件包中的提供程序的例子:

import 'package:flutter_riverpod/flutter_riverpod.dart';

final weatherRepositoryProvider = Provider<WeatherRepository>((ref) {
  return HttpWeatherRepository(api: OpenWeatherMapAPI(), client: http.Client());
});

如果你喜歡 flutter_bloc 軟件包,這里也有相應的功能:

import 'package:flutter_bloc/flutter_bloc.dart';

RepositoryProvider<WeatherRepository>(
  create: (_) => HttpWeatherRepository(api: OpenWeatherMapAPI(), client: http.Client()),
  child: MyApp(),
))

底層是一樣的:一旦初始化了Repository,就可以在應用程序的其他任何地方(Widget、模塊、Controller等)訪問它。

抽象類還是具體類?

在創(chuàng)建Repository時,一個常見的問題是:你真的需要一個抽象類嗎?這是個非常合理的問題,因為在兩個類中添加越來越多的方法可能會變得相當乏味:

abstract class WeatherRepository {
  Future<Weather> getWeather({required String city});
  Future<Forecast> getHourlyForecast({required String city});
  Future<Forecast> getDailyForecast({required String city});
  // and so on
}

class HttpWeatherRepository implements WeatherRepository {
  HttpWeatherRepository({required this.api, required this.client});
  // custom class defining all the API details
  final OpenWeatherMapAPI api;
  // client for making calls to the API
  final http.Client client;

  Future<Weather> getWeather({required String city}) { ... }
  Future<Forecast> getHourlyForecast({required String city}) { ... }
  Future<Forecast> getDailyForecast({required String city}) { ... }
  // and so on
}

正如軟件設計中經(jīng)常出現(xiàn)的情況一樣,答案是:視情況而定。

因此,讓我們來看看每種方法的優(yōu)缺點。

使用抽象類

優(yōu)點:我們可以在一個地方看到Repository的接口,而不會感到雜亂無章。

優(yōu)點:我們可以將Repository換成完全不同的實現(xiàn)(例如 DioWeatherRepository 而不是 HttpWeatherRepository),只需修改一行初始化代碼,因為應用程序的其他部分只知道 WeatherRepository。

缺點:當我們 “跳轉到引用 ”時,VSCode 會有點困惑,它會把我們帶到抽象類中的方法定義,而不是具體類中的實現(xiàn)。

缺點:更多模板代碼。

只使用具體類

優(yōu)點:減少模板代碼。

優(yōu)點:“跳轉到引用 ”只適用于一個類中的Repository方法。

缺點:如果我們更改了Repository名稱,那么切換到不同的實現(xiàn)就需要進行更多更改(不過使用 VSCode 對整個項目進行重命名很容易)。

在決定使用哪種方法時,我們還應考慮如何為代碼編寫測試。

使用Repository編寫測試代碼

在測試過程中,一個常見的要求是將網(wǎng)絡代碼換成模擬代碼或 “偽代碼”,這樣我們的測試就能運行得更快、更可靠。

然而,抽象類并不能給我們帶來任何優(yōu)勢,因為在 Dart 中,所有類都有一個隱式接口。

這意味著我們可以這樣做:

// note: in Dart we can always implement a concrete class
class FakeWeatherRepository implements HttpWeatherRepository {

  // just a fake implementation that returns a value immediately
  Future<Weather> getWeather({required String city}) { 
    return Future.value(Weather(...));
  }
}

換句話說,如果我們打算在測試中模擬我們的Repository,就沒有必要創(chuàng)建抽象類。事實上,像 mocktail 這樣的包就利用了這一點,我們可以這樣使用它們:

import 'package:mocktail/mocktail.dart';

class MockWeatherRepository extends Mock implements HttpWeatherRepository {}

final mockWeatherRepository = MockWeatherRepository();
when(() => mockWeatherRepository.getWeather('London'))
          .thenAnswer((_) => Future.value(Weather(...)));

模擬數(shù)據(jù)源

在編寫測試時,可以模擬Repository并返回預制響應,就像我們上面做的那樣。但還有另一種方法,那就是模擬底層數(shù)據(jù)源。讓我們回顧一下 HttpWeatherRepository 是如何定義的:

import 'package:http/http.dart' as http;

class HttpWeatherRepository implements WeatherRepository {
  HttpWeatherRepository({required this.api, required this.client});
  // custom class defining all the API details
  final OpenWeatherMapAPI api;
  // client for making calls to the API
  final http.Client client;

  // implements the method in the abstract class
  Future<Weather> getWeather({required String city}) {
    // TODO: send request, parse response, return Weather object or throw error
  }
}

在這種情況下,我們可以選擇模擬傳遞給 HttpWeatherRepository 構造函數(shù)的 http.Client 對象。下面是一個測試示例,展示了如何做到這一點:

import 'package:http/http.dart' as http;
import 'package:mocktail/mocktail.dart';

class MockHttpClient extends Mock implements http.Client {}

void main() {
  test('repository with mocked http client', () async {
    // setup
    final mockHttpClient = MockHttpClient();
    final api = OpenWeatherMapAPI();
    final weatherRepository =
        HttpWeatherRepository(api: api, client: mockHttpClient);
    when(() => mockHttpClient.get(api.weather('London')))
        .thenAnswer((_) => Future.value(/* some valid http.Response */));
    // run
    final weather = await weatherRepository.getWeather(city: 'London');
    // verify
    expect(weather, Weather(...));
  });
}

最后,你可以根據(jù)要測試的內容,選擇是模擬Repository本身還是模擬底層數(shù)據(jù)源。

了解了如何測試版本庫之后,讓我們回到最初關于抽象類的問題上來。

Repository可能不需要抽象類

一般來說,如果你需要許多符合相同接口的實現(xiàn),創(chuàng)建抽象類是有意義的。

例如,在 Flutter SDK 中,StatelessWidget 和 StatefulWidget 都是抽象類,因為它們可以被子類化。

但在使用Repository時,您可能只需要一個給定Repository的實現(xiàn)。

您很可能只需要一個特定Repository的實現(xiàn),您可以將其定義為一個單一的具體類。

最小公分母

把所有東西都放在接口后面,也會使你不得不在具有不同功能的 API 之間選擇最小公分母。

也許某個 API 或后端支持實時更新,這可以用基于 Stream 的 API 來建模。

但如果您使用的是純 REST(不含 websockets),您只能發(fā)送一個請求并獲得一個響應,這最好使用基于 Future 的 API 來建模。

處理這個問題非常簡單:只需使用基于流的 API,如果使用的是 REST,則只需返回包含一個值的流即可。

但有時會存在更廣泛的 API 差異。

例如,F(xiàn)irestore 支持事務和批量寫入。這類 API 在源碼中使用了構建器模式,而這種模式不容易抽象為通用接口。

如果遷移到不同的后端,新的 API 很可能會有很大不同。換句話說,面向未來的當前應用程序接口往往不切實際,而且會適得其反。

Repository橫向擴展

隨著應用程序的增長,您可能會發(fā)現(xiàn)自己向給定的Repository中添加的方法越來越多。

如果您的后端有很大的 API 列表,或者如果您的應用程序連接到許多不同的數(shù)據(jù)源,就可能出現(xiàn)這種情況。

在這種情況下,可以考慮創(chuàng)建多個Repository,將相關的方法放在一起。例如,如果您正在構建一個電子商務應用程序,您可以為產(chǎn)品列表、購物車、訂單管理、身份驗證、結賬等創(chuàng)建單獨的Repository。

保持簡單

與往常一樣,保持簡單總是個好主意。因此,不要對應用程序接口想得太多。

您可以根據(jù)您需要使用的 API 來構建您的版本庫接口模型,然后就可以收工了。如果需要,您可以隨時重構。??

結論

如果我想讓你從這篇文章中得到什么啟發(fā),那就是:使用Repository模式來隱藏你的代碼:

使用Repository模式來隱藏數(shù)據(jù)層的所有實現(xiàn)細節(jié)(如 JSON 序列化)。這樣,應用程序的其余部分(領域層和表現(xiàn)層)就可以直接處理類型安全的模型類/實體。您的代碼庫也將變得更有彈性,可以抵御您所依賴的包中出現(xiàn)的破壞性變化。

如果說有什么收獲的話,我希望這篇概述能鼓勵您更清晰地思考應用程序架構,以及擁有邊界清晰的獨立表現(xiàn)層、應用層、領域層和數(shù)據(jù)層的重要性。

本文翻譯自:https://codewithandrea.com/articles/flutter-repository-pattern/

責任編輯:武曉燕 來源: 群英傳
相關推薦

2023-02-08 11:07:56

數(shù)字時代數(shù)字運營模式

2023-06-25 09:04:12

數(shù)字企業(yè)架構EA

2025-08-08 07:18:00

CIOIT架構IT服務管理

2020-08-05 07:00:00

數(shù)據(jù)架構工具技術

2021-04-13 16:13:38

大數(shù)據(jù)教育科學

2024-01-23 15:21:14

2013-03-22 10:27:40

企業(yè)再現(xiàn)代化IBM論壇2013

2022-07-26 06:57:07

數(shù)據(jù)管道端點API

2018-06-05 13:43:49

數(shù)據(jù)基礎設施

2022-07-11 05:34:19

云原生應用程序

2015-10-29 14:35:21

移動設備現(xiàn)代化

2019-08-30 08:23:47

基礎架構IT架構數(shù)據(jù)備份

2017-11-06 14:48:01

大數(shù)據(jù)法醫(yī)犯罪

2015-12-24 10:33:31

數(shù)據(jù)中心現(xiàn)代數(shù)據(jù)中心

2025-10-10 08:00:00

2017-11-23 05:50:14

2023-08-18 08:07:37

2020-06-05 14:16:05

醫(yī)藥
點贊
收藏

51CTO技術棧公眾號

好吊日精品视频| 中文字幕这里只有精品| 国产在线麻豆精品观看| 久久精品视频在线播放| 五月花丁香婷婷| 青草在线视频在线观看| 成人国产精品免费观看动漫| 欧美一级淫片aaaaaaa视频| 国产精品熟妇一区二区三区四区| aa国产成人| 久久午夜电影网| 91精品国产综合久久久久久久久 | 免费成人深夜蜜桃视频| 国产精品igao视频网网址不卡日韩| 亚洲精品第1页| 国产一区免费视频| 瑟瑟视频在线免费观看| 欧美激情自拍| 国产丝袜一区二区三区免费视频| 一区二区三区 欧美| 精品麻豆一区二区三区| 99视频热这里只有精品免费| 国产精品黄色av| 国产一级视频在线播放| 成久久久网站| 精品国产免费视频| 天天碰免费视频| 羞羞视频在线免费国产| 91女厕偷拍女厕偷拍高清| 国产欧美va欧美va香蕉在| 日本学生初尝黑人巨免费视频| 国产成人精品一区二区免费看京 | 不卡视频一二三| 国产精品福利在线观看| 精品无码人妻一区二区三区| 日韩精品午夜| 日韩电影免费观看在线观看| 不用播放器的免费av| 丁香高清在线观看完整电影视频| 中文字幕国产一区| 极品尤物一区二区三区| 国产露脸国语对白在线| 久久在线91| 国内免费久久久久久久久久久| 久久久久无码精品国产sm果冻| 亚洲精品aⅴ| 欧美日韩成人综合| 免费大片在线观看| av在线最新| 国产精品久久久久久久浪潮网站 | 亚洲精品视频网| 久久99精品久久久久久国产越南| 热99精品里视频精品| 黄网站免费在线| 日韩电影免费在线观看| 91精品国产黑色紧身裤美女| 久久久精品三级| 二区三区不卡| 天天影视网天天综合色在线播放| 国产精品igao激情视频| 中文字幕在线播放| 久久久久国产一区二区三区四区| 亚洲最大av网| 99久久国产免费| 久久99九九99精品| 成人黄色在线播放| 在线免费一级片| 美女免费视频一区二区| 国产精品久久视频| 亚洲av无码乱码国产精品fc2| 久久三级视频| 国产精品1234| 中文字幕av在线免费观看| 性感少妇一区| 日本一区二区三区在线播放| 精品少妇爆乳无码av无码专区| 欧美一区二区三区久久精品茉莉花| 爽爽爽爽爽爽爽成人免费观看| 激情高潮到大叫狂喷水| 97久久视频| 免费不卡欧美自拍视频| 北条麻妃在线观看视频| 久久精品亚洲欧美日韩精品中文字幕| 精品国产一区二区三区久久| 久久久久久久毛片| 日韩久久精品| 麻豆国产精品va在线观看不卡 | 国产大片一区二区三区| 国产精区一区二区| 日韩精品一区二区三区视频在线观看| 在线看免费毛片| 日韩一区二区三区精品| 精品国内二区三区| 欧美高清性xxxx| 欧美色女视频| 欧美成人免费在线视频| 九九热国产视频| 日韩精品一区第一页| 成人精品福利视频| 乱色精品无码一区二区国产盗| 99re视频精品| 日韩一区不卡| 国产成人在线视频免费观看| 亚洲国产成人高清精品| 国产淫片免费看| 国产欧美在线观看免费| 欧美不卡一区二区三区四区| 51调教丨国产调教视频| 国产区精品区| 欧美裸体xxxx极品少妇| 国产乱码久久久久久| 视频一区二区中文字幕| 91在线视频免费| 污视频网站免费观看| 中文字幕av一区 二区| 久久久99精品视频| 日韩福利一区| 日韩精品中文字幕在线一区| 国产精品高清无码在线观看| 欧美黄免费看| 国产精品xxx视频| 亚洲AV无码成人片在线观看| 久久久精品欧美丰满| 欧美a级免费视频| 精品123区| 日韩av综合网站| 黄色片网站在线播放| 9色精品在线| 91麻豆国产精品| 欧美性孕妇孕交| 一区二区三区资源| 日本人视频jizz页码69| 欧美日韩一区二区三区在线电影| 精品国产一区二区三区久久久狼 | 人妻 丝袜美腿 中文字幕| 国产欧美一区| 91高清视频免费观看| 国产三级漂亮女教师| 欧美激情在线一区二区三区| 欧美黑人经典片免费观看| 日本精品视频| 久久深夜福利免费观看| 亚洲av无码乱码国产精品fc2| 成人动漫在线一区| 超碰97在线看| 欧洲精品久久久久毛片完整版| 亚洲天堂av在线免费观看| 日韩网红少妇无码视频香港| jizzjizz在线观看| 国产精品久久久久久久久久免费看 | 伊人久久综合视频| 久久er精品视频| 欧美一区二区综合| 国产盗摄精品一区二区酒店| 91.com在线观看| 国产精品久久久久久成人| 国产精品视频| 国产乱码精品一区二区三区中文| av网站大全在线| 欧美男男青年gay1069videost | 亚洲精品成人av| 亚洲国产精品久| 精品一区二区三区在线观看国产 | 性色av一区二区三区四区| 26uuu亚洲| 黄色一级片播放| 日韩系列在线| 青青久久aⅴ北条麻妃| 天天综合网天天综合| 亚洲v日本v欧美v久久精品| 中文字幕亚洲日本| 欧美视频一区| 国产精品免费在线播放| 俺来俺也去www色在线观看| 日韩免费看网站| 免费看一级一片| 成人精品视频一区二区三区尤物| 国产尤物av一区二区三区| 7777精品| 欧美性视频在线| 青青久草在线| 欧美亚洲动漫另类| 亚洲a∨无码无在线观看| 麻豆国产欧美一区二区三区| 永久免费精品视频网站| 欧美h版在线观看| 欧美精品videosex牲欧美| 黄色片一区二区| 一区二区三区四区精品在线视频 | 久久狠狠一本精品综合网| 久久亚洲综合网| 国产精品伊人| 欧美风情在线观看| 日日夜夜精品免费| 色拍拍在线精品视频8848| 你懂得视频在线观看| 国产一区不卡视频| 97视频久久久| 精品日产免费二区日产免费二区| 成人妇女淫片aaaa视频| 久久www人成免费看片中文| 日韩精品免费电影| 中文字幕日韩第一页| 伊人开心综合网| 女人被狂躁c到高潮| 蜜臀av性久久久久av蜜臀妖精| 自拍偷拍视频在线| 群体交乱之放荡娇妻一区二区| 国产精品国产自产拍高清av水多| 97视频在线观看网站| 欧美丝袜自拍制服另类| 久久久久久久久久久网| 久久久久久久久久看片| 午夜免费福利网站| 夜夜夜久久久| 裸体裸乳免费看| 欧美极品在线观看| 91久色国产| 色8久久影院午夜场| 欧美大片在线影院| av一区在线观看| 精品美女在线播放| 中文字幕欧美人妻精品一区蜜臀| 亚洲无线码一区二区三区| 奇米网一区二区| 成人动漫av在线| 亚洲视频第二页| 国产一区二区三区成人欧美日韩在线观看 | 国产一区成人| 国产精品一二三在线观看| 国产欧美日韩| www.成人av| 日韩色性视频| 国产suv精品一区二区三区88区| 先锋影音在线资源站91| 国产午夜精品视频| 天天射天天操天天干| 日韩一卡二卡三卡| 怡春院在线视频| 岛国精品视频在线播放| 久久精品99久久久久久| 国产精品电影院| 日本护士做爰视频| 成人美女在线视频| 四虎成人在线播放| 老司机免费视频一区二区三区| 国产亚洲综合视频| 99精品国产一区二区青青牛奶| 乱子伦一区二区| 97精品国产| 影音先锋在线亚洲| 亚洲综合图色| 国内精品久久久久久久果冻传媒| 精品国产亚洲一区二区三区| 国产乱肥老妇国产一区二| 91九色综合| 国产精品久久久久秋霞鲁丝| 三级成人在线| 国产精品免费小视频| 欧美黑人疯狂性受xxxxx野外| 91精品国产高清自在线| 91探花在线观看| 久久久久久一区二区三区| 日日夜夜天天综合入口| 欧美成人性生活| 午夜伦理在线视频| 欧美裸体男粗大视频在线观看| 中文在线观看免费| 不卡av在线播放| a级片国产精品自在拍在线播放| 美女视频久久黄| 天堂8中文在线| 久久久久久久久久久av| 高h视频在线播放| 69视频在线免费观看| 人人草在线视频| 久久久久久91| 黄网在线免费看| 国模视频一区二区三区| 午夜不卡影院| 人妖精品videosex性欧美| 写真福利精品福利在线观看| 国产欧美在线视频| 国语精品视频| 5g国产欧美日韩视频| 精品国产亚洲一区二区三区在线| 91入口在线观看| 欧美jizz19性欧美| 青娱乐国产91| 亚洲成av人片乱码色午夜| 日本a在线天堂| 国产欧美综合一区二区三区| 999精品网站| 国内精品免费**视频| 最新国产精品自拍| 国产亚洲短视频| 欧美一级片在线视频| 亚洲影院理伦片| 波多野结衣一二区| 日韩一区二区免费视频| 亚洲av成人精品一区二区三区在线播放| 亚洲精选一区二区| 美女隐私在线观看| 午夜精品蜜臀一区二区三区免费| 国产伦理精品| 成人av在线亚洲| 免费看久久久| 亚洲在线视频一区二区| 亚洲经典自拍| 15—17女人毛片| 久久99蜜桃精品| av黄色一级片| 中文字幕欧美一| 青青国产在线观看| 欧美高清激情brazzers| 色婷婷视频在线| 视频在线观看一区二区| 日韩欧美精品一区二区三区| 国产精品免费观看在线| 成人h动漫精品一区二区器材| 日韩国产在线一区| 黄色欧美成人| 在线看免费毛片| 久久美女艺术照精彩视频福利播放 | 中文在线日韩| 无码人妻丰满熟妇区毛片| 国产成人综合亚洲91猫咪| 久久丫精品忘忧草西安产品| 一区二区三区欧美| 亚洲一区中文字幕永久在线| 精品久久久久久久人人人人传媒| 国产高清视频在线观看| 久久久亚洲国产| 国产午夜亚洲精品一级在线| 欧美精品一区在线发布| 2024短剧网剧在线观看| 17婷婷久久www| 国产成人在线中文字幕| 久久精品在线免费视频| 韩国三级在线一区| 69夜色精品国产69乱| 欧美精品成人一区二区三区四区| 午夜免费视频在线国产| 国产精品私拍pans大尺度在线| 成人精品久久| 玖玖爱视频在线| 日韩毛片在线免费观看| 国产精品视频一二区| x99av成人免费| 高清精品久久| 乱熟女高潮一区二区在线| 大白屁股一区二区视频| 国产无遮挡又黄又爽在线观看| 欧美tickling网站挠脚心| 男人天堂亚洲| 国产在线精品一区| 国产精品久久久久毛片大屁完整版 | 韩国女主播成人在线观看| 黄大色黄女片18免费| 欧美日韩一区 二区 三区 久久精品| 婷婷免费在线视频| 亚洲综合av影视| 一区在线免费| 一区二区三区少妇| 色婷婷av一区二区三区之一色屋| 福利成人在线观看| 国产主播欧美精品| 国产精品地址| 蜜桃精品成人影片| 欧美性猛片xxxx免费看久爱| 国产在线观看免费麻豆| http;//www.99re视频| 国产欧美大片| 99自拍偷拍视频| 日韩欧美国产综合在线一区二区三区 | 亚洲一区 中文字幕| 欧美成年人视频网站| 另类在线视频| 一区二区三区免费播放| 亚洲码国产岛国毛片在线| 天天干,天天操,天天射| 国产精品久久一区| 国色天香一区二区| 成人性生交大免费看| 欧美日韩成人综合天天影院 | 亚洲电影第三页| 精品资源在线看| 91免费版黄色| 久久九九精品| 农村妇女精品一区二区| 亚洲精品国产综合区久久久久久久| 成人免费网站www网站高清| 青青草影院在线观看| 2020国产精品| 国产高清视频免费观看| 热99精品里视频精品| 欧美精品一线| 日韩毛片无码永久免费看| 日韩免费视频一区| 久久久久久一区二区三区四区别墅|