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

寫給前端工程師的Flutter詳細教程

新聞 前端
最愛折騰的就是前端工程師了,從 jQuery 折騰到 AngularJs,再折騰到 Vue、React。最愛跨屏的也是前端工程師,從 phonegap,折騰到 React Native,這不又折騰到了 Flutter。

最愛折騰的就是前端工程師了,從 jQuery 折騰到 AngularJs,再折騰到 Vue、React。最愛跨屏的也是前端工程師,從 phonegap,折騰到 React Native,這不又折騰到了 Flutter。

圖啥?

低成本地為用戶帶來更優秀的用戶體驗。

目前來說Flutter可能是其中最優秀的一種方案了。 

Flutter 是什么?

Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.

Flutter是由原 Google Chrome 團隊成員,利用 Chrome 2D 渲染引擎,然后精簡 CSS 布局演變而來。

写给前端工程师的 Flutter 详细教程

或者更詳細的版本

写给前端工程师的 Flutter 详细教程

  • Flutter 在各個原生的平臺中,使用自己的 C++的引擎渲染界面,沒有使用 webview,也不像 RN、NativeScript 一樣使用系統的組件。簡單來說平臺只是給 Flutter 提供一個畫布。
  • 界面使用 Dart 語言開發,貌似唯一支持 JIT,和 AOT 模式的強類型語言。
  • 寫法非常的現代,聲明式,組件化,Composition > inheritance,響應式……就是現在前端流行的這一套 😄
  • 一套代碼搞定所有平臺。

Flutter 為什么快?Flutter 相比 RN 的優勢在哪里?

從架構中實際上已經能看出 Flutter 為什么快,至少相比之前的當紅炸子雞 React Native 快的原因了。

  • Skia 引擎,Chrome, Chrome OS,Android,Firefox,Firefox OS 都以此作為渲染引擎。
  • Dart 語言可以 AOT 編譯成 ARM Code,讓布局以及業務代碼運行的最快,而且 Dart 的 GC 針對 Flutter 頻繁銷毀創建 Widget 做了專門的優化。
  • CSS 的的子集 Flex like 的布局方式,保留強大表現能力的同時,也保留了性能。
  • Flutter 業務書寫的 Widget 在渲染之前 diff 轉化成 Render Object,對,就像 React 中的 Virtual DOM,以此來確保開發體驗和性能。

而相比 React Native:

  • RN 使用 JavaScript 來運行業務代碼,然后 JS Bridge 的方式調用平臺相關組件,性能比有損失,甚至平臺不同 js 引擎都不一樣。
  • RN 使用平臺組件,行為一致性會有打折,或者說,開發者需要處理更多平臺相關的問題。

而具體兩者的性能測試,可以看這里,結論是 Flutter,在 CPU,FPS,內存穩定上均優于 ReactNative。

Dart 語言

在開始 Flutter 之前,我們需要先了解下 Dart 語言……

Dart 是由 Google 開發,最初是想作為 JavaScript 替代語言,但是失敗沉寂之后,作為 Flutter 獨有開發語言又煥發了第二春 😂。

實際上即使到了 2.0,Dart 語法和 JavaScriptFlutter非常的相像。單線程,Event Loop……

写给前端工程师的 Flutter 详细教程

當然作為一篇寫給前端工程師的教程,我在這里只想寫寫 JavaScript 中暫時沒有的,Dart 中更為省心,也更“甜”的東西。

  • 不會飄的this
  • 強類型,當然前端現在有了 TypeScript 😬
  • 強大方便的操作符號:
  • ?. 方便安全的foo?.bar取值,如果 foo 為null,那么取值為null
  • ?? condition ? expr1 : expr2 可以簡寫為expr1 ?? expr2
  • =和其他符號的組合: *=、~/=、&=、|= ……
  • 級聯操作符(Cascade notation ..)
  1. // 想想這樣省了多少變量聲明  
  2. querySelect('#button')  
  3.  ..text ="Confirm"  
  4.  ..classes.add('important')  
  5.  ..onClick.listen((e) => window.alert('Confirmed'))  

