日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flutter学习之认知基础组件

發布時間:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flutter学习之认知基础组件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

前一天,學習了Dart語法,對Dart的語法和特性有了更深一步的了解。今天,來學習Flutter的基礎控件,身為Android開發者都知道,一開始入坑Android就要熟悉學習其控件,如:TextView,ImageView,Button,ListView,RecycleView等。為什么要學習呢?因為平時的開發都離不開這些控件,UI的呈現都是有這些控件組成的,因此,其重要性就不用說了。對于Flutter來講,基礎控件(widget)就更加重要了。Flutter和Android有所不一樣,Android布局包含布局(RelativeLayout,LinearLayout,ConstrainLayou)和組件。Flutter的一切都是Widget,包括最頂層布局也是Widget,一個頁面有很多很多的Widget組合而成,Widget也稱為裝飾品,窗口小部件。

二、Widget簡介

在Flutter里,UI控件就是Widget,Widget根據不同的功能可以分為結構元素(如按鈕或菜單),文本樣式(字體或者顏色方案),布局屬性(如填充,對齊,居中),可以這么理解,一個flutter的頁面是有一棵樹型的Widget組成,包括根節點,樹枝和樹葉,全都是Widget,只是Widget嵌套Widget,那就可以用下面這張圖來表示:

在Flutter中,Widget是一切的基礎,作為響應式渲染,屬于MVVM的實現機制,通過修改數據,再用setState設置數據,Flutter會自動通過綁定的數據更新Widget,所以在平時開發中,開發者需要的就是實現Widget界面,和數據綁定起來。在平時,用的最多就是StatelessWidget和StatefulWidget這兩種Widget,StatelessWidget表示無狀態的,StatefulWidget表示有狀態的。這里怎么理解呢?在Flutter中每個頁面都是一幀,無狀態就是保持在那一幀,總而言之就是不能跟用戶交互,當有狀態的Widget當數據更新時,其實是繪制了新的Widget,也就是UI發生了變化,只是State實現了跨幀數據同步保存。這里給大家說下,在Android Studio看源碼的兩個工具:

左邊一欄Structure結構(看當前文件,win下的快捷鍵是(Alt+7))和右邊Hierarchy繼承關系(看當前類,win下快捷鍵是F4)都可以幫助你閱讀源碼。因為StatelessWidget和StatefulWidget用的最多,現在只需要用到這兩個,就先學習這兩個Widget。

1.StatelessWidget

源碼StatelessWidget只有三個方法:

  • const StatelessWidget({Key key}):super(key:key):初始化子類的[key]。這個key類是Widget、Element、SemanticsNode的唯一標識符,是用來控制Widget數中替換Widget的時候使用的。
  • StatelessElement createElement():創建一個[StatelessElement]來管理這個小部件在樹中的位置,源碼解釋:子類重寫此方法是不常見的,那這個方法也不用管,只需要知道這個方法用來管理自身在Widget樹中的位置。
  • Widget build(BuildContext context):描述這部件呈現用戶界面的部分。對于StatelessWidget,當Widget第一次插入到樹中,或者父節點更改了配置和所依賴的[InheritedWidget]改變,都會被重新調用。

這里說下如何啟動一個Flutter應用,并使用Flutter框架:

import 'package:flutter/material.dart'; void main() {return runApp(Widget app); } 復制代碼

其實就是在main()函數中調用runApp函數。下面直接直接上例子,繼承StatelessWidget,通過build方法返回一個控件:

import 'package:flutter/material.dart'; //使用`flutter/material.dart` 目的是使用Matrial風格的小控件 void main(){//運行程序runApp(MyApp(null)); } //繼承無狀態的StatelessWidget 使程序自身變為Wiget class MyApp extends StatelessWidget{//要顯示的內容final String text;//數據內容可以通過構造方法傳遞進來MyApp(this.text);//重寫build方法 返回你需要的控件@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Container(//紅色背景color: Colors.red,//高度 現在沒用 會撐滿整個屏幕height: 200,//寬度 運行效果會撐滿整個屏幕width: 200,//內容居中alignment: Alignment.center,//Text控件child: new Text(//Dart語法中 ?? 表示如果text為空,就會返回??號的內容text ?? "my name is Knight",textDirection: TextDirection.ltr,//需要加上這句不然報 RichText widgets require a Directionality widget ancestor.),);} } 復制代碼

Widget和Widget之間通過child進行嵌套,有些Widget只能有一個child。就像上面的Container,有些Widget可以有多個child,像Colum布局。上面例子根布局是Container,Container嵌套了Text。

2.StatefulWidget

什么是有狀態的控件呢?狀態是在創建控件可以同步讀取信息,并且在控件的生命周期內可以改變,當控件狀態發生改變時使用State.setState來及時更新,源碼也是只有三個方法:

前兩個方法和StatelessWidget一樣的,而createState()這個方法源碼注釋是:在Widget樹中給定的位置創建此可變狀態的小部件,子類應該重寫此方法返回新建的,關聯子類的實例。當調用一個StatefulWidget,框架就會調用createState這個方法,當一個StatefulWidget從Widget樹中移除,再次插入樹中,那么會再次調用createState來創建一個新的State對象,這樣做簡化了State對象的生命周期。 需要創建管理的是主要是State,StatefulWidget用起來麻煩一些,他需要一個State,例子如下:

//繼承StatefulWidget class StateWidget extends StatefulWidget{@overrideState createState(){return _StateWidget();} }class _StateWidget extends State<StateWidget>{//重寫build方法@overrideWidget build(BuildContext context){} } 復制代碼

簡單觀察上面代碼,大致流程還是和StatelessWidget一樣的,build方法照樣返回Widget,不過在StatefulWidget將這個方法放在createState里面。這里細想一下,也知道為什么要這樣做,因為當狀態改變,就會回調createState方法,重新調用build方法重新創建UI,下面通過每兩秒改變UI這個例子來加深理解:

import 'package:flutter/material.dart'; //使用`flutter/material.dart` 目的是使用Matrial風格的小控件 import 'dart:async';//記得導庫 void main(){//運行程序runApp(StateWidget()); } //控件繼承State class _StateWidget extends State<StateWidget>{int Number = 0;String text;//構造函數_StateWidget(this.text);@overridevoid initState(){//初始化,這個函數在控件的生命周期內調用一次super.initState();print("進入initState");//3秒后改變text的內容new Future.delayed(const Duration(seconds: 3),(){setState(() {Number++;text = "已經改變數值,數值現在是$Number";});});}@overridevoid dispose(){//銷毀super.dispose();print('銷毀');}@overridevoid didChangeDependencies(){//在initState之后調super.didChangeDependencies();print('進入didChange');}//重寫build方法@overrideWidget build(BuildContext context){return Container(//紅色背景color: Colors.red,//內容居中alignment: Alignment.center,//Text控件child: new Text(//Dart語法中 ?? 表示如果text為空,就會返回??號的內容text ?? "沒改變數值",textDirection: TextDirection.ltr,//需要加上這句不然報 RichText widgets require a Directionality widget ancestor.),);} } 復制代碼

上面例子可以知道知道:在State可以動態更改數據,在調用setState后,改變的數據會除法Widget重新構建,上面代碼還寫了三個生命周期方法,這里簡單說一下:

  • initState:初始化操作
  • didChangeDependencies:在initState之后調用,可以獲取其他State
  • dispose:銷毀

