色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎么開發啟動框架plugin

谷歌開發者 ? 來源:BennuCTech ? 作者:BennuC ? 2022-06-24 16:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文原作者: BennuC原文發布于: BennuCTech

在移動端中啟動 Flutter 頁面會有短暫空白,雖然官方提供了引擎預熱機制,但是需要提前將所有頁面都進行預熱,這樣開發成本較高,在研究了閑魚的 FlutterBoost 插件后,看看能不能自己實現一個簡單的快速啟動框架。

開發啟動框架 plugin

創建一個 Flutter Plugin 項目,并添加 git,然后編寫三端代碼:

Flutter 代碼首先是 Flutter 端的代碼

1. RouteManager

import'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:flutter_boot/BasePage.dart';
class RouteManager{  factory RouteManager() => _getInstance();
  static RouteManager get instance => _getInstance();
  static RouteManager _instance;
  RouteManager._internal(){
  }
  static RouteManager _getInstance(){    if(_instance == null){      _instance = new RouteManager._internal();    }    return _instance;  }
  Map routes = Map();
  void registerRoute(String route, BasePage page){    routes[route] = page;  }
  RouteFactory getRouteFactory(){    return getRoute;  }
  MaterialPageRoute getRoute(RouteSettings settings){    if(routes.containsKey(settings.name)){      return MaterialPageRoute(builder: (BuildContext context) {        return routes[settings.name];      }, settings: settings);    }    else{      return MaterialPageRoute(builder: (BuildContext context) {        return PageNotFount();      });    }  }
  BasePage getPage(String name){    if(routes.containsKey(name)) {      return routes[name];    }    else{      return PageNotFount();    }  }}
class PageNotFount extends BasePage{
  @override  State createState() {    return _PageNotFount();  }
}
class _PageNotFount extends BaseState<PageNotFount>{
  @override  Widget buildImpl(BuildContext context) {    return Scaffold(      body: Center(        child: Text("page not found"),      ),    );  }}

它的作用就是管理路由,是一個單例,用一個 map 來維護路由映射。其中三個函數比較重要:
  • registerRoute: 注冊路由,一般在啟動時調用;
  • getRouteFactory: 返回 RouteFactory,將它賦值給 MaterialApponGenerateRoute 字段;
  • getPage: 通過 route 名稱返回頁面 widget。
這里 getRouteFactorygetPage 共用一個路由 map,所以不論是頁面內切換還是頁面切換都保持統一。

2.BaseApp

import'dart:convert';
import 'package:flutter/cupertino.dart';import 'package:flutter/services.dart';import 'package:flutter_boot/RouteManager.dart';
abstract class BaseApp extends StatefulWidget{
  @override  State createState() {    registerRoutes();    return _BaseApp(build);  }
  Widget build(BuildContext context, Widget page);
  void registerRoutes();
}
class _BaseApp extends State<BaseApp>{
  Function buildImpl;  static const bootChannel = const BasicMessageChannel("startPage", StringCodec());  Widget curPage = RouteManager.instance.getPage("");
  _BaseApp(this.buildImpl){    bootChannel.setMessageHandler((message) async {      setState(() {        var json = jsonDecode(message);        var route = json["route"];        var page = RouteManager.instance.getPage(route);        page.args = json["params"];        curPage = page;      });      return "";    });  }
  @override  Widget build(BuildContext context) {    return buildImpl.call(context, curPage);  }
}

是一個抽象類,真正的 Flutter app 需要繼承它。主要是封裝了一個 BasicMessageChannel 用來與 Android/iOS 交互,并根據收到的消息處理頁面內的切換,實現快速啟動。

繼承它的子類需要實現 registerRoutes 函數,在這里使用 RouteManagerregisterRoute 將每個頁面注冊一下即可。

3.BasePage
import'package:flutter/material.dart';
abstract class BasePage extends StatefulWidget{  dynamic args;}
abstract class BaseState<T extends BasePage> extends State<T>{  dynamic args;
  @override  Widget build(BuildContext context) {    if(ModalRoute.of(context).settings.arguments == null){      args = widget.args;    }    else{      args = ModalRoute.of(context).settings.arguments;    }    return buildImpl(context);  }
  Widget buildImpl(BuildContext context);}

同樣是抽象類,每個 Flutter 頁面都需要繼承它,它主要是處理兩種啟動方式傳過來的參數,統一到 args 中,這樣子類就可以直接使用而不需要考慮是如何啟動的。

Android 代碼接下來是 plugin 中的 Android 的代碼

1.BootEngine

package com.bennu.flutter_boot
import android.app.Applicationimport io.flutter.embedding.engine.FlutterEngineimport io.flutter.embedding.engine.FlutterEngineCacheimport io.flutter.embedding.engine.dart.DartExecutorimport io.flutter.plugin.common.BasicMessageChannelimport io.flutter.plugin.common.StringCodec
object BootEngine {    public var flutterBoot : BasicMessageChannel? = null
    fun init(context: Application){        var flutterEngine = FlutterEngine(context)        flutterEngine.dartExecutor.executeDartEntrypoint(            DartExecutor.DartEntrypoint.createDefault()        )        FlutterEngineCache.getInstance().put("main", flutterEngine)
        flutterBoot = BasicMessageChannel(flutterEngine.dartExecutor.binaryMessenger, "startPage", StringCodec.INSTANCE)    }}