甚至可以重寫操作符

  1. class Vector { 
  2.   final int x, y; 
  3.   Vector(this.x, this.y); 
  4.  
  5.   Vector operator +(Vector v) => Vector(x + v.x, y + v.y); 
  6.   Vector operator -(Vector v) => Vector(x - v.x, y - v.y); 
  7.  
  8.   // Operator == and hashCode not shown. For details, see note below. 
  9.   // ··· 
  10.  
  11. void main() { 
  12.   final v = Vector(23); 
  13.   final w = Vector(22); 
  14.  
  15.   assert(v + w == Vector(45)); 
  16.   assert(v - w == Vector(01)); 

注:重寫==,也需要重寫 Object hashCodegetter

  1. class Person { 
  2.   final String firstName, lastName; 
  3.   Person(this.firstName, this.lastName); 
  4.  
  5.   // Override hashCode using strategy from Effective Java, 
  6.   // Chapter 11. 
  7.   @override 
  8.   int get hashCode { 
  9.     int result = 17
  10.     result = 37 * result + firstName.hashCode; 
  11.     result = 37 * result + lastName.hashCode; 
  12.     return result; 
  13.   } 
  14.  
  15.   // You should generally implement operator == if you 
  16.   // override hashCode. 
  17.   @override 
  18.   bool operator ==(dynamic other) { 
  19.     if (other is! Person) return false
  20.     Person person = other; 
  21.     return (person.firstName == firstName && 
  22.         person.lastName == lastName); 
  23.   } 
  24.  
  25. void main() { 
  26.   var p1 = Person('Bob''Smith'); 
  27.   var p2 = Person('Bob''Smith'); 
  28.   var p3 = 'not a person'
  29.   assert(p1.hashCode == p2.hashCode); 
  30.   assert(p1 == p2); 
  31.   assert(p1 != p3); 

這點在 diff 對象的時候尤其有用。

lsolate

Dart 運行在獨立隔離的 iSolate 中就類似 JavaScript 一樣,單線程事件驅動,但是 Dart 也開放了創建其他 isolate,充分利用 CPU 的多和能力。

  1. loadData() async { 
  2.    // 通過spawn新建一個isolate,并綁定靜態方法 
  3.    ReceivePort receivePort =ReceivePort(); 
  4.    await Isolate.spawn(dataLoader, receivePort.sendPort); 
  5.    // 獲取新isolate的監聽port 
  6.    SendPort sendPort = await receivePort.first; 
  7.    // 調用sendReceive自定義方法 
  8.    List dataList = await sendReceive(sendPort, 'https://hicc.me/posts'); 
  9.    print('dataList $dataList'); 
  10.  
  11. // isolate的綁定方法 
  12. static dataLoader(SendPort sendPort) async{ 
  13.    // 創建監聽port,并將sendPort傳給外界用來調用 
  14.    ReceivePort receivePort =ReceivePort(); 
  15.    sendPort.send(receivePort.sendPort); 
  16.  
  17.    // 監聽外界調用 
  18.    await for (var msg in receivePort) { 
  19.      String requestURL =msg[0]; 
  20.      SendPort callbackPort =msg[1]; 
  21.  
  22.      Client client = Client(); 
  23.      Response response = await client.get(requestURL); 
  24.      List dataList = json.decode(response.body); 
  25.      // 回調返回值給調用者 
  26.      callbackPort.send(dataList); 
  27.   }     
  28.  
  29. // 創建自己的監聽port,并且向新isolate發送消息 
  30. Future sendReceive(SendPort sendPort, String url) { 
  31.    ReceivePort receivePort =ReceivePort(); 
  32.    sendPort.send([url, receivePort.sendPort]); 
  33.    // 接收到返回值,返回給調用者 
  34.    return receivePort.first; 

當然 Flutter 中封裝了compute,可以方便的使用,譬如在其它 isolate 中解析大的 json。

Dart UI as Code

在這里單獨提出來的意義在于,從 React 開始,到 Flutter,到最近的 Apple SwiftUI,Android Jetpack Compose 聲明式組件寫法越發流行,Web 前端使用 JSX 來讓開發者更方便的書寫,而 Flutter,SwiftUI 則直接從優化語言本身著手。

函數類的命名參數

  1. void test({@required int age,String name}) { 
  2.   print(name); 
  3.   print(age); 
  4. // 解決函數調用時候,參數不明確的問題 
  5. test(name:"hicc",age: 30
  6. // 這樣對于組件的使用尤為方便 
  7. class MyApp extends StatelessWidget { 
  8.   @override 
  9.   Widget build(BuildContext context) { 
  10.   return Scaffold( 
  11.       appBar: AppBar(), 
  12.       body: Container(), 
  13.       floatingActionButton:FloatingActionButton() 
  14.     ); 
  15.   } 

大殺器:Collection If 和 Collection For

  1. // collection If 
  2. Widget build(BuildContext context) { 
  3.   return Row( 
  4.     children: [ 
  5.       IconButton(icon: Icon(Icons.menu)), 
  6.       Expanded(child: title), 
  7.       if (!isAndroid) 
  8.         IconButton(icon: Icon(Icons.search)), 
  9.     ], 
  10.   ); 
  11. // Collect For 
  12. var command = [ 
  13.   engineDartPath, 
  14.   frontendServer, 
  15.   for (var root in fileSystemRoots) "--filesystem-root=$root"
  16.   for (var entryPoint in entryPoints) 
  17.     if (fileExists("lib/$entryPoint.json")) "lib/$entryPoint"
  18.   mainPath 
  19. ]; 

更多 Dart 2.3 對此的優化看這里。

Flutter 怎么寫

到這里終于到正題了,如果熟悉 web 前端,熟悉 React 的話,你會對下面要講的異常的熟悉。

写给前端工程师的 Flutter 详细教程

Flutter App 的一切從lib/main.dart文件的 main 函數開始:

  1. import 'package:flutter/material.dart'
  2. void main() => runApp(MyApp()); 
  3.  
  4. class MyApp extends StatelessWidget { 
  5.   @override 
  6.   Widget build(BuildContext context) { 
  7.     return MaterialApp( 
  8.       title: 'Welcome to Flutter'
  9.       home: Scaffold( 
  10.         appBar: AppBar( 
  11.           title: Text('Welcome to Flutter'), 
  12.         ), 
  13.         body: Center( 
  14.           child: Text('Hello World'), 
  15.         ), 
  16.       ), 
  17.     ); 
  18.   } 

Dart 類 build 方法返回的便是 Widget,在 Flutter 中一切都是 Widget,包括但不限于

  • 結構性元素,menu,button 等
  • 樣式類元素,font,color 等
  • 布局類元素,padding,margin 等
  • 導航
  • 手勢

Widget 是 Dart 中特殊的類,通過實例化(Dart 中new 是可選的)相互嵌套,你的這個 App 就是形如下圖的一顆組件樹(Dart 入口函數的概念,main.dart -> main())。

写给前端工程师的 Flutter 详细教程

Widget 布局

上說過 Flutter 布局思路來自 CSS,而 Flutter 中一切皆 Widget,因此整體布局也很簡單:

  • 容器組件 Container
  • decoration 裝飾屬性,設置背景色,背景圖,邊框,圓角,陰影和漸變等
  • margin
  • padding
  • alignment
  • width
  • height
  • Padding,Center
  • Row,Column,Flex
  • Wrap, Flow 流式布局
  • Stack, Z 軸布局
  • ……

Flutter 中 Widget 可以分為三類,形如 React 中“展示組件”、“容器組件”,“context”。

StatelessWidget

這個就是 Flutter 中的“展示組件”,自身不保存狀態,外部參數變化就銷毀重新創建。Flutter 建議盡量使用無狀態的組件。

StatefulWidget

狀態組件就是類似于 React 中的“容器組件”了,Flutter 中狀態組件寫法會稍微不一樣。

  1. class Counter extends StatefulWidget {  
  2.   // This class is the configuration for the state. It holds the  
  3.   // values (in this case nothing) provided by the parent and used by the build  
  4.   // method of the State. Fields in a Widget subclass are always marked "final".  
  5.   @override  
  6.   _CounterState createState() => _CounterState();  
  7. }  
  8.   
  9. class _CounterState extends State<Counter> {  
  10.   int _counter = 0;  
  11.   
  12.   void _increment() {  
  13.     setState(() {  
  14.       // This call to setState tells the Flutter framework that  
  15.       // something has changed in this State, which causes it to rerun  
  16.       // the build method below so that the display can reflect the  
  17.       // updated values. If you change _counter without calling  
  18.       // setState(), then the build method won't be called again,  
  19.       // and so nothing would appear to happen.  
  20.       _counter++;  
  21.     });  
  22.   }  
  23.   
  24.   @override  
  25.   Widget build(BuildContext context) {  
  26.     // This method is rerun every time setState is called, for instance  
  27.     // as done by the _increment method above.  
  28.     // The Flutter framework has been optimized to make rerunning  
  29.     // build methods fast, so that you can just rebuild anything that  
  30.     // needs updating rather than having to individually change  
  31.     // instances of widgets.  
  32.     return Row(  
  33.       children: <Widget>[  
  34.         RaisedButton(  
  35.           onPressed: _increment,  
  36.           child: Text('Increment'),  
  37.         ),  
  38.         Text('Count: $_counter'),  
  39.       ],  
  40.     );  
  41.   }  
  42. }  

可以看到 Flutter 中直接使用了和 React 中同名的setState方法,不過不會有變量合并的東西,當然也有生命周期。

写给前端工程师的 Flutter 详细教程

可以看到一個有狀態的組件需要兩個 Class,這樣寫的原因在于,Flutter 中 Widget 都是 immmutable 的,狀態組件的狀態保存在 State 中,組件仍然每次重新創建,Widget 在這里只是一種對組件的描述,Flutter 會 diff 轉換成 Element,然后轉換成 RenderObject 才渲染。

写给前端工程师的 Flutter 详细教程

Flutter Widget 更多的渲染流程可以看這里。

實際上 Widget 只是作為組件結構一種描述,還可以帶來的好處是,你可以更方便的做一些主題性的組件, Flutter 官方提供的Material Components widgets和Cupertino (iOS-style) widgets質量就相當高,再配合 Flutter 亞秒級的Hot Reload,開發體驗可以說挺不錯的。

State Management

setState()可以很方便的管理組件內的數據,但是 Flutter 中狀態同樣是從上往下流轉的,因此也會遇到和 React 中同樣的問題,如果組件樹太深,逐層狀態創建就顯得很麻煩了,更不要說代碼的易讀和易維護性了。

InheritedWidget

同樣 Flutter 也有個context一樣的東西,那就是InheritedWidget,使用起來也很簡單。

  1. class GlobalData extends InheritedWidget { 
  2.   final int count; 
  3.   GlobalData({Key key, this.count,Widget child}):super(key:key,child:child); 
  4.   @override 
  5.   bool updateShouldNotify(GlobalData oldWidget) { 
  6.     return oldWidget.count != count; 
  7.   } 
  8.  
  9.   static GlobalData of(BuildContext context) => context.inheritFromWidgetOfExactType(GlobalData); 
  10.  
  11. class MyApp extends StatelessWidget { 
  12.   // This widget is the root of your application. 
  13.   @override 
  14.   Widget build(BuildContext context) { 
  15.     return MaterialApp( 
  16.       title: 'Flutter Demo'
  17.       theme: ThemeData( 
  18.         primarySwatch: Colors.blue, 
  19.       ), 
  20.       home: MyHomePage(title: 'Flutter Demo Home Page'), 
  21.     ); 
  22.   } 
  23.  
  24. class MyHomePage extends StatefulWidget { 
  25.   MyHomePage({Key key, this.title}) : super(key: key); 
  26.  
  27.   final String title; 
  28.  
  29.   @override 
  30.   _MyHomePageState createState() => _MyHomePageState(); 
  31.  
  32. class _MyHomePageState extends State<MyHomePage> { 
  33.   int _counter = 0
  34.  
  35.   void _incrementCounter() { 
  36.       _counter++; 
  37.     }); 
  38.   } 
  39.  
  40.   @override 
  41.   Widget build(BuildContext context) { 
  42.     return Scaffold( 
  43.       appBar: AppBar( 
  44.         title: Text(widget.title), 
  45.       ), 
  46.       body: GlobalData( 
  47.         count: _counter, 
  48.         child: Center( 
  49.           child: Column( 
  50.             mainAxisAlignment: MainAxisAlignment.center, 
  51.             children: <Widget>[ 
  52.               Text( 
  53.                 'You have pushed the button this many times:'
  54.               ), 
  55.               Text( 
  56.                 '$_counter'
  57.                 style: Theme.of(context).textTheme.display1, 
  58.               ), 
  59.               Body(), 
  60.               Body2() 
  61.             ], 
  62.           ), 
  63.         ), 
  64.       ), 
  65.       floatingActionButton: FloatingActionButton( 
  66.         onPressed: _incrementCounter, 
  67.         tooltip: 'Increment'
  68.         child: Icon(Icons.add), 
  69.       ), 
  70.     ); 
  71.   } 
  72.  
  73. class Body extends StatelessWidget { 
  74.   @override 
  75.   Widget build(BuildContext context) { 
  76.     GlobalData globalData = GlobalData.of(context); 
  77.     return Text(globalData.count.toString()); 
  78.   } 
  79.  
  80. class Body2 extends StatelessWidget { 
  81.   @override 
  82.   Widget build(BuildContext context) { 
  83.     // TODO: implement build 
  84.     GlobalData globalData = GlobalData.of(context); 
  85.     return Text(globalData.count.toString()); 
  86.   } 

具體實現原理可以參考這里,不過 Google 封裝了一個更為上層的庫provider,具體使用可以看這里。

BlOC

BlOC是 Flutter team 提出建議的另一種更高級的數據組織方式,也是我最中意的方式。簡單來說:

Bloc = InheritedWidget + RxDart(Stream)

Dart 語言中內置了 Steam,Stream ~= Observable,配合RxDart, 然后加上StreamBuilder會是一種異常強大和自由的模式。

  1. class GlobalData extends InheritedWidget { 
  2.   final int count; 
  3.   final Stream<String> timeInterval$ = new Stream.periodic(Duration(seconds: 10)).map((time) => new DateTime.now().toString()); 
  4.   GlobalData({Key key, this.count,Widget child}):super(key:key,child:child); 
  5.   @override 
  6.   bool updateShouldNotify(GlobalData oldWidget) { 
  7.     return oldWidget.count != count; 
  8.   } 
  9.  
  10.   static GlobalData of(BuildContext context) => context.inheritFromWidgetOfExactType(GlobalData); 
  11.  
  12.  
  13. class TimerView extends StatelessWidget { 
  14.  
  15.   @override 
  16.   Widget build(BuildContext context) { 
  17.     GlobalData globalData = GlobalData.of(context); 
  18.     return StreamBuilder( 
  19.         stream: globalData.timeInterval$, 
  20.         builder: (context, snapshot) { 
  21.           return Text(snapshot?.data ?? ''); 
  22.         } 
  23.     ); 
  24.   } 

當然 Bloc 的問題在于

  • 學習成本略高,Rx 的概念要吃透,不然你會抓狂
  • 自由帶來的問題是,可能代碼不如 Redux 類的規整。

順便,今年 Apple 也擁抱了響應式,Combine(Rx like) + SwiftUI 也基本等于 Bloc 了。

所以,Rx 還是要趕緊學起來 😬

除去 Bloc,Flutter 中還是可以使用其他的方案,譬如:

  • Flutter Redux
  • 阿里閑魚的Fish Redux,據說性能很好。
  • Mobx
  • ……

展開來說現在的前端開發使用強大的框架頁面組裝已經不是難點了。開發的難點在于如何組合富交互所需的數據,也就是上面圖中的state部分。

更具體來說,是怎么優雅,高效,易維護地處理短暫數據(ephemeral state)setState()和需要共享的 App State 的問題,這是個工程性的問題,但往往也是日常開發最難的事情了,引用 Redux 作者 Dan 的一句:

“The rule of thumb is:Do whatever is less awkward.”

到這里,主要的部分已經講完了,有這些已經可以開發出一個不錯的 App 了。剩下的就當成一個 bonus 吧。

測試

Flutter debugger,測試都是出場自帶,用起來也不難。

  1. // 測試在/test/目錄下面 
  2. void main() { 
  3.   testWidgets('Counter increments smoke test', (WidgetTester tester) async { 
  4.     // Build our app and trigger a frame. 
  5.     await tester.pumpWidget(MyApp()); 
  6.  
  7.     // Verify that our counter starts at 0. 
  8.     expect(find.text('0'), findsOneWidget); 
  9.     expect(find.text('1'), findsNothing); 
  10.  
  11.     // Tap the '+' icon and trigger a frame. 
  12.     await tester.tap(find.byIcon(Icons.add)); 
  13.     await tester.pump(); 
  14.  
  15.     // Verify that our counter has incremented. 
  16.     expect(find.text('0'), findsNothing); 
  17.     expect(find.text('1'), findsOneWidget); 
  18.   }); 

包管理,資源管理

類似與 JavaScript 的 npm,Flutter,也就是 Dart 也有自己的包倉庫。不過項目包的依賴使用 yaml 文件來描述:

  1. name: app 
  2. description: A new Flutter project. 
  3. version: 1.0.0+1 
  4. environment: 
  5.   sdk: ">=2.1.0 <3.0.0" 
  6.  
  7. dependencies: 
  8.   flutter: 
  9.     sdk: flutter 
  10.  
  11.   cupertino_icons: ^0.1.2 

生命周期

移動應用總歸需要應用級別的生命周期,flutter 中使用生命周期鉤子,也非常的簡單:

  1. class MyApp extends StatefulWidget { 
  2.   @override 
  3.   _MyAppState createState() => new _MyAppState(); 
  4. class _MyAppState extends State<MyApp> with WidgetsBindingObserver { 
  5.   @override 
  6.   void initState() { 
  7.     super.initState(); 
  8.     WidgetsBinding.instance.addObserver(this); 
  9.   } 
  10.  
  11.   @override 
  12.   void dispose() { 
  13.     WidgetsBinding.instance.removeObserver(this); 
  14.     super.dispose(); 
  15.   } 
  16.  
  17.   @override 
  18.   void didChangeAppLifecycleState(AppLifecycleState state) { 
  19.     switch (state) { 
  20.       case AppLifecycleState.inactive: 
  21.         print('AppLifecycleState.inactive'); 
  22.         break
  23.       case AppLifecycleState.paused: 
  24.         print('AppLifecycleState.paused'); 
  25.         break
  26.       case AppLifecycleState.resumed: 
  27.         print('AppLifecycleState.resumed'); 
  28.         break
  29.       case AppLifecycleState.suspending: 
  30.         print('AppLifecycleState.suspending'); 
  31.         break
  32.     } 
  33.     super.didChangeAppLifecycleState(state); 
  34.   } 
  35.  
  36.   @override 
  37.   Widget build(BuildContext context) { 
  38.       return Container(); 
  39.   } 

使用原生能力

和 ReactNative 類似,Flutter 也是使用類似事件的機制來使用平臺相關能力。

写给前端工程师的 Flutter 详细教程

Flutter Web, Flutter Desktop

這些還在開發當中,鑒于對 Dart 喜歡,以及對 Flutter 性能的樂觀,這些倒是很值得期待。

写给前端工程师的 Flutter 详细教程  

 

責任編輯:張燕妮 來源: 騰訊技術工程
相關推薦

2019-07-29 16:05:48

前端DockerNode.js

2019-01-21 15:52:02

前端工程師Flutter代碼

2015-05-07 14:08:26

初學前端工程師

2015-08-26 14:18:25

Web前端工程師價值

2015-09-30 10:25:03

前端工程師

2019-09-27 14:33:34

2018-08-17 15:33:37

2019-03-22 10:10:44

AndroidiOS移動系統

2010-01-13 10:53:51

Web前端工程師定位

2018-11-15 15:55:44

前端工程師Web云計算

2014-12-23 14:55:23

前端

2009-03-20 10:24:38

網絡工程師數據庫計算機信息系統

2015-03-16 16:01:40

Web前端前端工程師Web

2016-09-22 16:14:45

前端設計Photoshop

2010-01-13 10:10:07

Web前端工程師

2019-06-24 09:40:17

前端前端工程師開發工具

2022-08-08 15:45:44

JavaPromise前端

2012-09-07 10:20:53

2012-06-28 14:23:32

Web

2019-10-29 16:29:28

運維架構開發
點贊
收藏

51CTO技術棧公眾號

欧美极品aⅴ影院| 欧美老女人另类| 亚洲综合久久av| 国产一区二区高清视频| 日韩精品一区二区亚洲av| 国产成人调教视频在线观看| 欧美日韩视频在线一区二区| 亚洲天堂第一区| 香蕉视频免费看| 久久97超碰色| 91超碰中文字幕久久精品| 午夜精产品一区二区在线观看的| 成人污版视频| 欧美日韩在线看| 麻豆md0077饥渴少妇| 性xxxx18| 国产精品456| 国产成人精品免高潮在线观看| 欧美a级片免费看| 亚洲精品国模| 欧美xxxx老人做受| 69久久久久久| 在线视频cao| 亚洲自拍与偷拍| 亚洲欧美日韩精品在线| 色在线免费视频| 国产精品18久久久久久久网站| 国产第一区电影| 日本少妇bbwbbw精品| 91精品久久久久久久久久不卡| 精品视频在线播放免| 超碰中文字幕在线观看| 日本精品在线一区| 欧美日韩久久久久| 日韩一级片免费视频| 男人资源在线播放| 国产日产欧美一区二区三区| 国产精品视频免费一区| 国产日本精品视频| 精品一区二区三区免费视频| 国产成人综合av| www.毛片.com| 亚洲国产免费看| 麻豆成人在线看| 在线日韩国产网站| 日本一区二区免费高清| 亚洲欧美第一页| 天堂久久久久久| 久久a爱视频| 亚洲国产成人av在线| xxxx视频在线观看| 伊色综合久久之综合久久| 91精品国产欧美一区二区| 深夜黄色小视频| 国产91亚洲精品久久久| 欧美系列在线观看| 五月天婷婷亚洲| 天天综合91| 91精品国产综合久久香蕉的特点| 日韩 国产 一区| 亚洲不卡在线| 精品国产髙清在线看国产毛片| 日本少妇xxx| 亚洲精品一区国产| 亚洲国产又黄又爽女人高潮的| 丰满岳乱妇一区二区 | 色777狠狠狠综合伊人| 亚洲一区二区黄| 特级西西人体高清大胆| 99久久夜色精品国产亚洲96| 久久精品国产欧美激情| 色老板免费视频| 欧美88av| 777777777亚洲妇女| 日韩欧美在线观看免费| 日本大胆欧美人术艺术动态| 国产在线久久久| 亚洲国产成人一区二区| 99re成人在线| 亚洲国产一区在线| av在线播放观看| 偷窥少妇高潮呻吟av久久免费 | 日韩va亚洲va欧美va久久| 国产精品偷伦视频免费观看国产| 国产情侣在线播放| 99精品国产91久久久久久| 欧美一区二区福利| 99在线播放| 狠狠做深爱婷婷久久综合一区| 日韩av播放器| 国产精品亚洲综合在线观看| 亚洲第一视频网| 九九九视频在线观看| 一区二区电影在线观看| 4k岛国日韩精品**专区| 国产免费av电影| 99r国产精品| 一区二区91美女张开腿让人桶| 欧美精品videossex少妇| 日本乱人伦一区| wwwww在线观看| 欧美日韩精品在线一区| 欧美夫妻性生活xx| www.亚洲激情| 成人精品在线视频观看| 亚洲精品中文综合第一页| 爱情岛论坛亚洲品质自拍视频网站| 色88888久久久久久影院按摩| av在线免费观看不卡| 国产91精品对白在线播放| 欧美精品在线免费播放| 中文字幕免费高清网站| 成人高清视频在线观看| 26uuu成人| 国精产品一区一区三区四川| 精品久久久久一区| 亚洲视频重口味| 玖玖在线精品| 精品蜜桃一区二区三区| 最新国产在线拍揄自揄视频| 在线观看一区二区精品视频| 国产+高潮+白浆+无码| 99久久精品网| 国产成人亚洲综合91精品| 色一情一乱一乱一区91av| 国产欧美日韩综合精品一区二区| 国产不卡一区二区视频| 永久免费精品视频| 久久这里只有精品视频首页| 国产精品51麻豆cm传媒 | 九一在线免费观看| 亚洲综合国产| 九九九九精品| 不卡av免费观看| 日韩小视频在线观看专区| 女性裸体视频网站| 美女一区二区视频| 亚洲成人一区二区三区| 91九色综合| 亚洲视频在线免费看| 国产原创视频在线| 久久综合狠狠综合久久综合88| 人人干视频在线| av综合网页| 久久久亚洲国产| 国精品人妻无码一区二区三区喝尿| 亚洲免费成人av| 天天操夜夜操很很操| 欧美在线1区| 97影院在线午夜| 蜜臀av在线| 精品福利视频一区二区三区| 久久一级黄色片| 成人高清免费观看| 精品这里只有精品| 中国av一区| 国产精品扒开腿爽爽爽视频| 国产成人天天5g影院在线观看| 在线看日本不卡| 91麻豆制片厂| 精品一区二区三区免费| 国产一二三四区在线观看| 美国十次综合久久| 久久久久久久久网站| 日韩中文字幕影院| 福利二区91精品bt7086| 偷拍夫妻性生活| 麻豆成人91精品二区三区| 正在播放一区| 午夜视频一区二区在线观看| 91黄色8090| 黄色的视频在线免费观看| 精品视频全国免费看| 男人晚上看的视频| 成人免费毛片嘿嘿连载视频| 久久久999视频| 成人羞羞网站入口免费| 91在线免费视频| 高清在线视频不卡| 亚洲欧洲日产国码av系列天堂| 中文字幕+乱码+中文字幕明步| 亚洲视频精选在线| a天堂视频在线观看| 模特精品在线| 国产美女视频免费| 久久久久97| 国产免费亚洲高清| 成人三级小说| 中文字幕精品一区久久久久| www视频在线| 日本精品一区二区三区高清| 久草视频手机在线| 91麻豆精东视频| 捷克做爰xxxⅹ性视频| 日韩视频一区| 自拍偷拍99| 日韩伦理一区二区三区| 91精品久久久久久久久久久久久| a'aaa级片在线观看| 自拍偷拍免费精品| 天堂av中文在线资源库| 欧美一区二区在线不卡| 久久青青草原亚洲av无码麻豆| 亚洲欧洲另类国产综合| 最新中文字幕视频| 国产精品中文欧美| 国产精品无码一本二本三本色| 中文字幕乱码亚洲无线精品一区 | 日韩大片在线| 国模精品一区二区三区| 粉嫩av国产一区二区三区| 亲子乱一区二区三区电影| 2021国产在线| 中文字幕欧美亚洲| 欧美偷拍视频| 亚洲成av人乱码色午夜| 91国产免费视频| 日韩欧美主播在线| 国产无精乱码一区二区三区| 亚洲天堂久久久久久久| 久久久久久久毛片| 91亚洲精品乱码久久久久久蜜桃 | 国产精品尤物视频| 午夜久久久影院| 一区二区成人免费视频| 国产精品区一区二区三| 手机免费看av| 91在线小视频| 国产精品成人99一区无码| 国产精品1区2区3区在线观看| 九色porny自拍| 日本麻豆一区二区三区视频| 青青青在线播放| 亚洲一区二区免费看| 国产av人人夜夜澡人人爽麻豆 | 免费在线观看亚洲视频| 欧美特黄一级| 轻点好疼好大好爽视频| 欧美伊人久久| 日本人妻伦在线中文字幕| 久久久久av| 国产精品h视频| 91精品综合久久久久久久久久久 | 成人免费视频97| 久久精品黄色| 成人妇女淫片aaaa视频| 日韩一级特黄| 91在线高清视频| 久久免费福利| 超碰国产精品久久国产精品99| 日本在线一区二区三区| 91高跟黑色丝袜呻吟在线观看| 国产一区二区av在线| 91影视免费在线观看| 网站一区二区| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 亚洲免费观看在线观看| 欧美日韩激情在线观看| 亚洲最新视频在线观看| 日韩三级一区二区三区| 欧美日韩免费一区| 日韩电影在线观看一区二区| 色激情天天射综合网| 中文字幕 亚洲视频| 制服丝袜亚洲网站| 精品久久久久成人码免费动漫| 欧美www视频| 无码精品黑人一区二区三区| 亚洲日韩欧美视频| 在线免费av网站| 操91在线视频| 电影在线观看一区| 国产精品久久久久久网站| 欧美激情福利| 国产99视频精品免费视频36| 久久久久久久久久久久久久久久久久久久| 久久青青草原| 水蜜桃精品av一区二区| 成人在线视频一区二区三区| 国产精品三上| 天天色综合天天色| 国产99久久久精品| 色婷婷av777| 18成人在线视频| 尤物视频在线观看国产| 欧美性感一类影片在线播放| 国产chinasex对白videos麻豆| 日韩av在线播放资源| 日本高清视频在线播放| 久久久天堂国产精品女人| 成人在线免费av| 国产精品加勒比| 成人一区二区| 波多野结衣av一区二区全免费观看| 久久亚洲不卡| 国产大学生av| 国产婷婷色一区二区三区四区| 国产探花在线免费观看| 欧美三级免费观看| 国产精品视频久久久久久| 精品久久国产老人久久综合| 国产小视频在线| 欧美精品999| 日韩色性视频| 女同一区二区| 国产精品扒开腿做爽爽爽软件| 宅男噜噜噜66国产免费观看| 福利一区二区在线观看| 精品女人久久久| 欧美视频专区一二在线观看| a视频免费在线观看| 自拍偷拍亚洲一区| 日韩在线伦理| 国产高清在线一区二区| 99精品小视频| 成人3d动漫一区二区三区| av高清久久久| 九九热只有精品| 欧美高清视频不卡网| 黄色软件在线| 欧洲精品久久久| 国产精品超碰| 国产精品自拍合集| 国产精品一区二区男女羞羞无遮挡| 五月天精品视频| 岛国精品视频在线播放| 懂色av蜜臀av粉嫩av分享吧| 欧美理论电影在线观看| 外国成人毛片| 一区二区免费在线观看| 日韩高清在线电影| 91国模少妇一区二区三区| 欧美日韩免费看| 五月婷婷六月丁香综合| 亚州国产精品久久久| 第四色中文综合网| 国产高清不卡无码视频| 国产精品亚洲а∨天堂免在线| 性少妇xx生活| 欧美日韩成人激情| 中文字幕日本在线| 国产精品一区二区3区| 成人综合久久| 亚洲第一狼人区| 国产精品久久午夜| 亚洲香蕉在线视频| 日韩视频中文字幕| 色噜噜成人av在线| 三年中文高清在线观看第6集| 久久99精品国产麻豆不卡| 91免费在线看片| 欧美久久一区二区| av网站在线免费| 波多野结衣精品久久| 欧美激情一区| 中文字幕第3页| 午夜精品一区二区三区电影天堂| 天堂网在线资源| 2019中文在线观看| 国产毛片一区二区三区 | 国产麻豆精品视频| 久久久久99精品成人片试看| 日韩欧美激情四射| 91美女主播在线视频| 欧美成ee人免费视频| 奇米影视在线99精品| 成人自拍小视频| 精品国产凹凸成av人网站| 漫画在线观看av| 日韩欧美一区二区三区四区| 国产在线精品一区二区三区不卡| 久久中文免费视频| 日韩av在线网页| 色成人免费网站| 国产精品av免费| 99久久婷婷国产| 国产一级精品毛片| 欧美裸体xxxx极品少妇| 婷婷激情久久| gai在线观看免费高清| 亚洲午夜精品一区二区三区他趣| 色哟哟在线观看| 成人亚洲欧美一区二区三区| 亚洲视频福利| 色综合99久久久无码国产精品| 欧美日韩成人一区二区| 美女高潮视频在线看| 亚洲欧美日韩另类精品一区二区三区 | 牛牛澡牛牛爽一区二区| 成人国产精品免费视频| 亚洲免费黄色| 羞羞在线观看视频| 日韩激情在线视频| 亚洲青青久久| www..com日韩| 国产精品久久久久久久久快鸭 | 亚洲精品男人的天堂| 久久精品电影网站| 亚洲精品3区| 国产无套精品一区二区三区|