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

一篇看懂Android與Flutter之間的通信

移動開發(fā) Android
Flutter作為一種跨平臺解決方案,經常會作為一個模塊嵌入到原生Android與iOS應用中,F(xiàn)lutter與Android原生端的通信必不可少。所以本文就來講述一下Android如何與flutter進行通信。

Flutter作為一種跨平臺解決方案,經常會作為一個模塊嵌入到原生Android與iOS應用中,F(xiàn)lutter與Android原生端的通信必不可少。所以本文就來講述一下Android如何與flutter進行通信。

1、架構概述

消息通過平臺通道在native(host)與flutter(client)之間傳遞,如下圖所示:

一篇看懂Android與Flutter之間的通信

為了確保用戶界面能夠正確響應,消息都是以異步的方式進行傳遞。無論是native向flutter發(fā)送消息,還是flutter向native發(fā)送消息。

在flutter中,MethodChannel可以發(fā)送與方法調用相對應的消息。在native平臺上,MethodChannel在Android可以接收方法調用并返回結果。這些類可以幫助我們用很少的代碼就能開發(fā)平臺插件。

注意:本節(jié)內容來自flutter官網,讀者可自行查閱。

2、平臺通道數據類型支持和編解碼器

平臺通道可以使用提供的編解碼器對消息進行編解碼,這些編解碼器支持簡單類似JSON的值的高效二進制序列化,例如布爾值,數字,字符串,字節(jié)緩沖區(qū)以及這些的列表和映射。當你發(fā)送和接收值時,會自動對這些值進行序列化和反序列化。

下表顯示了如何在平臺端接收Dart值,反之亦然:

一篇看懂Android與Flutter之間的通信

關于編解碼器,Android端提供了以下幾種。

  1. BinaryCodec:是最簡單的一種編解碼器,其返回值類型與入參的類型相同,均為二進制格式(ByteBuffer)。由于BinaryCodec在編解碼過程中什么都沒做,只是原封不動的將二進制數據返回。所以傳遞的數據在編解碼時會免于拷貝,這種方式在傳遞的數據量比較大時很有用。比如從Android側傳入一張圖片到Flutter側顯示。
  2. StandardMessageCodec:是BasicMessageChannel的默認編解碼器,支持基礎數據類型、列表及字典等。在編碼時會先將數據寫入到ByteArrayOutputStream流中,然后再將該流中的數據寫入到ByteBuffer中。在解碼時,直接從ByteBuffer中讀取數據。
  3. StandardMethodCodec:是基于StandardMessageCodec的封裝。是MethodChannel與EventChannel的默認編解碼器。
  4. StringCodec:是用于字符串與二進制數據之間的編解碼,其編碼格式為UTF-8。在編碼時會將String轉成byte數組,然后再將該數組寫入到ByteBuffer中。在解碼時,直接從ByteBuffer中讀取數據
  5. JSONMessageCodec:內部調用StringCodec來實現(xiàn)編解碼。
  6. JSONMethodCodec:基于JSONMessageCodec的封裝。可以在MethodChannel與EventChannel中使用。

ByteBuffer是Nio中的一個類,顧名思義——就是一塊存儲字節(jié)的區(qū)域。它有兩個實現(xiàn)類——DirectByteBuffer與HeapByteBuffer,DirectByteBuffer是直接在內存中開辟了一塊區(qū)域來存儲數據,而HeapByteBuffer是在JVM堆中開辟一塊區(qū)域來存儲數據,所以要想數據在DirectByteBuffer中與HeapByteBuffer互通,就需要進行一次拷貝。

3、通信方式

前面講了Android與flutter通信的一些基礎知識,下面就進入正題,來看Android如何與flutter進行通信。