這個是單例,初始化并預熱 FlutterEngine,同時創建 BasicMessageChannel 用于后續交互。需要在 ApplicationonCreate 中調用它的 init 函數來初始化。 2. FlutterBootActivity
package com.bennu.flutter_boot
import android.content.ComponentNameimport android.content.Contextimport android.content.Intentimport android.os.Bundleimport android.os.PersistableBundleimport io.flutter.embedding.android.FlutterActivityimport org.json.JSONObject
class FlutterBootActivity : FlutterActivity() {
    companion object{        const val ROUTE_KEY = "flutter.route.key"
        fun build(context: Context, routeName : String, params : Map<String, String>?) : Intent{            var intent = withCachedEngine("main").build(context)            intent.component = ComponentName(context, FlutterBootActivity::class.java)            var json = JSONObject()            json.put("route", routeName)
            var paramsObj = JSONObject()            params?.let {                for(entry in it){                    paramsObj.put(entry.key, entry.value)                }            }            json.put("params", paramsObj)            intent.putExtra(ROUTE_KEY, json.toString())            return intent        }    }
    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)    }
    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {        super.onCreate(savedInstanceState, persistentState)    }
    override fun onResume() {        super.onResume()        var route = intent.getStringExtra(ROUTE_KEY)        BootEngine.flutterBoot?.send(route)    }
    override fun onDestroy() {        super.onDestroy()    }}

繼承 FlutterActivity,提供一個 build (context: Context, routeName: String, params: Map?) 函數來啟動,傳遞路由名稱和參數。在 onResume 的時候通過 BasicMessageChannel 將這兩個數據 send 給 Flutter 處理。

iOS

iOS 與 Android 類似

1.FlutterBootEngine FlutterBootEngine.h
#ifndef FlutterBootEngine_h#define FlutterBootEngine_h
#import #import 
@interface FlutterBootEngine : NSObject
+ (nonnull instancetype)sharedInstance;
- (FlutterBasicMessageChannel *)channel;- (FlutterEngine *)engine;- (void)initEngine;@end
#endif /* FlutterBootEngine_h */FlutterBootEngine.m#import "FlutterBootEngine.h"#import 
@implementation FlutterBootEngine
static FlutterBootEngine * instance = nil;
FlutterEngine * engine = nil;FlutterBasicMessageChannel * channel = nil;
+(nonnull FlutterBootEngine *)sharedInstance{    if(instance == nil){        instance = [self.class new];    }    return instance;}
+(id)allocWithZone:(struct _NSZone *)zone{    if(instance == nil){        instance = [[super allocWithZone:zone]init];    }    return instance;}
- (id)copyWithZone:(NSZone *)zone{    return instance;}
- (FlutterEngine *)engine{    return engine;}
- (FlutterBasicMessageChannel *)channel{    return channel;}
- (void)initEngine{    engine = [[FlutterEngine alloc]initWithName:@"flutter engine"];    channel = [FlutterBasicMessageChannel messageChannelWithName:@"startPage" binaryMessenger:engine.binaryMessenger codec:[FlutterStringCodec sharedInstance]];    [engine run];}
@end

這也是一個單例,初始化并啟動 FlutterEngine,并創建一個 FlutterBasicMessageChannel 與 Flutter 交互。

需要在 iOS 項目的 AppDelegate 初始化時調用它的 initEngine 函數。

2. FlutterBootViewController

FlutterBootViewController.h
#ifndef FlutterBootViewController_h#define FlutterBootViewController_h
#import 
@interface FlutterBootViewController : FlutterViewController
- (nonnull instancetype)initWithRoute:(nonnull NSString*)route                       params:(nullable NSDictionary*)params;
@end
#endif /* FlutterBootViewController_h */FlutterBootViewController.m#import "FlutterBootViewController.h"#import "FlutterBootEngine.h"
@implementation FlutterBootViewController
NSString * mRoute = nil;NSDictionary * mParams = nil;
- (nonnull instancetype)initWithRoute:(nonnull NSString *)route params:(nullable NSDictionary *)params{    self = [super initWithEngine:FlutterBootEngine.sharedInstance.engine nibName:nil bundle:nil];    mRoute = route;    mParams = params;    return self;}
//viewDidAppear時機有點晚,會先顯示一下上一個頁面才更新到新頁面,所以換成viewWillAppear- (void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    if(mParams == nil){        mParams = [[NSDictionary alloc]init];    }    NSDictionary * dict = @{@"route" : mRoute, @"params" : mParams};    NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];    NSString * str = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];    NSLog(@"%@", str);    [FlutterBootEngine.sharedInstance.channel sendMessage:str];}
@end

同樣新增一個使用路由名和參數的構造函數,然后在 viewWillAppear 時通知 Flutter。

注意這里如果改成 viewDidAppear 時機有點晚,會先顯示一下上一個頁面才更新到新頁面,所以換成 viewWillAppear

3. FlutterBoot.h
#ifndef FlutterBoot_h#define FlutterBoot_h
#import "FlutterBootEngine.h"#import "FlutterBootViewController.h"
#endif /* FlutterBoot_h */
這個是 swift 的橋接文件,通過它 swift 就可以使用我們上面定義的類。 這樣我們的 plugin 就開發完成了,可以發布到 pub 上。我這里是 push 到 git 倉庫中,通過 git 的方式依賴使用。

開發 Flutter module

創建一個 Flutter module,然后引入我們的 plugin,在 pubspec.yaml 中:
dependencies:  flutter:    sdk: flutter  ...  flutter_boot:    git: https://gitee.com/chzphoenix/flutter-boot.git

然后我們開發兩個頁面用于測試。