平時開發中在build實現布局的擺放,把數據添加Widget,通過setState改變數據。那如果很高頻率取改變數據,性能肯定受影響,以下三點可以減少重新構建有狀態控件的影響:

  • 樹根上盡量不用狀態控件,因為如果數據有變化樹根每次都更新,那就是整棵樹都要重建,把狀態用在樹葉上,這樣更新的時候只會更新自己。
  • 減少build方法所創建的節點數量和控件數量。
  • 利用緩存,如果子樹中不更改,將子樹中緩存起來,每次使用其子樹時重新使用它,學會重用思想。
  • 盡可能使用const修飾控件。 怎么去選擇有狀態和無狀態,最簡單就是可以跟用戶進行交互應該使用StatefulWidget,例如:點擊,滑動屏幕信息流數據更新,如果只是僅僅顯示數據,那就可以選擇使用StatelessWidget創建一個無狀態控件。
  • 三、Flutter頁面

    Flutter有顯示的Widget和完整頁面呈現的Widget,常見的有MaterialApp、Scaffold、Appbar、Text、Image、FlatButton,下面以表格形式簡單列一下:

    下面一個個簡單上例子介紹:

    1.MaterialApp

    import 'package:flutter/material.dart'; //使用`flutter/material.dart` 目的是使用Matrial風格的小控件 void main(){//運行程序runApp(MyApp()); }//用無狀態控件顯示 class MyApp extends StatelessWidget{@overrideWidget build(BuildContext context){return MaterialApp(//標題title:'Widget_Demo',//主題色theme:ThemeData(//設置為藍色primarySwatch: Colors.blue),//這是一個Widget對象,用來定義當前應用打開的時候,所顯示的界面home:MyHomePage(),);} }class MyHomePage extends StatelessWidget{@overrideWidget build(BuildContext context){return Scaffold(//設置appbarappBar:new AppBar(title:new Text('This is a Demo'),),//主體body:new Center(//在屏幕中央顯示一個文本child:new Text('Hello'),),);} } 復制代碼

    效果如下圖:

    上面可以看到MaterialApp作為了主界面入口。

    2.Scaffold

    上面例子home:MyHomePage()這里返回了ScaffoldWidget,而這個Widget正是我們所看到的頁面,看到Scaffold包含了appBar和body,一開始說到,Scaffold也包含Drawers,下面實現一下:

    @overrideWidget build(BuildContext context){return Scaffold(//設置appbarappBar:new AppBar(title:new Text('This is a Demo'),),//主體body:new Center(//在屏幕中央顯示一個文本child:new Text('Hello'),),//左側抽屜drawer:Drawer(//添加一個空的ListViewchild:ListView(),),);} 復制代碼

    效果如下:

    下面往抽屜里添加點東西,就添加ListView,代碼如下:

    //左側抽屜drawer:Drawer(child:ListView(//設置paddingpadding:EdgeInsets.zero,children: <Widget>[//據說這里可以替換自定義的header//userHeader,ListTile(//標題內容title: Text("This is Item_one"),//前置圖標leading: new CircleAvatar(child:new Icon(Icons.scanner),),),ListTile(//標題內容title: Text("This is Item_two"),//前置圖標leading: new CircleAvatar(child:new Icon(Icons.list),),),ListTile(//標題內容title: Text("This is Item_three"),//前置圖標leading: new CircleAvatar(child:new Icon(Icons.score),),),],),), 復制代碼

    運行效果就是抽屜里加了三行內容的ListView。

    3.AppBar

    下面設置一些AppBar屬性,玩玩:

    //設置appbarappBar: new AppBar(//AppBar內容顯示title: new Text('This is a Demo'),//前置圖標leading: new Icon(Icons.home),//背景顏色 改為紅色backgroundColor: Colors.red,//設置為標題內容居中centerTitle: true,//一個 Widget 列表,代表 Toolbar 中所顯示的菜單,// 對于常用的菜單,通常使用 IconButton 來表示;對于不常用的菜單通常使用 PopupMenuButton 來顯示為三個點,點擊后彈出二級菜單actions: <Widget>[//IconButtonnew IconButton(//圖標icon: new Icon(Icons.add_a_photo),//提示tooltip: 'Add photo',//點擊事件onPressed: () {},),//菜單彈出按鈕new PopupMenuButton<String>(itemBuilder: (BuildContext context) {return <PopupMenuItem<String>>[new PopupMenuItem<String>(value: "one", child: new Text('This one')),new PopupMenuItem<String>(value: "two", child: new Text('This two')),];},//選擇點擊事件onSelected: (String action) {switch (action) {case "one"://增加點擊邏輯break;case "two"://增加點擊邏輯break;}},),],), 復制代碼

    效果如下:

    可以看到,上面Appbar上加了前置圖標、拍照圖標、菜單彈出按鈕、陰影。

    4.Text

    下面用Text來展示文本,把上面例子用文本顯示中間的Hello單獨抽出來,如下:

    //主體body: new Center(//在屏幕中央顯示一個文本 改為自定義樣式child: new CustomTextStyle('This is a Text'),),//單獨文本樣式 class CustomTextStyle extends StatelessWidget{String text;//構造函數 參數外部傳進來CustomTextStyle(this.text);@overrideWidget build(BuildContext context){return Text(text ?? "Hello");} } 復制代碼

    下面把文本字體大小修改,字體樣式修改,背景顏色改改:

    //文本 : 單獨文本樣式 class CustomTextStyle extends StatelessWidget {Paint pg = Paint();String text;//構造函數 參數外部傳進來CustomTextStyle(this.text);@overrideWidget build(BuildContext context) {//設置畫筆顏色為黑色pg.color = Color(0xFF000000);return Text(text ?? "Hello",style: TextStyle(//顏色color: Colors.blue,//字體大小fontSize: 14,//字體加粗fontWeight: FontWeight.bold,//文本背景顏色background: pg),);} } 復制代碼

    上面效果是:

    還有很多的屬性,根據需要去設置就行:

    const TextStyle({this.inherit = true,this.color,//文本樣式this.fontSize,//字體大小this.fontWeight,//繪制文本時的字體粗細this.fontStyle,//字體變體this.letterSpacing,//水平字母之間的空間間隔(邏輯像素為單位),可以負值this.wordSpacing,//單詞之間添加的空間間隔(邏輯像素為單位),可以負值this.textBaseline,//對齊文本的水平線this.height,//文本行與行的高度,作為字體代銷的倍數this.locale,//用于選擇區域定字形的語言環境this.foreground,//文本的前景色,不能與color共同設置this.background,//文本背景色this.shadows,//Flutter Decoration背景設定(邊框,圓角,陰影,漸變等)this.decoration,//繪制文本裝飾,添加上下劃線,刪除線this.decorationColor,//文本裝飾的顏色this.decorationStyle,//文本裝飾的樣式,控制畫虛線,點,波浪線this.debugLabel,String fontFamily,//使用字體的名稱String package,}) 復制代碼

    5.RichText

    這是顯示豐富樣式的文本,這什么意思呢?Text只能顯示一種樣式的文字,如果想在一段文字中顯示多種樣式,就好像Android里面的SpannableString,就需要使用RichText,直接上例子:

    //富文本樣式 class RichWidget extends StatelessWidget {@overrideWidget build(BuildContext context) {return RichText(text: TextSpan(text: 'This is RichText',style: new TextStyle(//false的時候不顯示inherit: true,//字體大小fontSize: 16,//黑色color: Colors.black),children: <TextSpan>[new TextSpan(text: 'Android藝術探索',style: new TextStyle(color: Colors.redAccent,//字體粗細fontWeight: FontWeight.bold,),),new TextSpan(text: '第一行代碼'),new TextSpan(text: 'Android進階之光',style: new TextStyle(color: Colors.indigo,//字體樣式fontSize: 20,),)],));} }//屏幕中間改為富文本widget//主體body: new Center(//Text在屏幕中央顯示一個文本 改為自定義樣式//child: new CustomTextStyle('This is a Text'),//富文本child:new RichWidget()), 復制代碼

    效果如下:

    6.TextField

    下面看看文本輸入框,文本輸入框平時會經常用到:

    body: new Center(//Text在屏幕中央顯示一個文本 改為自定義樣式//child: new CustomTextStyle('This is a Text'),//富文本//child:new RichWidget()//文本輸入框child:new TextFieldWidget() ),//文本輸入框 class TextFieldWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return TextField();} } 復制代碼

    上面例子只能輸入文本內容,如果想要獲取輸入框內容,就要添加一個controller,通過這個controller添加通知來獲取TextField的值,我們一般點擊按鈕或者需要跟后臺交互就要讀取controller.text的值:

    class MyHomePage extends StatelessWidget {//獲取TextEditingControllerfinal editController = TextEditingController();//IconButtonnew IconButton(//圖標icon: new Icon(Icons.add_a_photo),//提示tooltip: 'Add photo',//點擊事件onPressed: () {//輸出print('text inputted: ${editController.text}');//ToastFluttertoast.showToast(msg:'text inputted: ${editController.text}',toastLength: Toast.LENGTH_SHORT,gravity: ToastGravity.CENTER,timeInSecForIos: 1,);},),....//主體body: new Center(//Text在屏幕中央顯示一個文本 改為自定義樣式//child: new CustomTextStyle('This is a Text'),//富文本//child:new RichWidget()//文本輸入框 以構造函數傳遞controllerchild:new TextFieldWidget(editController)), } //文本輸入框 class TextFieldWidget extends StatelessWidget{final controller;//構造函數傳值TextFieldWidget(this.controller);@overrideWidget build(BuildContext context){return TextField(controller: controller,);} } 復制代碼

    注意上面用到了Toast,Toast庫這里很簡單需要兩步:

  • 在pubspec.yaml添加依賴庫fluttertoast: ^2.1.1
  • 導入import 'package:fluttertoast/fluttertoast.dart';
  • 重新運行即可,熱重載可能會出現異常。運行在iOS模擬器需要裝brew和CocoaPods,有問題運行flutter doctor,它真是如名字一樣,就是幫你診斷有沒有錯誤信息,會顯示具體信息。效果如下:

    下面改一下樣式:

    return TextField(controller: controller,//最大長度,右下角會顯示一個輸入數量的字符串maxLength: 26,//最大行數maxLines: 1,//是否自動更正autocorrect: true,//是否自動對焦autofocus: true,//設置密碼 true:是密碼 false:不是秘密obscureText: true,//文本對齊樣式textAlign: TextAlign.center,); 復制代碼

    效果如下:

    7.Image

    Image很好理解就是在界面上區域顯示一張圖片,而這張圖片的來源可以是:本地,網絡,資源圖片等。下面一一演示一下:

    7.1.項目圖片資源

    首先新建一個資源目錄:

    在pubspec.yaml中配置圖片路徑,來識別應用程序所需的assets:

    class MyHomePage extends StatelessWidget {//主體body: new Center(.....//圖片加載child:new ImageWidget()), } //圖片 class ImageWidget extends StatelessWidget{@overrideWidget build(BuildContext context){//項目資源圖片 方式一return Image(image: new AssetImage('images/Image_fluttericon.jpeg'),);//項目資源圖片 方式二 // return Image.asset('images/Image_fluttericon.jpeg');} } 復制代碼

    效果如下:

    7.2.網絡圖片加載

    下面進行網絡圖片加載,也是很簡單:

    class MyHomePage extends StatelessWidget {//圖片路徑String image_url = "https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg";//主體body: new Center(.....//圖片加載child:new ImageWidget(image_url)), } //圖片 class ImageWidget extends StatelessWidget{String image_url;ImageWidget(this.image_url);@overrideWidget build(BuildContext context){return Image.network(image_url);} } 復制代碼

    效果如下:

    下面用一個庫來加載和緩存網絡圖像,也可以與占位符和錯誤小部件一起使用,在pubspec.yaml添加依賴cached_network_image: ^0.4.1+1,在Dart文件導入這個庫import 'package:cached_network_image/cached_network_image.dart';

    //圖片 class ImageWidget extends StatelessWidget{String image_url;ImageWidget(this.image_url);@overrideWidget build(BuildContext context){return new CachedNetworkImage(imageUrl: image_url,//占位符placeholder: new CircularProgressIndicator(),//加載錯誤時顯示的圖片errorWidget: new Icon(Icons.error),//寬高width:200,height: 200,);} } 復制代碼

    當圖片還沒加載出來的時候會顯示占位符,當如果加載出錯會顯示errorWidget的圖片。

    7.3.聲明分辨率相關的圖片

    另外Flutter可以為當前設備添加合適其分辨率的圖像,其實對于Android原生來說,就是在不同分辨率目錄下放置不同分辨率的圖片,只不過flutter并不是創建drawable-xxdpi文件,而是創建以下文件夾:

    .../logo.png .../Mx/logo.png .../Nx/logo.png 復制代碼

    其中M和N是數字標識符,對應于其中包含的圖像分辨率,它們指定不同素設備像比例的圖片,主資源默認對應于1.0倍的分辨率圖片。看下面例子:

    在設備像素比率為1.8的設備上,images/2.0x/logo.png 將被選擇。對于2.7的設備像素比率,images/3.0x/logo.png將被選擇。如果未在Image控件上指定渲染圖像的寬度和高度,以便它將占用與主資源相同的屏幕空間量(并不是相同的物理像素),只是分辨率更高。 也就是說,如果images/logo.png是72px乘72px,那么images/3.0x/logo.png應該是216px乘216px; 但如果未指定寬度和高度,它們都將渲染為72像素×72像素(以邏輯像素為單位)。pubspec.yaml中asset部分中的每一項都應與實際文件相對應,但主資源項除外。當主資源缺少某個資源時,會按分辨率從低到的順序去選擇,也就是說1.0x中沒有的話會在2.0x中找,2.0x中還沒有的話就在3.0x中找。

    return Image(// 系統會根據分辨率自動選擇不同大小的圖片image: AssetImage('images/logo.png'),// ...), 復制代碼

    8.FlatButton

    Flutter預先定義了一些按鈕控件,如FlatButton,RaisedButton,OutlineButton,IconButton。

  • FlatButton:扁平化按鈕,繼承自MaterialButton
  • RaisedButton:凸起按鈕,繼承自MaterialButton
  • OutlineButton:帶邊框按鈕,繼承自MaterialButton
  • IconButton:圖標按鈕,繼承自StatelessWidget
  • 下面看看FlatButton,其他的只是樣式稍微不一樣,大致用法一樣。

    //按鈕 class FlatButtonWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return FlatButton(onPressed: (){Fluttertoast.showToast(msg:'你點擊了FlatButton',toastLength: Toast.LENGTH_SHORT,gravity: ToastGravity.CENTER,timeInSecForIos: 1,);},child: Text('FlatButton'),color: Colors.blue,//按鈕背景色textColor: Colors.white,//文字的顏色onHighlightChanged: (bool b){//水波紋變化回調},disabledColor: Colors.black,//按鈕禁用時的顯示的顏色disabledTextColor: Colors.black38,//按鈕被禁用的時候文字顯示的顏色splashColor: Colors.white,//水波紋的顏色);} } 復制代碼

    上面也設置了一些屬性,效果圖如下:

    四、Flutter布局

    Flutter中擁有30多種預定義的布局widget,常用的有Container、Padding、Center、Flex、Row、Colum、ListView、GridView。用一個表格列出它們的特性和使用。

    下面一一介紹簡單用法:

    1.Container

    一個擁有繪制、定位、調整大小的widget,示意圖如下:

    下面直接上例子:

    class MyHomePage extends StatelessWidget {....body:new ContainWidget(),... } //Container布局 class ContainWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Container(child:Text("My name is Knight"),color: Colors.indigo,width:200,//寬height:200,//高margin:EdgeInsets.fromLTRB(5,5,5,5),//設置外邊距padding:EdgeInsets.all(30),//內邊距);} } 復制代碼

    下面設置邊框,添加圓角:

    //Container布局 class ContainWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Container(....padding:EdgeInsets.all(30),//內邊距decoration: BoxDecoration(//設置邊框//背景色color:Colors.redAccent,//圓角borderRadius: BorderRadius.circular(6),),);} } 復制代碼

    運行效果如下:

    2.Padding

    一個Widget,會給其子Widget添加指定的填充,示意圖如下:

    class MyHomePage extends StatelessWidget {....body: new PaddingWidget(),... } //Padding布局 class PaddingWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Padding(//設置左上右下內邊距為4,10,6,8padding:EdgeInsets.fromLTRB(4, 10, 6, 8),child: Text('My name is Knight'),);} } 復制代碼

    效果圖如下:

    下面實現Container嵌套Padding:

    //Container嵌套Padding class ContainPaddWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Container(width:200,//寬height:200,//高child: Padding(padding:EdgeInsets.fromLTRB(4, 10, 6, 8),child: Text("My name is Knight"),),decoration: BoxDecoration(//設置邊框//背景色color:Colors.redAccent,//圓角borderRadius: BorderRadius.circular(6),),);} } 復制代碼

    效果圖如下:

    3.Center

    將其子widget居中顯示在自身內部的widget,示意圖:

    //Center class CenterWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Container(width:200,//寬height:200,//高child: Center(child: Text("My name is Knight"),),decoration: BoxDecoration(//設置邊框//背景色color:Colors.redAccent,//圓角borderRadius: BorderRadius.circular(6),),);} } 復制代碼

    運行效果如下:

    Center作為Container的孩子,Text所以在布局的中間。

    4.Stack

    可以允許其子Widget簡單的堆疊在一起,層疊布局,示意圖:

    下面直接上代碼,把之前的布局全部用上試試:

    class MyHomePage extends StatelessWidget {....body:new Center(child:new StackWidget()),... } //層疊布局 class StackWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Stack(children: <Widget>[new Image.network('https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg',width:300.0,//寬height:300.0,//高),new Opacity(opacity: 0.6,//不透明度child:new Container(width:100.0,height:100.0,color:Colors.redAccent,),),new Opacity(opacity: 0.6,child:new Container(width: 200.0,height:200.0,color:Colors.indigo,),),],);} } 復制代碼

    運行效果:

    可以看到控件都按Stack左上角對齊,疊在一起,下面改一下顯示位置:

    //層疊布局 class StackWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Stack(//Aliginment的范圍是[-1,1],中心是[0,0].注釋有寫//和Android一樣,左移的取值是往1取,右移是往-1取//這里注意,它是取stack里范圍最大的布局為基準,下面是以Container為//基準對齊alignment: new Alignment(-0.6, -0.6),...);} } 復制代碼

    運行效果圖:

    5.Colum

    在垂直方向上排列子Widget,示意圖如下:

    直接上代碼:

    class MyHomePage extends StatelessWidget {...body:new ColumnWidget(),....} //Column布局 class ColumnWidget extends StatelessWidget {@overrideWidget build(BuildContext context) {return Column(children: <Widget>[Container(color:Colors.blue,width: 50,height: 50,),Container(color:Colors.black,width:50,height:50,),Container(color:Colors.green,width:50,height:50,),],);} } 復制代碼

    運行效果:

    下面簡單設置一下排列方式屬性:

    return Column(//設置垂直方向的對齊方式mainAxisAlignment: MainAxisAlignment.spaceEvenly,...); 復制代碼

    運行效果如下:

    垂直方向(主軸上)屬性:

  • MainAxisAlignment.start這是默認值:垂直方向頂部對齊
  • MainAxisAlignment.end:垂直方向底部對齊
  • MainAxisAlignment.center:垂直方向居中對齊
  • MainAxisAlignment.spaceBetween:垂直方向平分剩余空間
  • MainAxisAlignment.spaceAround:放置控件后,剩余空間平分成n份,n是子widget的數量,然后把其中一份空間分成2份,放在第一個child的前面,和最后一個child的后面,也就是子widget的之前之后之間均勻分割空閑的一半空間
  • MainAxisAlignment.spaceEvenly:放置控件后,把剩余空間平分n+1份,然后平分所有的空間,在子widget之前之后之間均勻的分割空閑的空間
  • 下面列一下水平方向(交叉軸)的屬性:

  • CrossAxisAlignment.center這是默認值,水平居中
  • CrossAxisAlignment.end:水平方向右側對齊
  • CrossAxisAlignment.start:水平方向左側對齊
  • CrossAxisAlignment.stretch:水平方向拉伸子child填充滿布局
  • CrossAxisAlignment.baseline:和textBaseline一起使用
  • 6.Row

    在水平方向上排列子widget的列表,示意圖:

    直接上代碼:

    class MyHomePage extends StatelessWidget {....body:new RowWidget(),... } //Row class RowWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Row(children: <Widget>[Container(color:Colors.blue,width: 50.0,height:50.0,),Container(color:Colors.black,width:50.0,height:50.0,),Container(color:Colors.green,width:50.0,height:50.0,),],);} } 復制代碼

    效果圖:

    下面簡單設置一些屬性,和Column沒多大差別:

    return Row(//把剩余空間平分n+1份,然后平分所有的空間mainAxisAlignment: MainAxisAlignment.spaceEvenly,...); 復制代碼

    效果圖:

    水平方向上(主軸上)屬性:

  • MainAxisAlignment.start這是默認值,水平方向頂部對齊
  • MainAxisAlignment.center:水平方向居中對齊
  • MainAxisAlignment.end:水平方向底部對齊
  • MainAxisAlignment.spaceBetween:水平方向上平分剩余空間
  • MainAxisAlignment.spaceAround:放置控件后,剩余空間平分成n份,n是子widget的數量,然后把其中一份空間分成2份,放在第一個child的前面,和最后一個child的后面,也就是子widget的之前之后之間均勻分割空閑的一半空間
  • MainAxisAlignment.spaceEvenly:放置控件后,把剩余空間平分n+1份,然后平分所有的空間,在子widget之前之后之間均勻的分割空閑的空間 而交叉軸(垂直方向)的屬性:
  • CrossAxisAlignment.center這是默認,垂直居中
  • CrossAxisAlignment.end:垂直方向右側對齊
  • CrossAxisAlignment.start:垂直方向左側對齊
  • CrossAxisAlignment.stretch:垂直方向拉伸子child填充滿布局
  • CrossAxisAlignment.baseline:和textBaseline一起使用
  • 7.Expanded

    Expanded組件可以使Row、Column、Fiex等子組件在其主軸上方向展開并填充可用的空間,這里注意:Expanded組件必須用在Row、Column、Fiex內,并且從Expanded到封裝它的Row、Column、Flex的路徑必須只包括StatelessWidgets或者StatefulWidgets(不能是其他類型的組件,像RenderObjectWidget,它是渲染對象,不再改變尺寸,因此Expanded不能放進RenderObjectWidget),示意圖如下:

    class MyHomePage extends StatelessWidget {....body:new RowWidget(),... } class RowWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Row(children: <Widget>[new RaisedButton(onPressed: (){},color:Colors.green,child:new Text('綠色按鈕1')),new Expanded(child:new RaisedButton(onPressed: (){},color:Colors.yellow,child:new Text('黃色按鈕2')),),new RaisedButton(onPressed:(){},color:Colors.red,child:new Text('黑色按鈕3')),],);} } 復制代碼

    運行效果如下:

    class MyHomePage extends StatelessWidget {....body:new RowWidget(),... } class RowWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return Row(children: <Widget>[Expanded(child:Container(color:Colors.green,padding:EdgeInsets.all(8),height: 40.0,),flex:1,),Expanded(child:Container(color:Colors.yellow,padding:EdgeInsets.all(8),height: 40.0,),flex:2,),Expanded(child:Container(color:Colors.red,padding:EdgeInsets.all(8),height: 40.0,),),],);} } 復制代碼

    上面代碼設置了flex,將一行的寬度分成四等分,第一、三child占1/4的區域,第二個child占1/2區域。 效果如下:

    8.ListView

    我相信這個布局在平時開發會經常用到,這是可滾動的列表控件,ListView是最常用的滾動widget,它在滾動方向上一個接一個地顯示它的孩子。在縱軸上,孩子沒被要求填充ListView,并且內置ListTitle,示意圖如下:

    class MyHomePage extends StatelessWidget {....body: new ListViewWidget(new List<String>.generate(1000,(i){return 'Item &i';}),),... } //ListView class ListViewWidget extends StatelessWidget {final List<String> items;ListViewWidget(this.items);@overrideWidget build(BuildContext context) {return new ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return new ListTile(title: new Text('This is $index'),);},);} } 復制代碼

    效果圖如下:

    下面設置水平的ListView:

    class MyHomePage extends StatelessWidget {....body: new ListViewWidget( new List<String>.generate(1000, (i) { return 'Item &i'; }), ), ... }Widget build(BuildContext context) { return new ListView.builder( itemCount: items.length, //設置水平方向 scrollDirection:Axis.horizontal, //豎直時:確定每一個item的高度 //水平時:確定每一個item的寬度 得要設置 不然不顯示 itemExtent: 110.0, itemBuilder: (context, index) { return new ListTile( title: new Text('This is $index'),); }, ); 復制代碼

    效果如下:

    9.GridView

    GridView是一個網格布局的列組件。GridView繼承至CustomScrollView,示意圖如下:

    直接豎直上例子:

    //GridView class GridViewWidget extends StatelessWidget{ @override Widget build(BuildContext context){ return new GridView.count( crossAxisCount: 3, //3列 children: List.generate(40, (i){ return Card( child: Center( child:Text('This is $i'), ), ); }) ); } } 復制代碼

    下面上水平例子:

    return new GridView.count( //3行 crossAxisCount: 3, //設置水平 scrollDirection: Axis.horizontal,children: List.generate(40, (i) {return Card( child: Center( child: Text('This is $i'), ), ); }), ); 復制代碼

    效果圖如下:

    10.TabBar

    移動開發中tab切換是一個很常用的功能,那么Flutter有沒有提供這個Widget呢?答案是有的,Flutter通過Material庫提供了很方便的API來使用tab切換。

    10.1.創建TabController

    TabBarView和TabBar都有一個TabController的參數,TabbarView和TabBar就是由TabController來控制同步,點擊某個Tab后,要同步顯示對應的TabBarView,創建TabController有兩種方式:

  • 使用系統自帶的DefaultTabController,在Scaffold套一層DefaultTabController,這種方式TabBarView會自動查找這個tabController。
  • 自己定義一個TabController,實現SingleTickerProviderStateMixin
  • 下面就列一下第一種方式:

    @overrideWidget build(BuildContext context) {return new DefaultTabController();} 復制代碼

    10.2.構建Tab數據

    final List<Tab> myTabs = <Tab>[new Tab(text: 'Android'),new Tab(text: 'IOS'),new Tab(text: 'Flutter'),new Tab(text: 'RN'),new Tab(text: 'Java'),new Tab(text: 'C'),new Tab(text: 'C++'),new Tab(text: 'Go'),];復制代碼

    10.3.創建TabBar

    TabBar在哪里都可以創建,在AppBar里有一個bottom參數可以接受TabBar,就放在AppBar下:

    //設置appbarappBar: new AppBar(//底部bottom: new TabBar(indicatorColor: Colors.red, //指示器顏色 如果和標題欄顏色一樣會白色tabs: myTabs,//綁定數據isScrollable: true, //是否可以滑動),), 復制代碼

    10.4.綁定TabBar和TabBarView

    class MyHomePage extends StatelessWidget { final List<Tab> myTabs = <Tab>[new Tab(text: 'Android'),new Tab(text: 'IOS'),new Tab(text: 'Flutter'),new Tab(text: 'RN'),new Tab(text: 'Java'),new Tab(text: 'C'),new Tab(text: 'C++'),new Tab(text: 'Go'),];@overrideWidget build(BuildContext context) {return new DefaultTabController(length: myTabs.length, //Tab長度child: new Scaffold(//設置appbarappBar: new AppBar(//底部bottom: new TabBar(indicatorColor: Colors.red, //指示器顏色 如果和標題欄顏色一樣會白色tabs: myTabs,//綁定數據isScrollable: true, //是否可以滑動),....),body: new TabBarView(//選中哪個Tabs,body就會顯示children: myTabs.map((Tab tab) {return new Center(child: new Text(tab.text));}).toList(),),....);} } 復制代碼

    效果如下圖:

    11.BottomNavigationBar

    BottomNavigationBar即是底部導航欄控件,顯示在頁面底部的設計控件,用于在試圖切換,底部導航欄包含多個標簽、圖標或者兩者搭配的形式,簡而言之提供了頂級視圖之間的快速導航。

    11.1.構建底部標簽

    //底部數據final Map bottomMap ={"首頁":Icon(Icons.home),"朋友圈":Icon(Icons.camera),"信息":Icon(Icons.message),"其他":Icon(Icons.devices_other),}; 復制代碼

    11.2.創建導航欄

    因為點擊導航欄需要對應的字體顯示,所以MyHomePage需要繼承StatefulWidget,增加State,

    //用無狀態控件顯示 class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(//主題色theme: ThemeData(//設置為紅色primarySwatch: Colors.red),//這是一個Widget對象,用來定義當前應用打開的時候,所顯示的界面home: MyHomePageWidget(),);} }class MyHomePageWidget extends StatefulWidget{@overrideState<StatefulWidget> createState(){return new MyHomePage();} } class MyHomePage extends State<MyHomePageWidget> {//底部數據final Map bottomMap ={"首頁":Icon(Icons.home),"朋友圈":Icon(Icons.camera),"信息":Icon(Icons.message),"其他":Icon(Icons.devices_other),};int _index = 0;bottomNavigationBar: BottomNavigationBar(items: (){var items = <BottomNavigationBarItem>[];bottomMap.forEach((k,v){items.add(BottomNavigationBarItem(title:Text(k),//取map的值icon : v,//取map的圖標backgroundColor:Colors.red,//背景紅色));});return items;}(),currentIndex: _index,//選中第幾個onTap:(position){Fluttertoast.showToast(msg: 'text inputted: $position',toastLength: Toast.LENGTH_SHORT,gravity: ToastGravity.CENTER,timeInSecForIos: 1,);setState(() {_index = position;//狀態更新});}),} 復制代碼

    最終效果如下:

    五、實踐

    下面實踐Flutter中文網的例子:

    先上布局分析圖:

    1.實現圖像

    再說一下如何配置圖像

    class MyApp extends StatelessWidget{@overrideWidget build(BuildContext context){return MaterialApp(home:new MyHomeWidget(),);} }class MyHomeWidget extends StatelessWidget{@overrideWidget build(BuildContext context){return new Scaffold(//設置標題欄appBar: new AppBar(title:new Text('Flutter Demo'),),//主體用ListViewbody:new ListView(children: <Widget>[//圖片new Image.asset('images/lake.jpg',width:600.0,height:240.0,//順便設置圖片屬性fit:BoxFit.cover,)],),);} } 復制代碼

    2.實現標題欄

    //實現標題欄Widget titleWidget = new Container(//內邊距padding:const EdgeInsets.all(30.0),//整體是一個水平的布局child:new Row(//只有一個孩子children: <Widget>[//用Expanded 會占用icon之外剩余空間new Expanded(//垂直布局 放置兩個文本child: new Column(//設置文本一起始端對齊crossAxisAlignment: CrossAxisAlignment.start,//有兩個孩子children: <Widget>[new Container(//底部內邊距padding:const EdgeInsets.only(bottom:10.0),//孩子 設置字體樣式child:new Text('Oeschinen Lake Campground',style: new TextStyle(fontWeight: FontWeight.bold),),),new Text('Kandersteg, Switzerland',style: new TextStyle(color:Colors.grey[450],//設置顏色透明度),)],),),new Icon(Icons.star,color:Colors.red[400],),new Text('41'),],),); 復制代碼

    3.實現按鈕行

    因為三個按鈕樣式都是一樣的,所以抽取公共部分:

    /*** 抽取button行的代碼復用**/Column getText(IconData icon,String text){return new Column(//聚集widgetsmainAxisSize:MainAxisSize.min,//child居中mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[new Icon(icon,color:Colors.blue[500]),new Container(//上部外邊距margin: const EdgeInsets.only(top:8.0),//Text內容樣式設定child:new Text(text,style:new TextStyle(color:Colors.blue[500],),),)],);}/*** 按鈕實現*/Widget buttonWidget = new Container(//三列child:new Row(//用MainAxisAlignment.spaceEvenly平均分配子空間mainAxisAlignment: MainAxisAlignment.spaceEvenly,//孩子們children: <Widget>[getText(Icons.call, "CALL"),getText(Icons.near_me, "ROUTE"),getText(Icons.share, "SHARE"),],),); 復制代碼

    4.實現文本

    /*** 文本實現*/Widget textWidget = new Container(alignment: Alignment.center,//設置內邊距padding:const EdgeInsets.all(10.0),child:new Text('Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese Alps. Situated 1,578 meters above sea level, ''it is one of the larger Alpine Lakes. A gondola ride from Kandersteg, ''followed by a half-hour walk through pastures and pine forest, ''leads you to the lake, which warms to 20 degrees Celsius in the summer. ''Activities enjoyed here include rowing, and riding the summer toboggan run.',// softWrap: true,//屬性表示文本是否應在軟換行符(例如句點或逗號)之間斷開。// textAlign: TextAlign.center,),); 復制代碼

    5.整合

    return new Scaffold(//設置標題欄appBar: new AppBar(title:new Text('Flutter Demo'),),//主體用ListViewbody:new ListView(children: <Widget>[//圖片new Image.asset('images/lake.jpg',width:600.0,height:240.0,//順便設置圖片屬性fit:BoxFit.cover,),//標題欄titleWidget,//按鈕欄buttonWidget,//文本欄textWidget,],),);復制代碼

    運行效果圖:

    六、總結

    Flutter還有很多Widget上面沒有說到,就只能自己有空再去學習了,下面直接上一張圖,今天學到的內容:

    學習鏈接:flutterchina.club/widgets/

    如有不正之處歡迎大家批評指正~

    轉載于:https://juejin.im/post/5c5c1f21e51d457fcc5a9f9f

    總結

    以上是生活随笔為你收集整理的Flutter学习之认知基础组件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲六月丁香色婷婷综合久久 | 五月婷在线播放 | 色网址99 | 热re99久久精品国产99热 | 在线观看av免费观看 | 亚洲精品男人天堂 | 久热精品国产 | 国产视频在线观看一区 | 亚洲免费成人av电影 | 黄色免费在线视频 | 日本福利视频在线 | 成 人 黄 色 片 在线播放 | 久久久久在线视频 | 91黄视频在线 | 国产三级国产精品国产专区50 | 国产精品久久久久久久av电影 | 亚洲成人av在线播放 | 欧美成人黄色片 | 色网站黄 | 欧美成人h版| 亚洲最新av网址 | 天天操天天干天天爽 | 91免费高清观看 | 久久毛片网 | 国产专区视频在线观看 | 亚洲一区久久久 | 欧美久久久久久久久 | 99热最新精品 | 国产精品一区二区三区免费视频 | 久久人人爽人人爽 | 精品国产一二区 | 爱色av.com | 国产一二三精品 | 国产精品观看 | 天天躁日日 | 69精品在线 | 国产a国产 | 成人久久久久久久久久 | 国产高清在线a视频大全 | 天天视频色版 | www.天天操.com | 91精品无人成人www | 99精品国产在热久久 | 国产中文字幕大全 | 国产高清中文字幕 | 免费瑟瑟网站 | 国产精品成人品 | 国产乱码精品一区二区蜜臀 | 久久久久国产精品一区 | 午夜精品久久 | 亚洲成人精品影院 | 91在线看免费 | 丁香电影小说免费视频观看 | 中文字幕av免费在线观看 | wwwav视频 | 亚洲一级片在线看 | 国产精品青青 | 91麻豆精品国产91久久久无限制版 | 国产精品va视频 | 欧美精品免费在线观看 | 成人午夜电影网 | 黄色大全免费观看 | 国产女教师精品久久av | 久久精品久久精品久久精品 | 97超碰成人 | 亚洲高清不卡av | 99精品电影| 黄色片视频免费 | 国产美女免费观看 | 成人中文字幕av | 99久久精品国产亚洲 | av成人免费网站 | 免费观看午夜视频 | 欧美韩日精品 | 久草免费电影 | 日本久草电影 | 草樱av| 色综久久| 人人藻人人澡人人爽 | 久久视频这里只有精品 | 亚洲欧洲日韩在线观看 | 久久久久国产精品免费免费搜索 | 在线国产激情视频 | 香蕉91视频 | 久久成人在线视频 | 久久免费黄色网址 | 亚洲国产精品电影 | 在线观看91视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产一区二区在线播放视频 | 久久官网 | 亚洲黄色一级大片 | 激情av在线资源 | 最近免费观看的电影完整版 | 国产精品一区二区久久久 | 久草电影网 | 免费看短 | 免费观看国产视频 | 最近久乱中文字幕 | 亚洲欧美日韩国产一区二区 | 久久精品视频日本 | 精品国产99国产精品 | 国产资源网| 免费视频区 | 久久狠狠干 | 美女视频黄在线观看 | 久草视频资源 | 久草在线中文视频 | 国产精品欧美一区二区 | 日产中文字幕 | 1000部18岁以下禁看视频 | 免费观看视频黄 | 99中文视频在线 | 一级成人网 | 日韩免费高清在线 | 奇米四色影狠狠爱7777 | 亚洲国产成人在线播放 | 91丨九色丨勾搭 | a色视频 | 黄色片免费电影 | 久青草视频在线观看 | 久久免费国产视频 | 人人干干人人 | 亚洲精品视频一二三 | 久久综合国产伦精品免费 | 亚洲经典视频在线观看 | 欧美精品久久 | 欧美精品免费在线观看 | 亚洲精品av中文字幕在线在线 | 欧美成人在线网站 | 免费成人av在线看 | 亚洲美女精品区人人人人 | 久久久国产精品网站 | 亚洲精品在线视频观看 | 在线看一区二区 | 开心色插 | 久久午夜电影院 | 看片黄网站 | 国产一级精品在线观看 | a视频免费在线观看 | 国产精品视频在线观看 | 日韩精品免费一区 | 91成人在线网站 | 黄色h在线观看 | 在线 视频 亚洲 | 中文字幕一区二区三区久久 | 国产区在线视频 | 深夜免费小视频 | 一区二区三区影院 | 日日干干夜夜 | 日韩精品视频免费专区在线播放 | av在线小说| 欧美精品一区二区性色 | 亚洲精品视频免费在线 | 免费成人黄色片 | 婷婷综合电影 | 国产高清在线 | 有码中文在线 | 欧美成人xxx| 在线播放国产精品 | av在线免费网 | 免费看黄在线观看 | 在线观看网站你懂的 | 美女网站免费福利视频 | 人人干人人艹 | 在线看一区二区 | 亚洲欧洲一级 | av不卡中文字幕 | 九九视频这里只有精品 | 久久99国产精品自在自在app | 久久只精品99品免费久23小说 | 成人黄色片在线播放 | 中文字幕免费一区 | 操高跟美女| 欧美久久久久久久久中文字幕 | 日韩激情久久 | 久久久久久久久久久免费av | 91自拍91 | 亚洲成免费 | 天天射夜夜爽 | 亚洲视频每日更新 | 人人干人人草 | 免费看黄色毛片 | 一本—道久久a久久精品蜜桃 | 久久精品福利 | 成人视屏免费看 | 亚洲有 在线 | 久久a级片 | 国产淫片免费看 | 懂色av懂色av粉嫩av分享吧 | 日日碰夜夜爽 | 中文在线最新版天堂 | 99精品欧美一区二区 | 精品国产aⅴ麻豆 | 午夜手机电影 | 精品一区精品二区高清 | 午夜精品电影 | 中文字幕在线观看网站 | 2023年中文无字幕文字 | 97av免费视频| 青青河边草手机免费 | 亚洲一区二区三区四区在线视频 | 久久视频99| 麻豆国产精品永久免费视频 | 久久成人综合 | 久久久视屏 | 日韩欧美视频一区 | 九九热中文字幕 | 亚洲欧美在线视频免费 | 免费成人av在线看 | 91亚洲永久精品 | 亚洲黄色小说网址 | 高清av中文在线字幕观看1 | 国产在线p | 国产精品k频道 | 久久久久久久国产精品 | 成人免费xxx在线观看 | 91观看视频| 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产精品一区二区精品视频免费看 | av中文在线 | 97视频在线观看播放 | 亚洲国产成人在线 | 99re视频在线观看 | 伊人久久av | 在线探花 | www.久久精品视频 | 成人一区影院 | 日日爽视频 | 天天爽天天碰狠狠添 | 97视频中文字幕 | 日韩欧美在线综合网 | 久久视频国产精品免费视频在线 | 手机看片久久 | 天天做天天爱天天综合网 | av官网 | 日本一区二区三区视频在线播放 | 91麻豆精品国产91久久久无限制版 | 日韩在线观看一区二区三区 | 91成人在线视频观看 | 日韩av电影中文字幕 | 久久黄色免费观看 | 久久精品久久精品久久 | 色多视频在线观看 | 久久国产成人午夜av影院宅 | 午夜精品久久久久久 | 狠狠狠狠狠操 | 99精品视频免费看 | 黄色的视频网站 | 一区二区三区在线观看中文字幕 | 久久艹在线 | 亚洲国产无 | 超碰97人人干 | 狠狠的干狠狠的操 | 激情av资源| 日韩电影在线一区 | 精产嫩模国品一二三区 | 精品视频久久 | 欧美日韩一区二区三区免费视频 | 国产专区精品视频 | 亚洲人成精品久久久久 | 日夜夜精品视频 | 97在线精品| 国产高清视频在线播放一区 | 在线观看中文 | 精品免费视频 | 亚洲jizzjizz日本少妇 | 日韩大片在线观看 | 中文伊人 | 色99中文字幕 | 97免费在线观看视频 | 欧美污污网站 | 国产h片在线观看 | 日韩理论电影网 | 在线观看一区二区精品 | 免费在线精品视频 | 日韩av成人在线观看 | zzijzzij亚洲成熟少妇 | 亚洲 欧美 另类人妖 | 国产精品成人免费一区久久羞羞 | 久久 在线 | 久爱综合 | 国产在线专区 | 中字幕视频在线永久在线观看免费 | 九九免费在线观看视频 | 免费一级特黄录像 | 在线观看国产高清视频 | 免费无遮挡动漫网站 | 成人久久免费视频 | 久草在线视频中文 | 又黄又刺激视频 | 天天操天天干天天综合网 | 国产又粗又猛又黄又爽的视频 | 色成人亚洲网 | 午夜视频99 | 欧美视屏一区二区 | 久久国产网站 | 亚洲国产中文字幕在线观看 | 精品在线亚洲视频 | 国产精品女同一区二区三区久久夜 | 国产福利一区二区三区视频 | 日韩在线视频观看 | 亚洲一区二区天堂 | 久久久国产一区二区三区 | 亚洲精品女人久久久 | 久久国产精品一区二区 | 在线观看中文 | 美女一级毛片视频 | 免费不卡中文字幕视频 | 天天综合区 | 亚洲免费在线观看视频 | 一二区精品 | 精品免费在线视频 | 最新av免费在线观看 | 午夜国产一区 | 四虎5151久久欧美毛片 | 久久久久麻豆v国产 | 国产精品高清一区二区三区 | 欧美日本一区 | 久久精品这里精品 | 欧美黑吊大战白妞欧美 | 中文字幕国产在线 | 98超碰人人 | 国产精品一区二区三区四区在线观看 | 精品久久久久国产免费第一页 | 超碰在线中文字幕 | 人人超碰97| 色综合天天综合 | 日韩电影在线观看一区二区三区 | 日韩a免费 | 美女精品网站 | 亚洲午夜精品久久久 | 五月婷婷久久综合 | 99久热在线精品视频观看 | 久久婷婷五月综合色丁香 | 在线观看mv的中文字幕网站 | 美女网站视频免费都是黄 | 久久在线免费观看 | 91自拍91 | www四虎影院| 成人av电影免费在线播放 | 九草在线观看 | 亚洲视频综合在线 | 欧美色噜噜噜 | 美女网站视频久久 | 亚洲六月丁香色婷婷综合久久 | 国产精品久久久久久久久久了 | 日韩电影在线观看一区 | 成人一区在线观看 | 国产精品对白一区二区三区 | 欧美91成人网 | 日本三级中文字幕在线观看 | 色成人亚洲 | 日韩精品欧美一区 | 天天av天天 | 亚洲天堂网在线视频 | 久久不射影院 | 久久久久久久综合色一本 | 色婷婷五 | 99精品国产一区二区三区不卡 | 99色免费视频 | 精品视频99 | 激情五月视频 | 欧美日韩视频观看 | 色免费在线 | 亚洲色图27p | 欧美日韩在线观看视频 | 欧美日韩精品在线视频 | 久久五月激情 | 久久男人中文字幕资源站 | 91大神一区二区三区 | 伊人天堂av | 91视频免费看片 | 欧美日韩三区二区 | 深爱开心激情 | 91中文在线观看 | 69av在线播放 | 久久综合色播五月 | 日日干美女 | 色久综合 | 在线观看精品黄av片免费 | 人人干天天干 | 天天操狠狠操 | 久久精品精品电影网 | 91av在线免费视频 | 欧美一区成人 | 欧美人牲 | 91av精品| 久久精品久久精品久久精品 | 97操操| 欧美a在线免费观看 | 欧美激情奇米色 | 九九免费在线观看 | 日韩免费看视频 | 日本精品视频免费观看 | 狠狠干五月天 | 日韩在线大片 | 久草视频中文在线 | 2020天天干夜夜爽 | 91麻豆视频网站 | 999久久 | 亚洲国产天堂av | 免费情缘 | 久久视频免费观看 | 五月天色中色 | 97在线观看 | 五月婷婷激情综合网 | 中文字幕在线观看一区二区三区 | 中文字幕中文字幕在线中文字幕三区 | 久草在线资源免费 | 粉嫩av一区二区三区四区五区 | 小草av在线播放 | 99热日本| 天天曰天天 | 婷婷久久久 | 男女视频久久久 | 伊人首页 | 三级黄色片子 | 91在线观看视频网站 | 天天操天天色天天射 | 久久精美视频 | 日韩免费高清在线 | 婷婷在线网| 99久久国产免费看 | 中午字幕在线观看 | 欧美夫妻性生活电影 | 日韩特级黄色片 | 三级黄色在线 | 精品国产一区二区三区噜噜噜 | 18性欧美xxxⅹ性满足 | 色婷婷骚婷婷 | 91精品区 | 狠狠干夜夜爱 | 国产成人一级电影 | 亚洲精品国产综合久久 | 日韩 在线观看 | 成人av在线资源 | 午夜av激情 | 美女视频免费一区二区 | 狠狠狠色狠狠色综合 | 亚a在线| 精品伦理一区二区三区 | 久草热视频 | 精品国产欧美一区二区三区不卡 | 在线观看日韩专区 | 亚洲精品九九 | 久久成人免费视频 | 国产精品久久久久久久久久久免费 | 丝袜美女视频网站 | 色婷婷五 | 天天干夜夜擦 | 国产黄色特级片 | 91久久久久久久一区二区 | 久草精品视频在线观看 | 国产精品国产亚洲精品看不卡15 | 免费网址在线播放 | 三上悠亚一区二区在线观看 | 久99久在线 | 欧美aaa大片 | 久久久午夜剧场 | 国产在线观看99 | 深爱五月激情五月 | 精品国产乱码久久久久久三级人 | 永久免费的av电影 | 91免费在线 | av网在线观看| 美女黄频在线观看 | 久草精品视频 | 久草热久草视频 | 成人性生交大片免费看中文网站 | 日韩免费一二三区 | 日韩精品免费在线观看视频 | 国产va精品免费观看 | 黄色av三级在线 | 日韩字幕在线观看 | 日韩三级在线 | 日韩高清在线一区二区 | av在线短片 | 97超碰在线人人 | 欧美与欧洲交xxxx免费观看 | 日韩r级电影在线观看 | 免费一级片观看 | 久草91视频| 免费视频区 | 在线国产视频一区 | 欧美孕妇视频 | 中文字幕成人 | 久久久久亚洲国产 | 日韩在线色视频 | 国产第一页精品 | 中文字幕之中文字幕 | 毛片网站在线观看 | 91激情视频在线观看 | 免费在线播放av电影 | 免费一级片在线 | 波多野结衣网址 | 福利一区在线 | av网址aaa | 成人黄色在线看 | 久久婷亚洲五月一区天天躁 | 992tv在线观看 | 99午夜| 亚洲精品乱码久久久久久写真 | 九九色在线| 超碰在线人人爱 | 婷婷色伊人 | 这里只有精品视频在线观看 | 国产精品丝袜在线 | 激情五月视频 | 欧美精品一区二区在线播放 | 国产一级做a爱片久久毛片a | 处女av在线 | 日韩欧美一区二区三区视频 | 四虎最新域名 | 亚洲干视频在线观看 | 亚洲成a人片在线www | 在线观看欧美成人 | 国产精品入口麻豆 | 国产精品97 | 九九九九精品 | 91亚洲视频在线观看 | 天天干天天操天天入 | 日日综合网 | 香蕉视频在线观看免费 | av黄色免费看 | 黄网在线免费观看 | 国产成人精品免费在线观看 | www.色午夜| 国产成人精品亚洲日本在线观看 | 日本中文字幕电影在线免费观看 | 91亚洲国产成人久久精品网站 | 国产色一区 | 国产亚洲精品成人av久久ww | 91视频在线网址 | 中文av网站 | 亚洲尺码电影av久久 | 亚洲成人网在线 | 最新中文字幕 | 亚洲爱av | 日韩免费中文 | 久久久久久久久综合 | 欧美专区国产专区 | 成人一级电影在线观看 | 国产一区二区精品久久91 | 久久久精品在线观看 | 国产经典av| 精品国偷自产国产一区 | 欧美 亚洲 另类 激情 另类 | 国产伦理久久精品久久久久_ | 婷婷深爱五月 | 国产淫片| 亚洲欧洲精品一区二区精品久久久 | 深夜视频久久 | 国产成人在线观看 | 日韩欧美精品在线视频 | 国产精品美女久久久久久2018 | 深爱激情五月综合 | 99热在线国产精品 | 亚洲精品欧美视频 | 中日韩欧美精彩视频 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲爱av | 午夜视频在线瓜伦 | 久久久久亚洲精品男人的天堂 | 色插综合| 国产 一区二区三区 在线 | 国产日韩精品在线观看 | 黄色aaaaa| 九九免费在线观看视频 | 午夜久久| 日韩中文在线字幕 | 麻豆成人网 | 国产精品久久久久永久免费观看 | 一区二区三区日韩精品 | 国产精品资源在线观看 | 国产免费xvideos视频入口 | 天堂入口网站 | 国产96在线观看 | 黄色av电影免费观看 | 五月天激情视频在线观看 | 久久高清国产视频 | 黄色av大片 | zzijzzij亚洲成熟少妇 | 亚洲综合视频在线观看 | 免费国产一区二区视频 | 成人9ⅰ免费影视网站 | 国产一二区免费视频 | 97视频人人 | av电影中文字幕在线观看 | 亚洲一区二区三区miaa149 | 欧美 日韩 国产 成人 在线 | 免费观看一区二区三区视频 | 久久激情片 | 亚洲欧美久久 | 2024国产精品视频 | 亚洲精品欧洲精品 | 国内外成人在线 | 麻豆系列在线观看 | 日女人免费视频 | 国产一区二区在线视频观看 | 91黄色视屏| 综合色婷婷 | a在线免费观看视频 | 国产又粗又猛又爽又黄的视频免费 | 安徽妇搡bbbb搡bbbb | 99精品美女| 欧洲成人免费 | 亚洲资源| 国产麻豆视频免费观看 | 久久免费高清 | 四虎成人网 | www免费看片com | 综合网天天 | 在线性视频日韩欧美 | 伊人久久在线观看 | 天天射天天色天天干 | 国产成人av| 美女啪啪图片 | 久久伊人91| 国产视频资源 | 一级欧美日韩 | 亚洲码国产日韩欧美高潮在线播放 | 夜夜操天天 | 91看片在线观看 | 国产一区在线免费观看 | 天堂av官网 | 一区二区三区高清在线 | 免费亚洲视频在线观看 | 亚洲综合欧美激情 | 国产亚洲精品久久久久久移动网络 | 探花视频免费在线观看 | 亚洲一区久久 | 国产原创91 | 日韩av片无码一区二区不卡电影 | 韩国精品在线 | www.色综合.com| 国产色拍| 国产中文字幕网 | 亚洲国产精品久久久 | 天天干天天操 | 成人午夜在线观看 | 色.com| 九九九热精品免费视频观看 | 欧美色就是色 | 人人玩人人添人人澡97 | 国产成人一区二区啪在线观看 | 99精品国产高清在线观看 | 国产一区成人在线 | 操操碰| 欧美另类色图 | 久久久免费精品国产一区二区 | 伊人国产在线观看 | 欧美孕妇与黑人孕交 | 人人擦| 国产黄色精品在线 | 国产一级片免费观看 | 国产在线视频资源 | 午夜视频99| 国语精品免费视频 | av视屏在线 | 天天射天天操天天色 | 日韩中文字幕在线不卡 | 国产又黄又爽无遮挡 | 国产视频欧美视频 | 中文字幕在线免费观看 | 亚洲日本va午夜在线电影 | aaa日本高清在线播放免费观看 | 欧美成人猛片 | 亚洲另类人人澡 | 免费观看的黄色片 | 亚洲人在线视频 | 在线小视频你懂的 | 国产精品一区一区三区 | 日韩三级在线 | 成年人免费看片 | 久久9视频 | 精品少妇一区二区三区在线 | 欧美日韩视频在线播放 | 亚洲国产成人在线观看 | 国产91粉嫩白浆在线观看 | 亚洲精品黄色在线观看 | 久久精品国产一区 | 91大神dom调教在线观看 | 69亚洲视频 | 日韩黄色在线 | 91麻豆福利| 人人爽久久久噜噜噜电影 | 亚洲爱视频 | 91| av久久在线 | 久久久久网站 | 国产在线精品一区 | 午夜电影久久久 | 国产亚洲免费观看 | 亚洲综合黄色 | 九九热99视频 | 日韩大片免费在线观看 | 成人三级黄色 | 最新av在线播放 | 久久理论片 | 久久avav| 97免费中文视频在线观看 | 日韩最新av | 91精品第一页 | 天天射网 | 久久福利国产 | 国产精品自产拍在线观看蜜 | 国产精品免费成人 | 亚洲美女视频在线观看 | 国产白浆在线观看 | av中文字幕第一页 | 日日夜夜精品免费观看 | 久久中文网 | 国产成人精品久久 | 免费在线国产精品 | 国产麻豆剧果冻传媒视频播放量 | 国色综合| 亚洲97在线 | 天天干人人干 | 少妇搡bbbb搡bbb搡aa | 日韩av片免费在线观看 | 免费色网 | www日韩精品 | 国产 一区二区三区 在线 | 久久久香蕉视频 | 成人午夜在线电影 | 色综合久久精品 | 中文字幕在线观看2018 | japanesexxxhd奶水 91在线精品一区二区 | 91久久黄色| 婷婷激情网站 | 亚洲另类在线视频 | 伊人久久影视 | 黄色aaa级片 | 日韩视| 欧美日韩精品久久久 | 国产精品第二页 | 九九免费在线观看视频 | 亚洲欧美精品一区二区 | 国产日韩欧美在线观看 | 精品国产一区二区三区四区在线观看 | 成人综合婷婷国产精品久久免费 | 午夜精品久久一牛影视 | 人人看人人做人人澡 | 视频在线观看一区 | 99热国产精品 | 免费高清在线视频一区· | 欧美一区二区三区免费观看 | 97成人啪啪网 | 日韩电影在线一区 | 五月天久久激情 | 久久久婷 | 日韩高清一二区 | 夜夜夜| 精品久久国产精品 | 亚洲精品午夜久久久久久久久久久 | 一级黄色视屏 | www.神马久久 | 天天草av| 人人射人人射 | 色视频在线看 | 免费在线观看一区二区三区 | 午夜黄网| www.香蕉视频 | 亚洲日韩中文字幕 | 天天玩天天操天天射 | 欧美日韩在线视频观看 | 综合国产视频 | 天天人人 | 天天操福利视频 | 99精品欧美一区二区三区黑人哦 | 国产精品乱看 | 五月激情姐姐 | 欧美激情综合五月色丁香小说 | 国产精品国内免费一区二区三区 | 成人动漫视频在线 | 国产最新在线 | 很黄很黄的网站免费的 | 香蕉在线视频观看 | 射综合网| 成人免费观看av | 久久综合操 | 黄色小说在线免费观看 | 久久99免费 | 日韩在线小视频 | 激情久久久久 | 天天伊人狠狠 | 亚洲精品777| 在线免费观看视频一区二区三区 | 网址你懂的在线观看 | 在线视频 精品 | 久久久色 | av大全免费在线观看 | 日韩电影在线观看一区二区 | av中文在线播放 | 欧美激情操 | 在线免费观看亚洲视频 | 九色视频网站 | 99精品久久久久久久久久综合 | 日日爽视频 | 福利视频第一页 | 超碰大片 | 人人澡人人爱 | 中文字幕一区二 | 九色在线视频 | 99视频在线精品国自产拍免费观看 | 久久精品一区二区三区中文字幕 | 天堂在线视频免费观看 | 国产探花视频在线播放 | 国产91学生粉嫩喷水 | 五月天激情视频 | 三级av免费观看 | 欧美男女爱爱视频 | 久久美女高清视频 | 国产麻豆精品久久 | 国产综合香蕉五月婷在线 | 久久超碰99 | 夜夜躁日日躁狠狠躁 | 久久久久久久久爱 | 99热官网 | 亚洲经典视频 | 夜夜夜夜操 | 亚洲精品久久久久久中文传媒 | 国产精品综合久久 | 99精品区| a午夜电影 | 日日日爽爽爽 | 黄色片免费电影 | 日韩视频1区 | 一区二区三区精品久久久 | 国产大片黄色 | 国外av在线 | 欧美在线99| 91精选在线观看 | 韩日精品在线观看 | 91在线九色 | 日韩电影在线一区二区 | 一区在线电影 | 久草网视频 | 国产色区 | 精品亚洲网 | 久草成人在线 | a色视频 | 五月婷婷导航 | 精品人人人人 | 国偷自产视频一区二区久 | 少妇bbbb| 丁香六月婷 | 亚洲五月婷 | 亚洲综合视频在线 | 黄色中文字幕 | 成人影视片 | 九九热只有这里有精品 | 国产精品扒开做爽爽的视频 | 蜜臀av性久久久久av蜜臀妖精 | 波多野结衣视频一区二区三区 | 91大神一区二区三区 | 在线观看黄| 久久伊人国产精品 | 狠狠干夜夜 | 亚洲国产美女久久久久 | 日韩超碰在线 | 美女一级毛片视频 | 在线观看国产www | 欧美久久久久久久久久久久久 | 国产精品乱码一区二区视频 | 久草综合视频 | 黄视频网站大全 | 探花视频网站 | 久草视频免费在线观看 | 亚洲国产精品视频在线观看 | 涩五月婷婷 | 久久午夜国产精品 | 亚洲在线国产 | 久久久久久久久久久影视 | 久久国产精品小视频 | 日韩在线 一区二区 | 中文免费在线观看 | 一本到视频在线观看 | 狠狠躁18三区二区一区ai明星 | 久草综合视频 | 免费在线观看日韩 | 国产录像在线观看 | 日本三级不卡 | 91精品久久香蕉国产线看观看 | 欧美久久久久久久久中文字幕 | 国产91精品在线播放 | 国产精品成人自产拍在线观看 | 日韩中文字幕亚洲一区二区va在线 | 日本韩国中文字幕 | 国内久久视频 | 日韩精品久久久 | 久久艹在线观看 | 在线亚州 | 93久久精品日日躁夜夜躁欧美 | 中文字幕亚洲欧美 | 欧美三级免费 | 日韩毛片一区 | 欧美午夜精品久久久久久孕妇 | 波多野结衣资源 | 午夜91视频 | 久久国产免费视频 | 午夜成人免费电影 | 久久与婷婷 | 九九热1| 久久免费视频8 | 久久精品国产亚洲a | 亚洲一级电影在线观看 | 91福利小视频 | 亚洲aⅴ乱码精品成人区 | 欧美精品在线观看 | 久久久久久综合网天天 | 中文字幕av日韩 | 美女av免费看 | 一本之道乱码区 | 一区二区三区韩国免费中文网站 | 一区二区三区日韩在线观看 | 黄色软件网站在线观看 | 亚洲婷婷免费 | 亚洲免费在线观看视频 | 成人三级视频 | 国产精品欧美一区二区三区不卡 | 精品国产aⅴ麻豆 | 激情久久伊人 | 91激情视频在线播放 | 99国产精品一区二区 | 国产视频 亚洲精品 | 中文字幕视频网 | 狠狠干网站| 麻豆免费在线播放 | 天堂视频一区 | 精品视频www | 欧美日韩久久一区 | 三级黄色免费 | 日韩成人欧美 | 成人四虎 | 四虎影视欧美 | 午夜电影av | 亚洲精品在线视频观看 | 久久婷婷国产色一区二区三区 | 国产精品对白一区二区三区 | 超碰在线1| 亚洲 欧洲 国产 精品 | 成人午夜片av在线看 | 操操综合 | 亚洲国产精品99久久久久久久久 | 欧美analxxxx| 欧美午夜a | 激情视频网页 | 最新色视频 | 久久久精品福利视频 | 亚洲婷婷免费 | 欧美少妇xxxxxx | 黄色大全免费观看 | 国产婷婷精品 | 亚洲久草视频 | 久久综合中文色婷婷 | 国产精品高清在线观看 | 欧美色图一区 | 亚洲免费av一区二区 | 国产专区日韩专区 | 久久久精品国产免费观看一区二区 | 久草在线视频免赞 | 国产视频精品免费 | 免费观看国产视频 | 日韩成人不卡 | 日韩欧在线 | 夜夜躁天天躁很躁波 | 国产伦理一区二区 | 精品黄色片| 久久久国产精品亚洲一区 | 在线观看涩涩 | 久久国产精品成人免费浪潮 | 天天操天天操天天操天天操天天操天天操 | 免费av观看 | 日韩丝袜| 久久国产精品99久久久久久进口 | 亚洲黄色片一级 | 天堂网av在线 | 狠狠地操 | 日韩欧美在线观看一区二区三区 | 日本不卡一区二区三区在线观看 | 精品国产成人在线影院 | 97在线观看免费观看 | 精品国偷自产在线 | 九九久久国产精品 | 国产黄色在线观看 | 激情喷水| 天天爽天天碰狠狠添 | 国模视频一区二区三区 | 久久久麻豆精品一区二区 | 麻豆首页 | 国产福利精品视频 | 国产精品久久一卡二卡 | 国产精品中文字幕在线播放 | 色噜噜狠狠色综合中国 | 日韩影视大全 | 免费91在线观看 |