Android與Flutter之間的通信共有四種實現(xiàn)方式。

  1. 由于在初始化flutter頁面時會傳遞一個字符串——route,因此我們就可以拿route來做文章,傳遞自己想要傳遞的數據。該種方式僅支持單向數據傳遞且數據類型只能為字符串,無返回值。
  2. 通過EventChannel來實現(xiàn),EventChannel僅支持數據單向傳遞,無返回值。
  3. 通過MethodChannel來實現(xiàn),MethodChannel支持數據雙向傳遞,有返回值。
  4. 通過BasicMessageChannel來實現(xiàn),BasicMessageChannel支持數據雙向傳遞,有返回值。

下面就來看一下這幾種方式的使用。

3.1、初始化時傳值

主要是利用了創(chuàng)建flutter頁面?zhèn)鬟f的route來做文章,筆者認為該種方式屬于取巧,但還是可以用來傳遞數據。它的使用很簡單,代碼如下。

首先來看Android代碼。

  1. //第三個參數可以換成我們想要字符串。 
  2. FlutterView flutterView = Flutter.createView(this, getLifecycle(), "route"); 

在flutter中,我們只需要通過下面代碼來獲取值即可。

  1. void main() => runApp(MyApp( 
  2.  initParams: window.defaultRouteName, 
  3.  )); 
  4. class MyApp extends StatelessWidget { 
  5.  final String initParams;//既是前面?zhèn)鬟f的值——route 
  6.  MyApp({Key key, @required this.initParams}) : super(keykey); 
  7.  @override 
  8.  Widget build(BuildContext context) {...} 

通過該種方式就可以在初始化flutter時,Android給flutter傳遞數據。由于runApp僅會調用一次,所以該種方式只能傳遞一次數據且數據只能是字符串。

  • 使用window的相關API需要導入包dart:ui

3.2、EventChannel

EventChannel是一種native向flutter發(fā)送數據的單向通信方式,flutter無法返回任何數據給native。主要用于native向flutter發(fā)送手機電量變化、網絡連接變化、陀螺儀、傳感器等。它的使用方式如下。

首先來看Android代碼。

  1. public class EventChannelPlugin implements EventChannel.StreamHandler { 
  2.  private static final String TAG = EventChannelPlugin.class.getSimpleName(); 
  3.  private EventChannel.EventSink eventSink; 
  4.  private Activity activity; 
  5.  static EventChannelPlugin registerWith(FlutterView flutterView) { 
  6.  EventChannelPlugin plugin = new EventChannelPlugin(flutterView); 
  7.  new EventChannel(flutterView, "EventChannelPlugin").setStreamHandler(plugin); 
  8.  return plugin; 
  9.  } 
  10.  private EventChannelPlugin(FlutterView flutterView) { 
  11.  this.activity = (Activity) flutterView.getContext(); 
  12.  } 
  13.  void send(Object params) { 
  14.  if (eventSink != null) { 
  15.  eventSink.success(params); 
  16.  } 
  17.  } 
  18.  void sendError(String str1, String str2, Object params) { 
  19.  if (eventSink != null) { 
  20.  eventSink.error(str1, str2, params); 
  21.  } 
  22.  } 
  23.  void cancel() { 
  24.  if (eventSink != null) { 
  25.  eventSink.endOfStream(); 
  26.  } 
  27.  } 
  28.  //第一個參數為flutter初始化EventChannel時返回的值,僅此一次 
  29.  @Override 
  30.  public void onListen(Object o, EventChannel.EventSink eventSink) { 
  31.  this.eventSink = eventSink; 
  32.  Log.i(TAG, "eventSink:" + eventSink); 
  33.  Log.i(TAG, "Object:" + o.toString()); 
  34.  Toast.makeText(activity, "onListen——obj:" + o, Toast.LENGTH_SHORT).show(); 
  35.  } 
  36.  @Override 
  37.  public void onCancel(Object o) { 
  38.  Log.i(TAG, "onCancel:" + o.toString()); 
  39.  Toast.makeText(activity, "onCancel——obj:" + o, Toast.LENGTH_SHORT).show(); 
  40.  this.eventSink = null
  41.  } 

筆者對Android端代碼做了一個簡單的封裝,還是很好理解的。下面就來看flutter代碼實現(xiàn)。

  1. class _MyHomePageState extends State<MyHomePage> { 
  2.  EventChannel _eventChannelPlugin = EventChannel("EventChannelPlugin"); 
  3.  StreamSubscription _streamSubscription; 
  4.  @override 
  5.  void initState() { 
  6.  _streamSubscription = _eventChannelPlugin 
  7.  //["abc", 123, "你好"]對應著Android端onListen方法的第一個參數,可不傳值 
  8.  .receiveBroadcastStream(["abc", 123, "你好"]) 
  9.  .listen(_onToDart, onError: _onToDartError, onDone: _onDone); 
  10.  super.initState(); 
  11.  } 
  12.  @override 
  13.  void dispose() { 
  14.  if (_streamSubscription != null) { 
  15.  _streamSubscription.cancel(); 
  16.  _streamSubscription = null
  17.  } 
  18.  super.dispose(); 
  19.  } 
  20.  //native端發(fā)送正常數據 
  21.  void _onToDart(message) { 
  22.  print(message); 
  23.  } 
  24.  //當native出錯時,發(fā)送的數據 
  25.  void _onToDartError(error) { 
  26.  print(error); 
  27.  } 
  28.  //當native發(fā)送數據完成時調用的方法,每一次發(fā)送完成就會調用 
  29.  void _onDone() { 
  30.  print("消息傳遞完畢"); 
  31.  } 
  32.  @override 
  33.  Widget build(BuildContext context) {...} 

上面就是通過EventChannel來進行通信的代碼實現(xiàn),調用EventChannelPlugin的send方法就能給flutter發(fā)送數據。

3.3、MethodChannel

MethodChannel是一種native與flutter之間互相發(fā)送數據的通信方式,顧名思義,通過MethodChannel就能調用native與flutter中相對應的方法,該種方式有返回值。它的使用方式如下。

首先來看Android端的代碼實現(xiàn)。

  1. public class MethodChannelPlugin implements MethodChannel.MethodCallHandler { 
  2.  private Activity activity; 
  3.  private MethodChannel channel; 
  4.  public static MethodChannelPlugin registerWith(FlutterView flutterView) { 
  5.  MethodChannel channel = new MethodChannel(flutterView, "MethodChannelPlugin"); 
  6.  MethodChannelPlugin methodChannelPlugin = new MethodChannelPlugin((Activity) flutterView.getContext(), channel); 
  7.  channel.setMethodCallHandler(methodChannelPlugin); 
  8.  return methodChannelPlugin; 
  9.  } 
  10.  private MethodChannelPlugin(Activity activity, MethodChannel channel) { 
  11.  this.activity = activity; 
  12.  this.channel = channel; 
  13.  } 
  14.  //調用flutter端方法,無返回值 
  15.  public void invokeMethod(String method, Object o) { 
  16.  channel.invokeMethod(method, o); 
  17.  } 
  18.  //調用flutter端方法,有返回值 
  19.  public void invokeMethod(String method, Object o, MethodChannel.Result result) { 
  20.  channel.invokeMethod(method, o, result); 
  21.  } 
  22.  @Override 
  23.  public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) { 
  24.  switch (methodCall.method) { 
  25.  case "send"://返回的方法名 
  26.  //給flutter端的返回值 
  27.  result.success("MethodChannelPlugin收到:" + methodCall.arguments); 
  28.  Toast.makeText(activity, methodCall.arguments + "", Toast.LENGTH_SHORT).show(); 
  29.  if (activity instanceof FlutterAppActivity) { 
  30.  ((FlutterAppActivity) activity).showContent(methodCall.arguments); 
  31.  } 
  32.  break; 
  33.  default
  34.  result.notImplemented(); 
  35.  break; 
  36.  } 
  37.  } 

筆者對Android端代碼做了一個簡單的封裝,還是很好理解的。下面就來看flutter代碼實現(xiàn)。

  1. class _MyHomePageState extends State<MyHomePage> { 
  2.  MethodChannel _methodChannel = MethodChannel("MethodChannelPlugin"); 
  3.  @override 
  4.  void initState() { 
  5.  _methodChannel.setMethodCallHandler((handler) => Future<String>(() { 
  6.  print("_methodChannel:${handler}"); 
  7.  //監(jiān)聽native發(fā)送的方法名及參數 
  8.  switch (handler.method) { 
  9.  case "send"
  10.  _send(handler.arguments);//handler.arguments表示native傳遞的方法參數 
  11.  break; 
  12.  } 
  13.  })); 
  14.  super.initState(); 
  15.  } 
  16.  //native調用的flutter方法 
  17.  void _send(arg) { 
  18.  setState(() { 
  19.  _content = arg; 
  20.  }); 
  21.  } 
  22.  String _resultContent = ""
  23.  //flutter調用native的相應方法 
  24.  void _sendToNative() { 
  25.  Future<String> future = 
  26.  _methodChannel.invokeMethod("send", _controller.text); 
  27.  future.then((message) { 
  28.  setState(() { 
  29.  //message是native返回的數據 
  30.  _resultContent = "返回值:" + message; 
  31.  }); 
  32.  }); 
  33.  } 
  34.  @override 
  35.  Widget build(BuildContext context) {...} 

上面就是通過MethodChannel來進行通信的代碼實現(xiàn)。還是比較簡單的。在Android端使用只需要調用MethodChannelPlugin的invokeMethod方法即可。在flutter端使用只需要參考_sendToNative方法的實現(xiàn)即可。

3.4、BasicMessageChannel

BasicMessageChannel是一種能夠在native與flutter之間互相發(fā)送消息的通信方式,它支持數據類型最多,使用范圍最廣。EventChannel與MethodChannel的應用場景可以使用BasicMessageChannel來實現(xiàn),但BasicMessageChannel的應用場景就不一定能夠使用EventChannel與MethodChannel來實現(xiàn)。該方式有返回值。它的使用方式如下。

首先來看Android代碼的實現(xiàn)。

  1. //這里支持的數據類型為String。 
  2. public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> { 
  3.  private Activity activity; 
  4.  private BasicMessageChannel<String> messageChannel; 
  5.  static BasicMessageChannelPlugin registerWith(FlutterView flutterView) { 
  6.  return new BasicMessageChannelPlugin(flutterView); 
  7.  } 
  8.  private BasicMessageChannelPlugin(FlutterView flutterView) { 
  9.  this.activity = (Activity) flutterView.getContext(); 
  10.  this.messageChannel = new BasicMessageChannel<String>(flutterView, "BasicMessageChannelPlugin", StringCodec.INSTANCE); 
  11.  messageChannel.setMessageHandler(this); 
  12.  } 
  13.  @Override 
  14.  public void onMessage(String s, BasicMessageChannel.Reply<String> reply) { 
  15.  reply.reply("BasicMessageChannelPlugin收到:" + s); 
  16.  if (activity instanceof FlutterAppActivity) { 
  17.  ((FlutterAppActivity) activity).showContent(s); 
  18.  } 
  19.  } 
  20.  void send(String str, BasicMessageChannel.Reply<String> reply) { 
  21.  messageChannel.send(str, reply); 
  22.  } 

筆者對Android端代碼做了一個簡單的封裝,還是很好理解的。下面就來看flutter代碼實現(xiàn)。

  1. class _MyHomePageState extends State<MyHomePage> { 
  2.  //StringCodec()為編碼格式 
  3.  BasicMessageChannel<String> _basicMessageChannel = 
  4.  BasicMessageChannel("BasicMessageChannelPlugin", StringCodec()); 
  5.  @override 
  6.  void initState() { 
  7.  _basicMessageChannel.setMessageHandler((message) => Future<String>(() { 
  8.  print(message); 
  9.  //message為native傳遞的數據 
  10.  setState(() { 
  11.  _content = message; 
  12.  }); 
  13.  //給Android端的返回值 
  14.  return "收到Native消息:" + message; 
  15.  })); 
  16.  _controller = TextEditingController(); 
  17.  super.initState(); 
  18.  } 
  19.  //向native發(fā)送消息 
  20.  void _sendToNative() { 
  21.  Future<String> future = _basicMessageChannel.send(_controller.text); 
  22.  future.then((message) { 
  23.  _resultContent = "返回值:" + message; 
  24.  }); 
  25.  } 
  26.  @override 
  27.  Widget build(BuildContext context) {...} 

上面就是通過BasicMessageChannel來進行通信的代碼實現(xiàn)。在Android端只需要調用BasicMessageChannelPlugin的send方法就可以向flutter發(fā)送數據,BasicMessageChannel.Reply是返回值的回調方法。在flutter端使用只需要參考_sendToNative方法的實現(xiàn)即可。

4、通信原理

從分析Android與Flutter通信的源碼來看,實現(xiàn)還是比較簡單的,都是以ByteBuffer為數據載體,然后通過BinaryMessenger來發(fā)送與接收數據。整體設計如下。

一篇看懂Android與Flutter之間的通信

從圖中可以看出,Android側與flutter側采用了相同的設計。前面說過通信時是異步進行的,那么線程切換在哪?其實是在系統(tǒng)底層實現(xiàn)的。在Android與Flutter通信中,系統(tǒng)底層屏蔽了線程切換、數據拷貝等大量復雜操作。使得Android側與flutter側能方便的來進行通信。

在Android側,BinaryMessenger是一個接口,在FlutterView中實現(xiàn)了該接口,在BinaryMessenger的方法中通過JNI來與系統(tǒng)底層溝通。在Flutter側,BinaryMessenger是一個類,該類的作用就是與類window溝通,而類window才真正與系統(tǒng)底層溝通。

5、總結

在Android與Flutter混合開發(fā)模式下,相互之間通信的場景肯定不會少。了解Android與Flutter之間通信的各種方式及使用,有助于選用合理的方式來實現(xiàn)。

最后

如果你看到了這里,覺得文章寫得不錯就給個贊唄?如果你覺得那里值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2021-05-27 05:24:21

云計算數據網絡

2015-11-12 10:40:43

2021-04-09 08:40:51

網絡保險網絡安全網絡風險

2019-04-17 15:16:00

Sparkshuffle算法

2024-06-25 08:18:55

2014-08-08 15:22:20

2024-01-09 12:06:55

MVCC并發(fā)控制MySQL

2024-02-22 17:15:22

JS垃圾回收機制

2015-03-17 10:26:23

2020-04-14 20:40:58

Git內部存儲

2025-06-05 08:15:00

Linux故障排查運維

2022-07-19 19:39:05

RTK技術定位技術

2020-11-20 10:15:05

TensorFlow

2018-01-09 20:35:11

Swift編程語言

2022-05-29 09:14:22

Web主頁WCAG

2017-11-06 10:17:41

CIO信息化安全

2023-03-13 21:38:08

TCP數據IP地址

2025-07-10 02:11:00

毫米波雷達4G

2021-05-14 16:34:12

Semaphore原理

2021-07-02 08:51:28

Vite線程項目
點贊
收藏

51CTO技術棧公眾號

欧美人成在线视频| 制服丝袜亚洲色图| 欧美黑人xxxxx| 一个人看的www日本高清视频| 天天射成人网| 亚洲国产成人精品久久| 国产情侣av自拍| 在线观看午夜av| 91免费观看国产| 成人国产亚洲精品a区天堂华泰| 欧美日韩亚洲国产另类| 亚洲AV无码精品自拍| 在线观看日韩av电影| 亚洲人成亚洲人成在线观看| 亚洲色图欧美自拍| 在线人成日本视频| 亚洲免费观看高清在线观看| 久久草.com| 国产chinasex对白videos麻豆| 国产欧美综合一区二区三区| 俺去啦;欧美日韩| 18禁裸乳无遮挡啪啪无码免费| 9999精品| 色成人在线视频| 国产精品久久久久久久乖乖| 电影在线一区| 99久久婷婷国产综合精品| 国产欧美久久一区二区| 日韩久久中文字幕| 欧美日韩ab| 中文字幕亚洲欧美在线| 久久久久久久久免费看无码| 日韩欧美中文在线观看| 欧美日韩精品一区二区三区四区 | 亚洲精品久久久久久国产精华液| 奇米视频888战线精品播放| 韩国av免费在线| 狠狠色狠狠色综合| 国产欧美欧洲在线观看| 国模私拍一区二区| 久久精品91| 2018国产精品视频| 精品成人久久久| 亚洲精选国产| 欧美激情久久久| 国产精品九九九九九九| 亚洲色图88| 久久亚洲精品视频| 国产天堂av在线| 久久精品国内一区二区三区水蜜桃| 亚洲女同精品视频| 精品人妻一区二区三区香蕉| 欧美亚洲色图校园春色| 亚洲精品乱码久久久久久金桔影视 | 国产激情视频在线观看| 国产精品久久久久久久岛一牛影视 | 免费成人av| 精品中文字幕久久久久久| 免费a v网站| 日韩深夜福利| 亚洲精品一区中文字幕乱码| 中文字幕一二三四区| 国产精品极品| 精品国产成人在线影院| 中文字幕18页| 久久夜色精品国产噜噜av小说| 亚洲成色www8888| avtt香蕉久久| 国产欧美日韩影院| 色先锋资源久久综合5566| 最新日韩免费视频| 自拍视频亚洲| 欧美精品18videos性欧美| 国产成人无码精品久久久久| 亚洲一区二区伦理| 国产精品第七影院| 91亚洲精品国偷拍自产在线观看 | 黄色在线免费播放| 伦理一区二区三区| 亚洲深夜福利网站| 久久99久久99精品免费看小说| 中文精品电影| 97av视频在线| 国产九色91回来了| 国产伦精品一区二区三区视频青涩 | 不卡视频在线看| 欧美日韩一区综合| 日本激情视频在线观看| 亚洲一区二区在线观看视频| 日本免费黄视频| 日韩三级一区| 亚洲精品一区二区三区香蕉| 瑟瑟视频在线观看| 亚洲成人日韩| 992tv成人免费影院| 中文字幕视频免费观看| 国产.精品.日韩.另类.中文.在线.播放| 久久草视频在线看| 国产视频一区二区| 色综合视频一区二区三区高清| 一本一道久久a久久综合蜜桃| 成人黄色av网址| 综合国产在线观看| 免费观看一区二区三区毛片 | 亚洲97在线观看| 中文字幕乱码中文字幕| 成人国产视频在线观看| 亚洲午夜精品久久久久久浪潮| 日本在线观看高清完整版| 日本黄色一区二区| zjzjzjzjzj亚洲女人| 欧美日韩高清| 68精品国产免费久久久久久婷婷| 亚洲一区二区激情| 91老师片黄在线观看| 波多野结衣 作品| 一二区成人影院电影网| 亚洲国产精品va在线观看黑人| 亚洲一级二级片| 天堂精品中文字幕在线| 国产青春久久久国产毛片| 中文字幕精品在线观看| 972aa.com艺术欧美| 神马午夜伦理影院| 久久婷婷五月综合色丁香| 亚洲精品动漫100p| 久久久久黄色片| 国精产品一区一区三区mba视频 | 国产精品视频白浆免费视频| 天堂av资源在线| 亚洲卡通动漫在线| 亚洲精品20p| 欧美日韩伦理| 国产国产精品人在线视| 天天在线女人的天堂视频| 亚洲一区二区精品3399| 亚洲综合中文网| 午夜影院欧美| 成人福利网站在线观看| 最新97超碰在线| 欧美伊人久久久久久久久影院| 亚洲av无码一区二区三区观看 | 国产精品理伦片| 手机看片福利日韩| 精品久久久久久久| 国产成人亚洲综合| 国内在线精品| 欧美伊人精品成人久久综合97| 久久av无码精品人妻系列试探| 亚洲免费影视| 精品视频一区在线| 亚洲精品mv| 国产视频亚洲精品| 无码aⅴ精品一区二区三区| 91捆绑美女网站| 国产成人av影视| 欧美日韩一二| 国产视频999| av中文字幕免费在线观看| 亚洲日本韩国一区| 亚洲精品乱码久久久久久动漫| 久久久久美女| 成人黄视频免费| 欧美另类老肥妇| 亚洲欧洲午夜一线一品| 中文字幕av第一页| 国产精品不卡视频| 制服.丝袜.亚洲.中文.综合懂| 欧美日韩亚洲一区三区| 好看的日韩精品| 黄色亚洲网站| 视频一区视频二区国产精品 | 美女视频黄免费的久久| 在线视频一区观看| 77成人影视| 欧美在线观看视频| 日本中文字幕在线视频| 精品裸体舞一区二区三区| 韩国av免费观看| 中文字幕国产一区二区| wwwxxxx在线观看| 国产精品人人爽人人做我的可爱 | 亚洲国产不卡| 国产精品久久久久久久久婷婷 | 成人福利网站在线观看| 黄色的视频在线观看| 亚洲人午夜色婷婷| 国产乱淫av免费| 欧美日韩一区二区精品| 五月天综合视频| 国产不卡高清在线观看视频| 国产99久久九九精品无码| 国产精品久久久久久久久久10秀| 亚洲精品欧美极品| 中文在线а√天堂| 久久天堂av综合合色| 天天干天天插天天操| 欧美日韩免费高清一区色橹橹| 亚洲国产精品成人无久久精品 | 国产黄色片在线免费观看| 91香蕉视频污在线| 五月天国产视频| 久久午夜av| 成人免费网站入口| 99re6这里只有精品| 国产日韩二区| 精品一区二区三区亚洲| 欧日韩不卡在线视频| 丰满岳乱妇国产精品一区| 在线观看免费一区| 国产香蕉在线视频| 国产精品久久久久桃色tv| 欧美大片免费播放器| 国产精品自产自拍| 91制片厂毛片| 久久久精品五月天| 欧美精品久久久久久久免费| 久久久久久久久久久9不雅视频| 日韩精品久久久毛片一区二区| 风间由美一区二区av101| 91久久在线播放| 日本在线中文字幕一区二区三区| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 亚洲精品456在线播放狼人| 国产成年妇视频| 欧美老人xxxx18| 日韩国产亚洲欧美| 色8久久人人97超碰香蕉987| 免费观看成人毛片| 亚洲第一综合色| 九九久久免费视频| 亚洲码国产岛国毛片在线| 亚洲欧美综合7777色婷婷| 国产亚洲精品bt天堂精选| 国产成人精品无码片区在线| 高清成人免费视频| 91丨porny丨九色| 国内国产精品久久| 五月天丁香花婷婷| 九九**精品视频免费播放| 日韩一级免费片| 免费一级片91| www.久久av.com| 麻豆专区一区二区三区四区五区| www.99在线| 麻豆久久婷婷| 黄色一级一级片| 日日嗨av一区二区三区四区| 玩弄japan白嫩少妇hd| 欧美在线综合| 激情五月婷婷久久| 日韩二区三区四区| 亚洲色图 在线视频| 麻豆一区二区三| 日本美女视频一区| 国产精品1区2区3区在线观看| 97超碰人人看| 成人黄色在线视频| 特级西西人体wwwww| 2023国产一二三区日本精品2022| 人妻丰满熟妇aⅴ无码| 久久网站最新地址| 男女男精品视频网站| 成人免费在线观看入口| 麻豆chinese极品少妇| 亚洲18女电影在线观看| 国产精品自拍99| 欧美中文字幕久久| 国产普通话bbwbbwbbw| 日韩美女天天操| 婷婷开心激情网| 一本一本久久a久久精品综合小说| 97人妻精品一区二区三区动漫 | 人人澡人人澡人人看欧美| 日韩av免费| 99国产超薄肉色丝袜交足的后果| 国产伦精品一区二区三区免费优势 | 成熟了的熟妇毛茸茸| 日韩中文字幕91| 日本一二三四区视频| 99久久精品免费看国产免费软件| 无码一区二区三区在线| 中文字幕一区av| 日韩av电影网| 欧美在线影院一区二区| 国产熟女精品视频| 日韩大陆欧美高清视频区| av在线天堂播放| 欧美夫妻性视频| 日韩精品三区| 高清视频一区二区三区| 国产精品手机在线播放| 美女av免费观看| 日韩精品欧美精品| 欧洲成人午夜精品无码区久久| 久久亚洲免费视频| 国产精品九九九九九九| 欧美在线三级电影| 囯产精品久久久久久| 中文字幕一区电影| 鲁鲁在线中文| 91系列在线播放| 欧美男同视频网| 女人帮男人橹视频播放| 美女网站视频久久| 亚洲国产精品成人综合久久久| 中文字幕中文在线不卡住| 国产福利拍拍拍| 日韩一区国产二区欧美三区| 国产原创av在线| 国外成人性视频| 国产成人免费av一区二区午夜 | 国产在线观看精品一区二区三区| 国产精品玖玖玖在线资源| 中文字幕剧情在线观看一区| 亚洲在线一区| 亚洲香蕉中文网| 亚洲欧美日韩小说| 中文字幕第99页| 亚洲精品中文字| √天堂8资源中文在线| 亚洲综合国产精品| 久久伦理在线| 亚洲欧美激情网| 久久精品人人做人人综合| 国产小视频在线免费观看| 精品福利二区三区| caopeng在线| 91免费国产视频| 999国产精品视频| 午夜免费看视频| 中文字幕乱码日本亚洲一区二区| 日韩精品在线免费视频| 亚洲精品久久久久| av伦理在线| 国产精品久久久久久久久久直播| 欧美日本国产| 日韩高清在线一区二区| 亚洲人成人一区二区在线观看 | 一区二区三区四区视频在线| 日本不卡一区二区三区高清视频| 国产熟妇搡bbbb搡bbbb| 欧美视频免费在线| 免费黄色在线视频网站| 国产91色在线|免| 凹凸成人精品亚洲精品密奴| 国产v亚洲v天堂无码久久久 | 日韩免费三级| 日韩av高清在线观看| 91无套直看片红桃在线观看| 欧美日韩一级片网站| 麻豆91在线| 亚洲aa中文字幕| 最新国产乱人伦偷精品免费网站| 无码国产69精品久久久久网站| 亚洲国产aⅴ天堂久久| 天堂在线观看av| 欧美孕妇性xx| 色琪琪久久se色| www激情五月| 亚洲一区二区欧美日韩| 四虎影视2018在线播放alocalhost| 欧美专区在线观看| 国产欧美日韩视频在线| 午夜免费看毛片| 一区二区三区av电影| 天天综合网在线| 国产ts一区二区| 97精品视频在线看| 免费在线观看日韩av| 婷婷开心激情综合| 国产女人在线观看| 91久久国产综合久久91精品网站| 欧美午夜一区| 中文字幕xxx| 欧美狂野另类xxxxoooo| 日本性爱视频在线观看| 蜜桃av噜噜一区二区三区| 奇米在线7777在线精品| 黄色一级视频免费| 亚洲欧美国产一本综合首页| 伊人亚洲精品| 狠狠干 狠狠操| 国产精品嫩草影院com| 国产91免费看| 国产精品精品视频一区二区三区| 自拍日韩欧美| 伊人网在线视频观看| 欧美一区二区三区男人的天堂| f2c人成在线观看免费视频| 亚洲蜜桃在线| av电影在线观看一区| 一级黄色大片免费| 久久免费视频这里只有精品| 成人一区二区| 国产精品无码专区| 777亚洲妇女| 三上悠亚激情av一区二区三区 | 久久精品网址| 欧美日韩免费做爰视频|