1. FirstPage.dart
import 'package:flutter/material.dart';import 'package:flutter_boot/BasePage.dart';
class FirstPage extends BasePage{
  @override  State createState() {    return _FirstPage();  }}
class _FirstPage extends BaseState<FirstPage>{
  void _goClick() {    Navigator.of(context).pushNamed("second", arguments: {"key":"123"});  }
  @override  Widget buildImpl(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text("Flutter Demo Home Page"),      ),      body: Center(        child: ...,      ),      floatingActionButton: FloatingActionButton(        onPressed: _goClick,        tooltip: 'Increment',        child: Icon(Icons.add),      ), // This trailing comma makes auto-formatting nicer for build methods.    );  }}

繼承 BasePageBaseState 即可,點擊按鈕可以跳轉到頁面 2。

2. SecondPage.dart

import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:flutter_boot/BasePage.dart';
class SecondPage extends BasePage{
  @override  State createState() {    return _SecondPage();  }
}
class _SecondPage extends BaseState<SecondPage>{
  @override  Widget buildImpl(BuildContext context) {    return Scaffold(        appBar: AppBar(          title: Text("test"),        ),        body:Text("test:${args["key"]}")    );  }}

這個頁面獲取傳遞過來的參數 key,并展示。

3. main.dart
import 'package:flutter/material.dart';import 'package:flutter_boot/BaseApp.dart';import 'package:flutter_boot/RouteManager.dart';
import 'FirstPage.dart';import 'SecondPage.dart';
void main() => runApp(MyApp());
class MyApp extends BaseApp {  @override  Widget build(BuildContext context, Widget page) {    return MaterialApp(      title: 'Flutter Demo',      theme: ThemeData(        primarySwatch: Colors.blue,      ),      home: page,      onGenerateRoute: RouteManager.instance.getRouteFactory(),    );  }
  @override  void registerRoutes() {    RouteManager.instance.registerRoute("main", FirstPage());    RouteManager.instance.registerRoute("second", SecondPage());  }}

入口繼承 BaseApp,并實現 registerRoutes,注冊這兩個頁面。

注意這里的 onGenerateRoute 使用 RouteManager.instance.getRouteFactory (),這樣一次注冊就可以了,不必自己去實現。

引入移動端

Module 開發完后,就可以在 Android/iOS 上使用了。

Android 端

在 Android 上比較簡單,在 Android 項目中引入剛才的 module 即可,然后需要在 Android 的主 module (一般是 app) 的 build.gradle 中引入 module 和 plugin,如下:
dependencies{    implementation fileTree(dir: "libs", include: ["*.jar"])    ...    implementation project(path: ':flutter')  //module    provided rootProject.findProject(":flutter_boot") //plugin}

注意 plugin 的名稱是之前在 module 中的 pubspec.yaml 定義的。

然后就可以在 Android 中使用了,首先要初始化,如下:

importandroid.app.Applicationimport com.bennu.flutter_boot.BootEngine
public class App : Application() {
    override fun onCreate() {        super.onCreate()        BootEngine.init(this)        ...    }}

然后合適的時候啟動 Flutter 頁面即可,啟動代碼如下:
button.setOnClickListener {    startActivity(FlutterBootActivity.build(this, "main", null))}button2.setOnClickListener {    var params = HashMap()    params.put("key", "123")    startActivity(FlutterBootActivity.build(this, "second", params))}

一個啟動無參的頁面 1,一個啟動有參的頁面 2。 測試可以發現無論打開哪個頁面都非常快,幾乎沒有加載時間。這樣就實現了快速啟動。

iOS 端

iOS 端稍微復雜一些,需要先了解一下 iOS 如何加入 Flutter。

我選用的是 framework 的方式引入,所以在 Flutter module 項目下通過命令編譯打包 framework。

flutterbuildios-framework--xcframework--no-universal--output=./Flutter/
然后引入到 iOS 項目中,與上一篇文章不同的是,因為這個 module 中加入了 plugin,所以 framework 產物是四個:
  • App.xcframework
  • flutter_boot.xcframework (這個就是我們的 plugin 中的 iOS 部分)
  • Flutter.xcframework
  • FlutterPluginRegistrant.xcframework

這四個都需要引入到 iOS 項目中。

然后 AppDelegate 需要繼承 FlutterAppDelegate (如果無法繼承,則需要處理每個生命周期,您可以查看: https://flutter.cn/docs/development/add-to-app/ios/add-flutter-screen?tab=engine-swift-tab)。

然后在 AppDelegate 中初始化,如下:
importUIKitimport Flutterimport flutter_boot
@UIApplicationMainclass AppDelegate: FlutterAppDelegate {
    override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {        FlutterBootEngine.sharedInstance().initEngine()        return true    }
    override func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)    }}
然后在合適的地方啟動 Flutter 頁面即可,如下:
@objcfuncshowMain(){    let flutterViewController =        FlutterBootViewController(route: "main", params: nil)    present(flutterViewController, animated: true, completion: nil)  }
@objc func showSecond() {    let params : Dictionary<String, String> = ["key" : "123"]    let flutterViewController =        FlutterBootViewController(route: "second", params: params)    present(flutterViewController, animated: true, completion: nil)  }

同樣分別打開兩個頁面,可以看到啟動幾乎沒有加載時間,同時參數也正確傳遞。

原文標題:Flutter 混合開發: 開發一個簡單的快速啟動框架 | 開發者說·DTalk

文章出處:【微信公眾號:谷歌開發者】歡迎添加關注!文章轉載請注明出處。



審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3978

    瀏覽量

    130711
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    17989
  • 代碼
    +關注

    關注

    30

    文章

    4907

    瀏覽量

    71240
  • Plugin
    +關注

    關注

    0

    文章

    9

    瀏覽量

    3114

原文標題:Flutter 混合開發: 開發一個簡單的快速啟動框架 | 開發者說·DTalk

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發者】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    華為正式啟動HarmonyOS 6開發者Beta

    在2025年華為開發者大會(HDC)上,華為正式啟動HarmonyOS 6開發者Beta,并全面展示一年多以來與合作伙伴共建鴻蒙生態的創新成果。
    的頭像 發表于 06-24 15:42 ?453次閱讀

    ArkUI-X中Plugin生命周期開發指南

    ; } } } 添加ArkUI-X插件 在StageActivity中,新增addPlugin11+方法,并以字符串形式提供IArkUIXPlugin的實現類的完整包名,用于將開發者實現
    發表于 06-04 22:36

    北京迅為RK3568開發板OpenHarmony系統南向驅動開發內核HDF驅動框架架構

    北京迅為RK3568開發板OpenHarmony系統南向驅動開發內核HDF驅動框架架構
    的頭像 發表于 03-11 14:13 ?1193次閱讀
    北京迅為RK3568<b class='flag-5'>開發</b>板OpenHarmony系統南向驅動<b class='flag-5'>開發</b>內核HDF驅動<b class='flag-5'>框架</b>架構

    涂鴉Wukong AI硬件開發框架超強兼容DeepSeek等大模型,助你打造爆款AI硬件

    一、什么是“Wukong”?涂鴉全新推出的“Wukong”AI硬件開發框架,是為實現AI硬件領域的商業化而專門開發設計的創新平臺。它基于TuyaOS所構建,繼承了諸多優勢,如跨平臺兼容性、模塊化
    的頭像 發表于 02-13 20:58 ?957次閱讀
    涂鴉Wukong AI硬件<b class='flag-5'>開發</b><b class='flag-5'>框架</b>超強兼容DeepSeek等大模型,助你打造爆款AI硬件

    熱門前端框架:引領現代 Web 開發的潮流

    在當今快速發展的前端開發領域,熱門前端框架如 React、Vue 和 Angular 等,成為了開發者構建高效、高性能 Web 應用的得力工具。它們各自具有獨特的特點和優勢,引領著現代 Web
    的頭像 發表于 01-22 10:08 ?552次閱讀

    AI開發框架集成介紹

    隨著AI應用的廣泛深入,單一框架往往難以滿足多樣化的需求,因此,AI開發框架的集成成為了提升開發效率、促進技術創新的關鍵路徑。以下,是對AI開發
    的頭像 發表于 01-07 15:58 ?634次閱讀

    商湯參與基于昇思AI框架的大模型原生開發成果發布

    近日,昇思人工智能框架峰會暨成果發布會在北京舉辦。AI框架作為大模型開發及產業落地的基礎軟件,在人工智能技術棧中起到使能算法開發、釋放硬件性能的“承上啟下”作用。
    的頭像 發表于 12-17 15:04 ?908次閱讀

    SSM框架的源碼解析與理解

    SSM框架(Spring + Spring MVC + MyBatis)是一種在Java開發中常用的輕量級企業級應用框架。它通過整合Spring、Spring MVC和MyBatis三個框架
    的頭像 發表于 12-17 09:20 ?1054次閱讀

    SSM框架的優缺點分析 SSM在移動端開發中的應用

    :Spring框架是企業型開發使用的成熟的開源框架,能夠節省成本。SSM框架使用起來更加輕快,能夠更合理地分配資源,使用最小的資源完成當前的需求。 節省
    的頭像 發表于 12-16 18:18 ?2542次閱讀

    SSM框架在Java開發中的應用 如何使用SSM進行web開發

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web開發中常用的技術棧。它通過分層架構,實現了視圖、控制、業務邏輯和數據訪問的分離,提高了代碼的可維護性和可擴展性
    的頭像 發表于 12-16 17:28 ?1755次閱讀

    大語言模型開發框架是什么

    大語言模型開發框架是指用于訓練、推理和部署大型語言模型的軟件工具和庫。下面,AI部落小編為您介紹大語言模型開發框架
    的頭像 發表于 12-06 10:28 ?597次閱讀

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)習慣推薦方案開發者測試

    意圖框架開發者提供真機測試能力,即開發者可連接設備進行調測。開發者完成代碼開發之后,功能正式上架應用市場前,可以在HarmonyOS NE
    發表于 11-25 17:37

    JavaWeb框架比較

    JavaWeb框架開發人員提供了構建Web應用程序所需的基礎設施和組件,每種框架都有其獨特的特點和適用場景。以下是對幾種主流JavaWeb框架的比較: Spring MVC 優點
    的頭像 發表于 11-25 09:14 ?775次閱讀

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)事件推薦開發者測試

    意圖框架開發者提供真機測試能力,即開發者可連接設備進行調測。開發者完成代碼開發之后,功能正式上架應用市場前,可以在HarmonyOS NE
    發表于 11-18 17:39

    潤和軟件啟動鯤鵬原生開發合作

    近日,江蘇潤和軟件股份有限公司(以下簡稱“潤和軟件”)與華為舉辦鯤鵬原生開發啟動儀式,宣布正式啟動鯤鵬原生開發。潤和軟件將以openEuler開源操作系統定制化為核心,基于鯤鵬硬件底座
    的頭像 發表于 08-28 17:27 ?1084次閱讀
    主站蜘蛛池模板: 久久综合中文字幕 | 婷婷丁香六月激情综合啪 | 91麻豆精产国品一二三产区区 | 免费成人在线播放 | 欧美性受xxx黑人xyx性爽 | 最好看十大无码av | 午夜av在线 | 国产精品久久久免费视频 | 国产高清视频在线观看97 | 91啪视频在线观看 | 成+人+黄+色有声+小说免费 | 激情免费网站 | 亚洲成色www8888 | 亚洲人成小说 | 亚洲欧美另类在线观看 | 深夜成人福利 | 暖暖av| 久久精品成人免费国产片桃视频 | 久久精品日本啪啪涩涩 | 一卡二卡三卡视频 | 亚洲中文字幕精品一区二区三区 | 少妇熟女高潮流白浆 | 欧美在线xxxx | 国产无精乱码一区二区三区 | 亚洲视频国产 | 婷婷久久久亚洲欧洲日产国码av | 亚洲精品v天堂中文字幕 | 99久热re在线精品99 6热视频 | 国模丽丽啪啪一区二区 | 亚洲天堂在线观看视频 | 沦为黑人姓奴的少妇 | 99re这里只有精品在线 | 91重口入口处 | 宅男噜噜噜66网站在线观看 | 天堂а√在线资源在线 | 蜜臀99久久精品久久久久小说 | 欧美午夜免费 | 好看的日韩av | 夫の友人 风间ゆみ 在线 | 国产一区91精品张津瑜 | 欧美超级乱婬视频播放 | 又粗又猛又黄又爽无遮挡 | 大胸喷奶水www视频妖精网站 | 福利国产视频 | 国内露脸8mav | 成年女人永久免费看片 | 香蕉在线观看视频 | 国产一线二线三线wwww | 看全色黄大色黄大片大学生图片 | 亚洲天堂黄色 | 粉嫩一区二区三区四区公司1 | 免费观看久久 | 一曲二曲三曲在线观看中文字幕动漫 | 国产一级黄色录像 | 涩涩综合 | 欧美性videos高清精品 | 在线观看国产精品视频 | 亚洲精品国产剧情久久9191 | 99热久久免费频精品18 | 亚洲高清毛片一区二区 | 亚洲第一色区 | 特黄特色大片免费播放器下 | 国产精品毛片一区二区三区 | 999久久久国产 | yy8男人的天堂 | 欧美精品一区二 | 成人做爰9片免费视频 | 亚洲激情视频网 | 国产av仑乱内谢 | 亚洲黄色毛片视频 | 欧美嫩草影院 | 少妇性做爰xxxⅹ性视频 | 欧美色欧美亚洲高清在线视频 | 蜜桃传媒一区二区亚洲 | 国产香蕉97碰碰久久人人 | 亚洲精品国产嫩草在线观看东京热 | 无码专区3d动漫精品免费 | 337p嫩模大胆色肉噜噜噜 | 日韩一区在线播放 | 国产乱老熟视频网88av | 国产高清在线不卡 | 国产一区二区精彩视频 | 久久国产精品视频一区 | 中国毛片视频 | 久草黄色网| 久久久久国色av免费观看性色 | 国产超碰人人模人人爽人人添 | 天堂网a | a级大片免费看 | 日日爱网站 | 国产精品久久久久久久影院 | 国产成人精品一区二区三区四区 | 欧美激情欲高潮视频在线观看 | 青春草免费视频 | 啪啪av大全导航福利网址 | 久久精品国产99国产精品 | av毛片网站 | 一级免费片 | 亚洲精品久久久久久久蜜桃 | 欧美爱爱网址 | av一区二区免费 | 国产精品成人网 | 欧美18—20岁hd第一次 | 国产粉嫩呻吟一区二区三区 | 欧美国产片| 202丰满熟女妇大 | 91极品视频| 国产成人精品a视频一区 | 人人干在线观看 | 白嫩少妇hdxxxⅹ性大陆 | 一级片久久久久 | 日韩欧美一区二区三区 | 欧美激情国产精品 | 久久www人成免费产片 | 伊人国产视频 | 被黑人猛躁10次高潮视频 | 91中文字幕在线 | 国产三级国产精品国产普男人 | 人妻少妇精品视频一区二区三区 | 青青草久久爱 | 亚洲国产精品成人无码区 | 国偷自产一区二区免费视频 | 国产精品成人一区二区三区 | 国产人妻精品久久久久野外 | 日本视频免费高清一本18 | 欧美性大战xxxxx久久久 | 黄视频在线免费 | 中文字幕免费在线播放 | 亚洲欧美另类激情综合区 | 中文字幕乱视频 | 国产亚洲欧美一区二区三区 | 色妞网| 亚洲日本欧美日韩中文字幕 | 蜜臀av无码一区二区三区 | 91国偷自产一区二区使用方法 | 成人无码www免费视频 | 久久精品99久久久久久 | 爱情岛亚洲论坛入口首页 | 亚洲国产精品综合 | 欧美精品久久天天躁 | 欧美一区二区三区免费播放视频了 | 中文字幕精品一区 | 裸体丰满少妇做受久久99精品 | 樱桃视频一区二区三区 | 亚洲一久久 | www.se天堂| 国产精品久久久久久久久免费 | 亚洲女优在线观看 | 国产高清av在线播放 | 久久精品无码一区二区三区免费 | 粉嫩小泬无遮挡久久久久久 | 日日干视频 | 亚洲黄色在线看 | 久久亚洲精中文字幕冲田杏梨 | 日韩精品中文字幕一区二区三区 | 国产精品久久久久久久妇女 | 乌克兰少妇videos高潮 | 色狠狠久久aa北条麻妃 | 国产欧美日韩在线视频 | 天天躁日日躁狠狠躁 | 日韩乱码在线 | 国产真实乱对白精彩 | 久久日本三级韩国三级 | 亚洲国产一区久久yourpan | 日韩视频不卡 | 欧美成人一区二区三区四区 | 香蕉久久影院 | 99r在线视频| 久久久久国产精品人妻aⅴ毛片 | 精品久久久久久久久久久国产字幕 | 精东粉嫩av免费一区二区三区 | 女生高潮视频在线观看 | 香蕉国产999 | 88国产精品视频一区二区三区 | 中国凸偷窥xxxx自由视频妇科 | 国内自拍xxxx18 | 亚洲综合色成在线播放 | 777午夜福利理论电影网 | 青娱乐极品视频在线 | av网址在线| 欧美婷婷六月丁香综合色 | 孕妇丨91丨九色 | 久久综合激激的五月天 | 国产一级小视频 | 日本少妇毛耸耸毛多水多 | 九九福利视频 | 看黄网站在线观看 | av香港经典三级级 在线 | 久久国产香蕉视频 | 日本亚洲色大成网站www久久 | 日韩在线 | 久久综合成人网 | 久久中文一区二区 | 国产自产视频 | 透视性魅力 | 天堂资源中文 | 国产性猛交普通话对白 | 91蝌蚪在线观看 | 亚洲国产成人无码av在线播放 | 男人的天堂视频在线观看 | 黑巨人与欧美精品一区 | 偷拍精偷拍精品欧洲亚洲网站 | 亚洲色中色| 色综合久久久久久 | 黄色三级网站在线观看 | 国产日韩欧美 | 久久春色 | 欧美在线高清 | 无码人妻精品一区二区三区久久久 | 无码h黄动漫在线播放网站 国产精品高潮露脸在线观看 | 免费无码黄动漫在线观看 | 免费观看的无遮挡av | 欧美成人milf | cosplay福利禁视频免费观看 | 在线观看麻豆av | 亚洲成av人片一区二区 | 国产日产久久高清欧美一区 | 国产69精品久久久久777 | 亚洲精品久久区二区三区蜜桃臀 | www.成人在线视频 | 日本午夜免费福利视频 | yy111111少妇无码理论片 | 蜜桃精品久久久久久久免费影院 | 国产高清视频在线 | 一二三区精品 | 亚洲综合激情网 | 午夜亚洲一区 | 中文字幕av一区二区三区谷原希美 | 91porn国产成人福利 | 欧美日韩色视频 | 国产欧美熟妇另类久久久 | 91精品国产综合久久久久久软件 | 精品国产午夜肉伦伦影院 | 国产99在线 | 欧美 | 色先锋av| 国产人久久人人人人爽 | 久久久久久久久久一区二区三区 | 99精品在线观看 | 成人性生交大片免费看中文 | 9999热视频 | 国产成人手机视频 | 日本a级片视频 | 性残虐av片在线播放 | 色乱码一区二区三区 | 欧美精品videosbestsex日本 | 欧美极品在线视频 | 久久99精品久久久久久蜜芽 | 亚洲午夜网 | 91免费视频网站 | 免费观看性生交大片3 | 国产精品久久久久久久乖乖 | 人妻与老人中文字幕 | 亚洲综合图区 | 欧美精品成人影院 | 日本三级视频网站 | 欧美人与按摩师xxxx | 成人福利影院 | 欧美成人高清在线 | 免费不卡的av | 在线视频免费观看你懂的 | 国产三级av在线播放 | 亚洲成人三区 | 国产精品自产拍高潮在线观看 | 国产三级在线视频 一区二区三区 | 亚洲成av人影院在线观看 | 久久中出 | 蜜桃导航-精品导航 | 怡红院av久久久久久久 | 精品一区中文字幕 | 一区二区三区中文字幕 | 中文字幕不卡一区 | 日本天天黄网站 | 国产99久久久久久免费看 | 第一福利在线观看 | 久热在线 | 少妇又色又紧又大爽又刺激 | 欧美日本国产欧美日本韩国99 | 亚洲在av极品无码天堂手机版 | 日本熟妇乱子伦xxxx | 一区二区三区国产视频 | 国产欧美va欧美va香蕉在 | 国产无遮挡a片又黄又爽 | 日韩在线一区二区三区免费视频 | 在线综合av| 国产精品igao视频网网址不卡日韩 | 亚洲精品12p| 久久久久久久久99精品大 | 中国丰满熟妇xxxx性 | 日韩一区二区a片免费观看 性色av无码久久一区二区三区 | 国产精品对白刺激蜜臀av | 小sao货水好多真紧cao视频 | 欧美成人午夜激情 | 成人在线视频播放 | 91九色蝌蚪porny | 亚洲综合在线观看视频 | 性欢交69国产精品 | 国产成人一区二区三区视频 | 中文字幕亚韩 | 7777欧美日激情日韩精品 | 免费看的黄色网 | 明星性猛交ⅹxxx乱大交 | 扒开双腿疯狂进出爽爽爽视频 | 国产精品久久久国产盗摄蜜臀 | 狠色狠狠色狠狠狠色综合久久 | 丁香五月网久久综合 | 66亚洲一卡2卡新区成片发布 | 成年女性特黄午夜视频免费看 | 久艹在线观看 | 国产精品第一 | 一区二区免费视频 | 国产精品久久久久久久久久久久午夜片 | 国产jjizz一区二区三区视频 | 亚洲理论在线观看 | 雨宫琴音av一区在线播放 | 韩国19禁无遮挡啪啪无码网站 | 最近中文字幕2019在线一区 | 欧洲性网站 | 色网站在线观看 | 婷婷丁香五月激情综合 | 中文永久有效幕中文永久 | av片免费观看 | 妇子乱av一区二区三区 | 欧美bbbbb| a级特黄毛片 | 夜夜操网| 国产欧美日韩va另类在线播放 | 偷偷操不一样的久久 | 精品少妇一区二区三区免费观看 | 国产精品1区 | 国产美女精品一区二区三区 | 久久刺激 | 国产精品久久久久久妇女 | 先锋资源av网 | 成人国产精品久久久 | 欧美成人片在线 | 久久激情五月 | www.av在线 | 国产乱xxxxx国语对白 | 嫩草午夜少妇在线影视 | av之家在线 | 色小说综合 | 一区二区精品视频在线观看 | 亚洲综合色丁香婷婷六月图片 | 日本啪啪网站 | 狠狠色噜噜狠狠狠狠色综合久 | 午夜免费高清视频 | 一本色道久久综合无码人妻 | 欧美大肚乱孕交hd孕妇 | 久久久xxxx | 性与爱午夜视频免费看 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 成人香蕉视频在线观看 | 狂野欧美性猛交xxxxx视频 | 涩久久| 亚洲精品自拍 | 日本老太婆做爰视频 | 天天躁日日躁狠狠躁2018小说 | 成人夜色视频 | 后宫一级淫片免费放 | 精品一区二区三区四区外站 | 亚洲视频国产视频 | 福利网站在线观看 | 特黄毛片杨钰莹 | 久久综合精品国产二区无码 | 北条麻妃99精品青青久久 | 国产精品一区二区毛片 | 国产99久久久国产 | 久久久精品国产sm调教网站 | 欧美在线成人影院 | 久久久久人人 | 国产一级淫片a | 91porny首页入口 | 亚洲一区二区三区在线 | 我们高清中文字幕mv的更新时间 | 国产成人无码免费视频在线 | 久久无码人妻一区二区三区午夜 | 国产www在线观看 | 少妇人妻av毛片在线看 | 亚洲人成人77777网站 | 骚虎视频在线观看 | 欧美一区二区三区四区在线 | 老司机在线精品视频网站的优点 | jizzjizz在线播放 | 人妻 偷拍 无码 中文字幕 | 亚洲欧洲精品成人久久曰影片 | 亚洲精品视频在线 | 好吊色视频在线观看 | 亚洲精品乱码久久久久久不卡 | 人人爽人人爽人人片 | 女人高潮抽搐喷液30分钟视频 | 日本一卡二卡视频 | 国产精品久久久久久影视 | 亚洲一区二区三区日韩 | 日产欧产美韩系列在线播放 | 亚洲精品成人av在线 | 中文字幕第1页第69 中文字幕第22页 | www.久久久久久久久 | 香蕉久草 | 中文天堂在线观看 | 开心五月色婷婷综合开心网 | 国精产品一品二品国在线 | 九色国产精品入口 | 丰满人妻熟妇乱又伦精品 | 国产精品自在拍在线拍 | 综合久久av | 色偷偷人人澡人人爽人人模 | 午夜精品久久久久久99热小说 | 精品久久久久一区二区国产 | 成人动漫免费观看 | 成年在线观看视频 | 国产精品一区二区在线播放 | 精品视频免费播放 | 亚洲国产成人一区二区在线 | 无码中文字幕日韩专区 | 玖玖热麻豆国产精品图片 | 亚洲v国产v欧美v久久久久久 | 少妇裸体淫交视频免费观看 | 黄色片视频免费看 | 国产精品福利网站 | 在线精品视频一区二区三四 | 好大好湿好硬顶到了好爽视频 | 久久精品一区二区三区四区 | 国产欧美做爰xxxⅹ在线观看 | 又粗又爽又猛高潮的在线视频 | 91伦理在线| 校园春色亚洲激情 | 自拍在线视频 | 日韩三级观看 | 免费网站日本a级淫片免费看 | jlzzjlzzjlzz亚洲人 | 少妇裸体淫交免费视频网站 | 4438亚洲最大 | 日韩特黄特色大片免费视频 | 性高朝大尺度少妇大屁股 | 欧美天堂视频 | 四色成人| 国产精品免费久久久久影院 | 成人免费观看49www在线观看 | 黑人巨大精品欧美黑寡妇 | 日韩性生交大片免费看 | 人人爽人人爽人人片av | 婷婷激情小说网 | 国产精品日| 中文字幕免费中文 | a级老太婆毛片老太婆毛片 a级毛片,黄,免费观看 m | 久久国产精品视频一区 | 99久久久久久久久久久 | 日本美女视频一区 | 91精品久久久久久久99蜜桃 | 国产成人精品999 | 久久国产经典 | 1024精品一区二区三区日韩 | 久草福利视频 | 亚洲爆爽av | 日韩女同强女同hd | 国产精品久久久久久无人区 | 国产在线欧美日韩 | 久久9999久久免费精品国产 | 国产免费久久精品国产传媒 | 性做久久久久久 | 欧美国产高清 | 小鲜肉自慰网站xnxx | 成人亚洲综合 | 性一乱一会一精一品 | 国产精品久久久久久久久免费软件 | 国内精品九九久久久精品 | 亚洲精品大片www | 69午夜| 一对一色视频聊天a | 亚洲成色www久久网站 | 91九色丨porny丨丰满6 | 亚洲成av人片一区二区梦乃 | 国产伦精品一区二区三区免费视频 | 精品一区不卡 | 亚洲另类伦春色综合妖色成人网 | 婷婷爱五月 | 国产精品成人国产乱一区 | 最新日韩av | 久久欧美国产伦子伦精品 | 色偷偷av亚洲男人的天堂 | 欧美日韩不卡合集视频 | 少妇伦子伦精品无吗在线观看 | videos国产单亲乱 | 免费人妻精品一区二区三区 | 天天拍夜夜添久久精品大 | 国产在线国偷精品免费看 | 天天色天天艹 | 精品国产免费久久久久久婷婷 | 日本不卡高清一区二区三区 | 日韩a级大片| 亚洲日韩欧美国产高清αv 性夜久久一区国产9人妻 | 国产一级特黄,真人毛片 | 中文字幕日本最新乱码视频 | 日本欧美在线视频 | 麻豆 美女 丝袜 人妻 中文 | 亚洲欧美日韩国产 | 男人的天堂av高清在线 | 成人免费短视频 | 日韩精品免费一区二区在线观看 | 99啪啪| 亚洲欧洲精品成人久久曰 | 日韩美女爱爱 | 国内自拍一二三四2021 | 亚洲乱码一区二区 | 日韩视频在线一区二区 | 国产一级不卡毛片 | 377p粉嫩大胆色噜噜噜 | 色呦呦在线观看视频 | 中文字幕乱码在线播放 | 日韩在线播放一区二区 | 69视频在线观看免费 | 国产精品日韩欧美 | 男人用嘴添女人下身免费视频 | 欧美综合网 | 91观看在线| 在线一区二区三区视频 | 色五月情 | 午夜片神马影院福利 | 另类 综合 日韩 欧美 亚洲 | 青青草午夜 | 中日韩无砖码一线二线 | 成人极品| 伊人伊成久久人综合网站 | 超碰97人人射妻 | 少妇一边呻吟一边说使劲视频 | 饥渴少妇勾引水电工av | 国产123在线 | 久久亚洲精华国产精华液 | 日韩免费在线视频观看 | 欧美乱色伦图片区 | 国产在线视频一区二区董小宛性色 | 黄色欧美视频 | 日韩一级视频 | 国产福利在线 | 国产精品久久久久久久久免小说 | 疯狂少妇| 国产精品欧美福利久久 | 97在线超碰| 久久久久久久极品内射 | 三级自拍 | 五月婷婷六月香 | 日本中文字幕有码 | 久操视频网站 | 无遮挡粉嫩小泬久久久久久久 | 绫濑遥av| 秋霞欧洲| 国产性色αv视频免费 | 成人午夜激情视频 | 国产一精品一av一免费爽爽 | 玖玖综合网 | 日本欧美韩国国产精品 | 女性脱给我揉视频 | 国产日韩久久久久69影院 | 爆爽久久久一区二区又大又黄又嫩 | 国产三级国产精品国产普男人 | 国产免费a∨片在线观看不卡 | 午夜美女裸体福利视频 | 久久久久女教师免费一区 | 自慰无码一区二区三区 | 亚洲高清无专砖区 | 国产乱色国产精品播放视频 | 精品人妻无码一区二区三区抖音 | www欧美在线观看 | 日日碰狠狠添天天爽超碰97久久 | 国产激情久久久久久熟女老人av | 快好爽射给我视频 | 鲁一鲁一鲁一鲁一色 | 小毛片| av中文字幕免费在线观看 | 97超碰免费在线观看 | 精品少妇无码av无码专区 | 毛茸茸熟妇丰满张开腿呻吟性视频 | 中国凸偷窥xxxx自由视频 | 天天躁日日躁狠狠躁超碰97 | 黄色网址最新 | 91视频成人 | 欧美激情三区 | 久久理伦| www,色 | 日韩免费久久 | 国产男女爽爽爽免费视频 | 91干干| 精品久久久精品 | 国产精品久久久久无码av色戒 | 嫩草视频国产精品 | 国产精品久久久久久久久久 | 台湾佬综合网 | 夜夜揉揉日日人人 | 日本三级黄色录像 | 成人免费一区二区三区 | 国产原创剧情av | 亚洲成a∨人片在线观看无码 | 99久久久久国产精品免费人果冻 | 骚虎av| 亚洲成人在线免费 | 日日摸夜夜添狠狠添久久精品成人 | 自慰小少妇毛又多又黑流白浆 | 一区二区三区无码高清视频 | 亚洲日韩国产av无码无码精品 | 我看黄色一级片 | 国产在线aaa片一区二区99 | 国产精品伦一区二区三级视频 | 国产精品成人片在线观看 | 国产一区精品视频 | 成年女人18级毛片毛片免费 | 成人av网站在线 | 免费精品久久久久久久一区二区 | 日韩不卡手机视频在线观看 | 91在线看视频 | xxxxx在线观看 | 午夜久久久久久久久 | 青青草91| 国产丰满麻豆videossex | 日韩欧美四区 | 欧美做受xxxxxⅹ性视频 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品