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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flutter刷新页面_用Flutter实现58App的首页

發(fā)布時間:2023/12/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flutter刷新页面_用Flutter实现58App的首页 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

Flutter作為全新跨平臺應(yīng)用框架,在頁面渲染和MD開發(fā)上優(yōu)勢明顯,可謂是業(yè)界一枝獨秀。正好最近有這樣的一個機會學(xué)習(xí)Flutter開發(fā),我們便嘗試用它開發(fā)一個MD風(fēng)格的較復(fù)雜頁面,來比較跟原生應(yīng)用開發(fā)的優(yōu)勢。也是想通過對新框架的學(xué)習(xí)探索,找到適合自身應(yīng)用的框架。

頁面展示

首頁是整個應(yīng)用里邊交互最為復(fù)雜的一個頁面了,它集合了各種滑動方式,包括:縱向滑動、橫向滑動、嵌套滑動;同時,也集合了各種動效,包括:下拉刷新、上拉加載、頭圖視差、二級吸頂、回到頂部、橫向Banner和縱向News輪播等。

開發(fā)歷程

  • 搭建了開發(fā)環(huán)境,新建flutter module并學(xué)習(xí)dart語法

  • 調(diào)研用Flutter實現(xiàn)CoordinatorLayout的方案

  • 實現(xiàn)了首頁主框架的demo搭建,目前同樣遇到了滑動沖突的問題,在調(diào)研解決方案

  • 解決了滑動沖突的問題,并集成了下拉刷新能力

  • 完成了各區(qū)塊和feed流的靜態(tài)UI內(nèi)容,目前剩余feed流加載更多和負(fù)二樓動效

  • 實現(xiàn)首頁feed流的加載更多功能

技術(shù)難點

兩級吸頂

在Flutter中實現(xiàn)吸頂功能比較容易,使用SliverPersistentHeader控件或者間接使用該控件都可以滿足吸頂?shù)墓δ?#xff1b;更重要的是,它支持滑動過程中任意組件的吸頂,即多級吸頂功能。

既然多級吸頂都支持,那么兩級吸頂就很輕松了,首頁頭部和feed流tab的兩級吸頂是這樣實現(xiàn)的:第一級,使用SliverAppBar(它內(nèi)部就是一個SliverPersistentHeader控件),不僅可以吸頂,還帶有折疊屬性,折疊屬性能更好的滿足頭部滑動時的動效處理;第二級,使用SliverPersistentHeader并自定義它的delegate,通過pinned屬性靈活選擇當(dāng)前模塊吸頂與否,這樣可以實現(xiàn)任意組件的吸頂功能。

SliverAppBar(
pinned: true,
...,
bottom: PreferredSize(
child: Header(...),
preferredSize: Size(screenWidth, 15),
),
),
SliverPersistentHeader(
pinned: false,
delegate: _SliverColumnDelegate(
Column(...),
)
),
SliverPersistentHeader(
pinned: true,
delegate: _SliverTabBarDelegate(
TabBar(...)
),
),

pinned的原理很簡單,將它設(shè)置為true內(nèi)容到達(dá)頂部后不會再跟隨外層的ScrollView繼續(xù)滾動;反之,內(nèi)容則會滾動出容器外。

而native端實現(xiàn)這個二級吸頂卻很費力,通常你可能需要事先隱藏一個跟吸頂內(nèi)容一樣的駐頂view在那里,然后在頁面滾動時計算吸頂內(nèi)容是否已經(jīng)劃至頂部,維護(hù)駐頂view的可見屬性達(dá)到吸頂效果。

上面粗獷的兩級吸頂完成了,但想要充分滿足首頁的折疊效果和準(zhǔn)確的二級吸頂需求,還得深挖一下AppBar內(nèi)部的折疊計算方法。

SliverAppBar折疊計算

SliverAppBar通常作為頁面頭部使用,是會隨內(nèi)容一起滑動的一個組件;它的構(gòu)造方法中有四個Widget類型的參數(shù)。分析Widget類型的參數(shù),是因為我們需要一個容器來滿足自定義首頁頭部——它既能實現(xiàn)吸頂,又可以接入自定義組件。

  • leading // 左側(cè)按鈕

  • title // 標(biāo)題

  • flexibleSpace // 可以展開區(qū)域

  • bottom // 底部內(nèi)容區(qū)域

回顧一下首頁的折疊展示效果,首先排除了leading,因為它的位置大小只是一個按鈕的位置,顯示比較局限;然后title受leading占位影響寬度有限制也無法滿足需要;之后,就剩下兩個參數(shù)可選了,從命名上看,感覺flexibleSpace更符合折疊效果的實現(xiàn)思路,然后一直在嘗試使用其實現(xiàn)頭部折疊的需求,但開發(fā)過程中發(fā)現(xiàn)折疊后的高度是無法達(dá)到預(yù)期的,最大高度也滿足不了設(shè)計圖給的高度。本來想直接排除法使用起bottom的,但是想到一遇到問題就繞過還是有點SUI。那么想知道為什么flexibleSpace會有高度限制,必然得看一下SliverAppBar的實現(xiàn)源碼了。

class _SliverAppBarState extends State<SliverAppBar> with TickerProviderStateMixin {
...
@override
Widget build(BuildContext context) {
assert(!widget.primary || debugCheckHasMediaQuery(context));
final double topPadding = widget.primary ? MediaQuery.of(context).padding.top : 0.0;
final double collapsedHeight = (widget.pinned && widget.floating && widget.bottom != null)
? widget.bottom.preferredSize.height + topPadding : null;

return MediaQuery.removePadding(
context: context,
removeBottom: true,
child: SliverPersistentHeader(
floating: widget.floating,
pinned: widget.pinned,
delegate: _SliverAppBarDelegate(
...
collapsedHeight: collapsedHeight,
topPadding: topPadding,
),
),
);
}
}

final double collapsedHeight = (widget.pinned && widget.floating && widget.bottom != null)
? widget.bottom.preferredSize.height + topPadding : null;

變量collapsedHeight代表了折疊后頭部的高度,從它的計算表達(dá)式可看出:當(dāng)widget.bottom == null的時候,collapsedHeight的值為null。換言之,如果不使用bottom,那么折疊高度是沒有的。如果沒有折疊后的高度會發(fā)生什么?這個需要進(jìn)一步驗證。

const double kToolbarHeight = 56.0;

class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
...
final double _bottomHeight = bottom?.preferredSize?.height ?? 0.0;
@override
double get minExtent => collapsedHeight ?? (topPadding + kToolbarHeight + _bottomHeight);
}

從上面的源碼看,如果collapsedHeight == null,那么折疊后的頭部高度就是topPadding + kToolbarHeight了。topPadding是系統(tǒng)狀態(tài)欄的高度,kToolbarHeight是個自定義常量。不難看出,bottom為空時折疊頭部的高度就會是一個固定高度。那么反過來,想要自定義高度,就必須得使用bottom,折疊后的頭部高度完全取決于bottom的高度(一般,系統(tǒng)狀態(tài)欄的高度是確定的)。

你看,不是我們用排除法用了最后一個參數(shù)bottom,而是我們分析后知道不用它真得不行。

實現(xiàn)兩級吸頂并明確了頭部參數(shù)設(shè)置后,其實整個頁面框架就基本擬定了。接下來,我們細(xì)化一下,看看頭部控件具體怎么實現(xiàn)。

自定義頭部

首頁頭部組件包括以下內(nèi)容:

  • 搜索欄和城市名吸頂

  • 頭圖視差

  • 基于之前首頁native的開發(fā)經(jīng)驗,這些效果的實現(xiàn)其實可以由一個變量驅(qū)動完成,即首頁頭部的縱向滑動偏移值。這個偏移值參照它的初始位置,分為上偏移和下偏移。上偏移驅(qū)動處理搜索欄和城市名的動效,下偏移則驅(qū)動處理頭圖視差的動效。

    通過自定義Header組件來處理搜索欄和城市名吸頂?shù)膭赢?#xff0c;其中主要是借助外部傳入的上偏移值驅(qū)動整個動畫的完成。

    import 'package:flutter/material.dart';
    import 'package:wuba_flutter_lib/home/search_bar.dart';

    const double SEARCH_MARGIN_LEFT = 15.0; // 搜索欄left居左位置

    typedef OnOffsetChangeListener = Function(double percent);

    class Header extends StatefulWidget {

    Header({
    Key key,
    this.offset: 0.0,// 外部驅(qū)動的偏移屬性
    this.cityName,
    this.onOffsetChangeListener,
    }) : super(key: key);

    final double offset;
    final String cityName;
    final OnOffsetChangeListener onOffsetChangeListener;

    double searchLeft = SEARCH_MARGIN_LEFT;
    double searchLeftEnd = SEARCH_MARGIN_LEFT;

    @override
    State<StatefulWidget> createState() => HeaderState();
    }

    class HeaderState extends State<Header> with TickerProviderStateMixin {

    AnimationController searchBgColorAnimController;
    Animation<Color> searchBgColor;

    // 偏移值驅(qū)動動畫屬性
    drive(offset) {
    // 過渡比例
    double percent = offset / 80.0 > 1.0 ? 1.0 : offset / 80.0;
    // 偏移比例回調(diào)
    if (widget.onOffsetChangeListener != null) {
    widget.onOffsetChangeListener(percent);
    }
    // 搜索欄居左吸頂后的位置
    widget.searchLeftEnd = SEARCH_MARGIN_LEFT + (widget.cityName ?? '').length * 22 + CITY_MARGIN_RIGHT;
    // 搜索欄居左位置
    widget.searchLeft = (SEARCH_MARGIN_LEFT + (widget.searchLeftEnd - SEARCH_MARGIN_LEFT) * percent);
    // 背景顏色控制
    searchBgColorAnimController.value = percent;
    }

    @override
    void didUpdateWidget(Header oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (widget.offset != oldWidget.offset) {
    drive(widget.offset);
    }
    }

    @override
    void initState() {
    super.initState();
    searchBgColorAnimController = new AnimationController(vsync: this);
    searchBgColor = ColorTween(
    begin: Color(0xffffffff),
    end: Color(0xffDADDE1),
    ).animate(
    CurvedAnimation(
    parent: searchBgColorAnimController,
    curve: Interval(0.0, 1.0, curve: Curves.linear),
    ),
    );
    }

    @override
    Widget build(BuildContext context) {
    return Stack(
    overflow: Overflow.visible,
    children: <Widget>[
    // 搜索欄
    SearchBar(
    left: widget.searchLeft,
    bgColor: searchBgColor.value,
    ...
    ),
    ...
    ],
    );
    }

    }

    頭圖視差 則使用了Container的矩陣變換屬性,主要是對y軸進(jìn)行位移,這個位移加以視差系數(shù)便能產(chǎn)生跟Header組件的視差效果。

    // 矩陣
    Matrix4 matrix = Matrix4.translationValues(0.0, _offset/*驅(qū)動y軸偏移*/, 0.0);

    // 容器
    Container(
    transform: matrix,// 矩陣變換
    width: screenWidth,
    height: screenWidth,
    child: Image.asset("assets/images/home_bg.jpg", fit: BoxFit.fill)
    ),

    組件化思考

    Flutter中分無狀態(tài)組件StatelessWidget和有狀態(tài)組件StatefulWidget,React中分無狀態(tài)組件Stateless Component和高級組件Stateful Component,它們在組件化方面的設(shè)計思路是一樣的。

    組件化?越來越趨向于按狀態(tài)劃分設(shè)計,因為這樣更貼合實際場景并滿足需要。比如首頁的區(qū)塊列表場景中,有一些區(qū)塊一旦設(shè)置后不會再發(fā)生狀態(tài)改變,可理解為無狀態(tài)的;而另有一些區(qū)塊初始化后還需要做狀態(tài)變更,它有了狀態(tài),可視為有狀態(tài)的。無狀態(tài)的區(qū)塊和有狀態(tài)的區(qū)塊進(jìn)行組件封裝,便成了無狀態(tài)組件和有狀態(tài)組件。

    首頁區(qū)塊中,無狀態(tài)的組件主要包括:

    • BigGroup,大類頁

    • SmallGroup,小類頁

    • LocalNews,同城頭條

    • LocalTribe,同城部落

    • BannerAd,廣告Banner

    有狀態(tài)的組件目前只有一個:

    • Notification,通知提醒;沒有下發(fā)通知鏈接或者請求后臺后發(fā)現(xiàn)沒有通知內(nèi)容時需要隱藏

    如此,按照首頁區(qū)塊的場景,我們便基于無狀態(tài)組件設(shè)計封裝了首頁無狀態(tài)組件類HomeStatelessWidget,而基于有狀態(tài)組件實現(xiàn)了首頁有狀態(tài)組件HomeStatefulWidget。

    HomeStatelessWidget類封裝,內(nèi)部設(shè)有一個容器,然后需要指定它的大小,僅此而已。

    abstract class HomeStatelessWidget<T> extends StatelessWidget implements PreferredSizeWidget {

    HomeStatelessWidget(this.context, this.key, this.value);

    final BuildContext context;
    final String key;
    final T value;

    Widget get child;
    double get height;

    @override
    Size get preferredSize {// 指定容器大小
    return Size(MediaQuery.of(context).size.width, height);
    }

    @override
    Widget build(BuildContext context) {
    return Container(// 容器
    width: preferredSize.width,
    height: preferredSize.height,
    color: Colors.white,
    alignment: Alignment.centerLeft,
    child: child,
    );
    }
    }

    HomeStatefulWidget類封裝,和HomeStatelessWidget類近似,只是多了一個狀態(tài)類HomeStatefulWidgetState,它用于管理組件的各種狀態(tài)。

    abstract class HomeStatefulWidget<T> extends StatefulWidget implements PreferredSizeWidget {

    HomeSizeStatefulWidget(this.context, this.key, this.value);

    final BuildContext context;
    final String key;
    final T value;

    Widget get child;
    double get height;

    void initState(State state) {}

    @override
    Size get preferredSize {
    return Size(MediaQuery.of(context).size.width, height);
    }

    @override
    State<StatefulWidget> createState() => HomeStatefulWidgetState();
    }

    // 狀態(tài)類
    class HomeStatefulWidgetState extends State<HomeStatefulWidget> {
    @override
    void initState() {
    super.initState();
    widget.initState(this);
    }
    @override
    Widget build(BuildContext context) {
    return Container(
    width: widget.preferredSize.width,
    height: widget.preferredSize.height,
    color: Colors.white,
    alignment: Alignment.centerLeft,
    child: widget.child,
    );
    }
    }

    無狀態(tài)組件實現(xiàn)起來很容易,只需要給它一次性賦值就可以了,這里不做過多解釋。接下來,看看有狀態(tài)的組件是如何實現(xiàn)的!

    通知提醒組件因為需要改變可見性狀態(tài),所以要實現(xiàn)首頁有狀態(tài)的組件類HomeStatefulWidget才能滿足狀態(tài)的管理,如下是通知提醒組件的代碼實現(xiàn)。

    這一點跟native相比,優(yōu)勢還是很明顯的。因為native端在view的設(shè)計上沒有“狀態(tài)”這個概念,它對狀態(tài)的概念完全是模糊的。

    class Notification extends HomeStatefulWidget<String> {

    // 狀態(tài)字段,當(dāng)通知內(nèi)容為空時控制當(dāng)前組件是否可見
    bool isContentEmpty = true;

    Notification(BuildContext context, String key, String value) : super(context, key, value);

    @override
    void initState(State<StatefulWidget> state) {
    super.initState(state);
    // 如果url不為空,則請求通知接口數(shù)據(jù)
    if (!isUrlEmpty()) {
    HomeDataManager.getNotification(value).then((object) {
    // 獲取到通知數(shù)據(jù),改變組件的可見性狀態(tài)
    state.setState(() {
    isContentEmpty = object == null;
    });
    });
    }
    }

    @override
    Widget get child => isUrlEmpty() || isContentEmpty ? Container() : Center(child: Text(value));

    /// 如果url為空,或是通知接口返回的內(nèi)容為空,則隱藏自己;
    /// 否則,顯示自己。
    @override
    double get height => isUrlEmpty() || isContentEmpty ? 0 : 40;

    // 判斷傳入的url是否為空
    bool isUrlEmpty() => (value == null || '' == value);

    }

    滑動沖突

    Android中,只要兩個“輪子”有嵌套關(guān)系,那么勢必存在滑動沖突的問題。要解決嵌套滑動沖突,就只能允許一個輪子驅(qū)動,而另一個輪子被帶動;而不是兩個輪子同時驅(qū)動

    首頁中存在兩級沖突問題,也就是說有兩層嵌套關(guān)系。一,下拉刷新和首頁主體;二,首頁主體和feed流內(nèi)容。這相當(dāng)于有三個輪子存在相互嵌套的關(guān)聯(lián),如何解決三個輪子的滑動沖突問題,這里有三種思路:

  • 由一個輪子驅(qū)動,另外兩個輪子同步被帶動;

  • 由一個輪子驅(qū)動,另一個輪子被帶動,還有一個輪子卸載;

  • 由一個輪子先驅(qū)動,到達(dá)某個位置后轉(zhuǎn)換為另一個輪子驅(qū)動,然后剩下的兩個輪子跟1和2情況。

  • 三種思路其實都是將三個輪子的嵌套關(guān)系進(jìn)行了降維處理,本質(zhì)上都在解決兩個輪子的沖突問題;總之,核心思想是不能出現(xiàn)兩個輪子同時驅(qū)動。

    NestedScrollViewRefreshIndicator(// 下拉刷新
    child: ExtendedNestedScrollView(// 首頁主體
    keepOnlyOneInnerNestedScrollPositionActive: true,
    headerSliverBuilder: (c, f) {
    return <Widget>[
    SliverAppBar(), // 頭部搜索
    SliverPersistentHeader(),// 區(qū)塊列表
    SliverPersistentHeader(),// feed流TabBar
    ];
    },
    body: TabBarView(// feed流內(nèi)容
    children: [
    Container(
    child: ListView(),// 推薦
    ),
    Container(
    child: ListView(),// 家鄉(xiāng)
    ),
    Container(
    child: ListView(),// 部落?
    ),
    ],
    ),
    ),
    )

    首頁主體控件使用了NestedScrollView的擴展類ExtendedNestedScrollView,前者允許嵌套滾動,但是對子視圖的高度有要求——確定的高度。做過feed流的開發(fā)都知道,它的高度并不好計算,因為模板類型不同對應(yīng)各自的高度不等,加以本身又可以無限加載擴展,高度一直在變化計算起來難度很大。基于NestedScrollView的擴展類ExtendedNestedScrollView解決了這個痛點,在不依賴子視圖高度的情況下同樣能夠滿足嵌套滾動。

    解決滑動沖突問題,離不開它的這個重要屬性keepOnlyOneInnerNestedScrollPositionActive,直譯是僅保活一個內(nèi)部嵌套的滾動位置,意譯便是僅允許一個內(nèi)部嵌套的視圖滾動,即僅允許一個輪子驅(qū)動。

    if (widget.keepOnlyOneInnerNestedScrollPositionActive) {
    ///get notifications and compute active one in _innerController.nestedPositions
    body = NotificationListener<ScrollNotification>(
    onNotification: (ScrollNotification notification) {
    if (((notification is ScrollEndNotification) ||
    (notification is UserScrollNotification &&
    notification.direction == ScrollDirection.idle)) &&
    notification.metrics is PageMetrics &&
    notification.metrics.axis == Axis.horizontal) {
    _coordinator._innerController
    ._computeActivatedNestedPosition(notification);
    }
    return false;
    },
    child: body);
    }

    這里的條件判斷計算,其實已經(jīng)能看出來了,它是實現(xiàn)了上面思路3的做法。此時,首頁的兩級嵌套滾動沖突解決方案其實已經(jīng)浮出水面了,只剩下最后一個輪子的處理了,具體是使用情況1還是情況2呢?

    ScrollController _scrollController = ScrollController();

    _scrollListener() {
    setState(() {
    _offset = _scrollController.offset;
    });
    }

    @override
    void initState() {
    super.initState();
    _scrollController.addListener(_scrollListener);
    }

    NestedScrollViewRefreshIndicator(// 下拉刷新
    // _offset > 0.0 表示頭部上移動,這時候禁止notification事件處理
    notificationPredicate: (notification) => _offset == 0.0,
    child: ExtendedNestedScrollView(// 首頁主體
    controller: _scrollController,
    keepOnlyOneInnerNestedScrollPositionActive: true,
    ...
    ),
    )

    這個問題其實不是一個單選,具體在應(yīng)用場景中,最終兩者都有用到。下滑到達(dá)頂部,此時需要觸發(fā)下拉刷新操作,隨即下拉刷新模塊被帶動,那么就實現(xiàn)了思路1的做法;而其他位置的滑動,則不會觸發(fā)這個操作,所以可以理解為將其暫時卸載,那么就有了思路2的做法。整體首頁的實現(xiàn),其實是綜合應(yīng)用了這三種思路。

    下拉刷新

    • 下拉高度限制

    • 負(fù)二樓 // TODO

    默認(rèn)的下拉刷新組件在下拉時可以一直往下,沒有對滑動距離做限制,而首頁要求下拉至頭圖完整出現(xiàn)后不再滾動。這個特定的需求RefreshIndicator并不能滿足,需要改動一下這個組件才可以。

    class NestedScrollViewRefreshIndicator extends StatefulWidget {
    final OnOffsetCallback onOffset;// 下拉偏移量回調(diào)
    final double offsetLimit;// 下拉偏移的限制值
    const NestedScrollViewRefreshIndicator({
    this.onOffset,
    this.offsetLimit = 0.0,
    ...
    });
    }

    class NestedScrollViewRefreshIndicatorState
    extends State<NestedScrollViewRefreshIndicator>
    with TickerProviderStateMixin<NestedScrollViewRefreshIndicator> {

    AnimationController _positionController;
    AnimationController _scaleController;

    Animation<RelativeRect> _positionRect;
    Animation<RelativeRect> _positionRectDown;
    Animation<RelativeRect> _positionRectUp;

    Animatable _headerPositionTweenDown;
    Animatable _headerPositionTweenUp;

    double _headerOffset = 0.0;// 頭部偏移值

    @override
    void initState() {
    super.initState();
    _headerPositionTweenDown = RelativeRectTween(
    begin: RelativeRect.fromLTRB(0.0, 0.0, 0.0, 0.0),
    end: RelativeRect.fromLTRB(0.0, widget.offsetLimit, 0.0, 0.0)
    );

    _positionController = AnimationController(vsync: this);
    _scaleController = AnimationController(vsync: this);

    _positionRectDown = _positionController.drive(_headerPositionTweenDown);
    _positionRect = _mode != _RefreshIndicatorMode.done ? _positionRectDown : _positionRectUp;

    if (widget.onOffset != null) {
    _positionController.addListener(() {
    _headerOffset = _positionController.value;
    widget.onOffset(_headerOffset);
    double value = widget.offsetLimit * _headerOffset;
    _headerPositionTweenUp = RelativeRectTween(
    begin: RelativeRect.fromLTRB(0.0, value, 0.0, 0.0),
    end: RelativeRect.fromLTRB(0.0, 0, 0.0, 0.0)
    );
    _positionRectUp = _scaleController.drive(_headerPositionTweenUp);
    });
    _scaleController.addListener(() {
    double value = (1.0 - _scaleController.value) * _headerOffset;
    widget.onOffset(value);
    });
    }
    }

    setPositionRect(newMode) {
    setState(() {
    _positionRect = newMode != _RefreshIndicatorMode.done ? _positionRectDown : _positionRectUp;
    });
    }

    // _RefreshIndicatorMode.drag
    bool _handleScrollNotification(ScrollNotification notification) {
    ...
    setPositionRect(_RefreshIndicatorMode.drag);
    return false;
    }

    // _RefreshIndicatorMode.canceled || _RefreshIndicatorMode.done
    Future<void> _dismiss(_RefreshIndicatorMode newMode) async {
    ...
    setPositionRect(newMode);
    switch (newMode) {
    case _RefreshIndicatorMode.done:
    await _scaleController.animateTo(1.0, duration: _kIndicatorScaleDuration);
    break;
    case _RefreshIndicatorMode.canceled:
    await _positionController.animateTo(0.0, duration: _kIndicatorScaleDuration);
    break;
    default:
    assert(false);
    }
    }

    // _RefreshIndicatorMode.refresh
    void _show() {
    ...
    _positionController.animateTo(1.0 / _kDragSizeFactorLimit, duration: _kIndicatorSnapDuration).then<void>((void value) {
    setPositionRect(_RefreshIndicatorMode.refresh);
    });
    }

    @override
    Widget build(BuildContext context) {
    return Stack(
    children: <Widget>[
    // child, // 改動前
    PositionedTransition(// 改動后
    rect: _positionRect,
    child: child,
    ),
    ...
    ],
    );
    }
    }

    以上便是摘出的改動了下拉刷新控件的代碼邏輯,主要是通過位置動畫限定了首頁主體向下滾動的最大位移。同時,通過動畫偏移的計算,向外輸出了頭部偏移的值,以便于外部通過監(jiān)聽這個偏移值做更多的動效處理;比如:搜索框、天氣、城市、頭部、掃碼、背景圖等頭部元素的動畫處理。

    負(fù)二樓的效果實現(xiàn)其實并不復(fù)雜,能理解如何通過動畫原理改動下拉刷新控件從而實現(xiàn)個性化的動效,那么實現(xiàn)負(fù)二樓的效果就是個舉一反三的事情。

    加載更多

    加載更多的原理其實跟native的思路是一樣的——判斷列表滾動到最末位置觸發(fā)特定事件。之前native的做法就是判斷RecyclerView滑動到最后一項時向feed流最末位置插入一個特定的動畫模板,等加載結(jié)束后再把這個模板去掉,然后把請求到的內(nèi)容添加到視圖列表中去,這樣列表組件就擁有了一個加載更多的能力。

    ExtendedNestedScrollView的改動:

    double nestOffset(double value, _NestedScrollPosition target) {
    // 滑動到小于50的時候觸發(fā)加載更多事件
    if (target.extentAfter < 50) {
    _onLoadMore();
    }
    }

    總結(jié)

    這樣,一個由Flutter開發(fā)的首頁就已經(jīng)基本落地了。整個開發(fā)過程總結(jié)下來,有這樣幾點可以分享:

  • 用Flutter和Android開發(fā)首頁,都依賴了MD組件,它們對此支持得都比較完善;由于Dart語言的特性,Flutter在使用這些組件時更容易擴展、靈活性更強。

  • Flutter狀態(tài)化的組件管理機制,顯得比Android更切合場景,在區(qū)塊列表的設(shè)計上得心應(yīng)手,這點也是眾多前端框架的亮點。

  • Flutter的動畫設(shè)計api很豐富,能充分滿足各種UI動效,讓頁面開發(fā)更輕松且不復(fù)雜。

  • Flutter表達(dá)性更強,又加以跨平臺的解決方案,減少了代碼量并大大提升了開發(fā)效率,為應(yīng)用開發(fā)起到了開源節(jié)流的作用。

  • Flutter作為新秀,在Java老大哥已經(jīng)爛熟于MVP等模式設(shè)計后,Flutter在此方面還需要積累;也可能Flutter本身并不需要這樣的積累,它等待的是比Java中更好的開發(fā)模式。

  • 參考文檔

    Flutter擴展NestedScrollView

    總結(jié)

    以上是生活随笔為你收集整理的flutter刷新页面_用Flutter实现58App的首页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    中文字幕人成人 | av免费看av| 五月综合在线观看 | 色五婷婷 | 久久人人爽人人爽人人片 | 日韩欧美电影在线 | 欧美日韩另类视频 | 日韩三级在线观看 | 久久久久美女 | 免费看色的网站 | 成人av在线一区二区 | 午夜视频99 | 依人成人综合网 | 丝袜少妇在线 | 国产成人久 | 国产免费高清 | 亚洲综合在线发布 | 嫩草伊人久久精品少妇av | 99久久电影 | 成人理论在线观看 | 中文字幕在线观看你懂的 | 婷婷久操 | 亚州精品在线视频 | 国产精品99久久久久人中文网介绍 | 日韩字幕| 国产一级视频免费看 | 婷婷精品 | 精品久久久久免费极品大片 | 亚洲欧美视频在线观看 | 日韩剧情 | 日日干夜夜草 | 超级碰碰碰免费视频 | 夜夜天天干 | 日本一区二区三区视频在线播放 | 免费在线观看中文字幕 | 日日操天天操夜夜操 | 在线欧美中文字幕 | 国产123av| 国产精品久久精品国产 | 在线成人免费电影 | 日韩丝袜在线 | 成片免费观看视频 | 国产精品久久久久久久久久久久午夜 | 国产精国产精品 | 国产精品99久久久久久久久 | 国产aa免费视频 | 99久久精品日本一区二区免费 | 人人要人人澡人人爽人人dvd | 久久精品久久久久电影 | 五月婷综合 | 久久好看 | 日韩一区二区三区免费电影 | 亚洲精品国偷拍自产在线观看蜜桃 | www久久国产| 一区二区中文字幕在线观看 | 亚洲精品综合一二三区在线观看 | 日韩中文字幕免费看 | 香蕉在线播放 | 久久99亚洲精品久久久久 | 午夜av免费在线观看 | 欧美午夜精品久久久久久孕妇 | 91看片看淫黄大片 | 日日草av | 国产一区二区精品久久 | 五月婷婷操 | 国产片免费在线观看视频 | 成人黄色电影视频 | 麻花天美星空视频 | 在线欧美日韩 | 国产高清在线不卡 | 久久国产精品小视频 | 亚洲精品中文字幕视频 | 在线看91| 18性欧美xxxⅹ性满足 | 亚洲精品视频在线免费播放 | 国产中文在线播放 | 国产精品亚洲片在线播放 | 国产精品一区二区久久精品爱微奶 | 日本黄色免费网站 | 日韩av在线影视 | 97超碰国产精品 | 亚洲国产成人精品在线观看 | 91久久久久久久一区二区 | 精品国产免费人成在线观看 | 久久久穴| 国产精品久久久久aaaa | 麻豆91在线观看 | 亚洲日本精品视频 | 日韩精品视| 亚洲精品久久久久中文字幕二区 | 超碰在线人人草 | 视频在线在亚洲 | 久热免费在线 | 免费男女羞羞的视频网站中文字幕 | 国产综合在线视频 | 97**国产露脸精品国产 | 国产精品 中文字幕 亚洲 欧美 | 五月婷婷久久综合 | 日韩在线观看 | 在线欧美最极品的av | 亚洲伊人网在线观看 | 麻豆影视网站 | 在线性视频日韩欧美 | 午夜精品久久久久久久久久久 | 国产精品免费观看在线 | 精品国产不卡 | 免费人做人爱www的视 | 国产午夜小视频 | 九精品 | 久久久久亚洲精品国产 | 欧美精品国产综合久久 | 午夜精品一二三区 | 狠狠色丁香久久婷婷综合五月 | 超碰97国产在线 | 欧美在线视频不卡 | 久久久av免费 | 国产精品第2页 | 97综合网 | 国产精品 日韩 | 国产精品久久久久久久99 | 久久有精品 | 麻豆久久久 | 激情小说网站亚洲综合网 | 天天射天天射天天射 | 黄色在线免费观看网站 | 五月花激情 | 成人宗合网 | 天天干天天干天天射 | 免费av在线播放 | av电影免费在线看 | av视屏在线播放 | av中文天堂 | 久久久91精品国产一区二区精品 | 91视频免费国产 | 国产精品原创视频 | 日日夜夜精品视频天天综合网 | 欧美成人aa | 深爱开心激情 | 在线成人短视频 | 国产一级二级在线观看 | 久久撸在线视频 | 狠狠狠狠狠狠狠狠 | 国产欧美综合视频 | 一区二区三区国 | 激情婷婷色 | www亚洲一区 | 免费久久久久久久 | 韩国av一区| 国产黄色av| 国产精品久久久久久久久久尿 | 久久久久久久久久久免费av | 久久不卡视频 | 久草在线这里只有精品 | 国产精品久久99综合免费观看尤物 | 在线播放日韩av | 欧美日韩精品在线免费观看 | 欧美一二三区在线观看 | 日韩精品欧美专区 | 在线观看你懂的网址 | 日韩高清成人在线 | 欧美乱大交 | 超碰人人超碰 | 在线91精品 | 不卡的av在线 | 精品国产人成亚洲区 | 水蜜桃亚洲一二三四在线 | 亚洲老妇xxxxxx| 亚洲国产中文在线观看 | 五月综合激情网 | 黄a在线观看 | 在线观看91久久久久久 | 日韩,精品电影 | 91亚洲国产 | 日韩欧美精品一区二区 | 国产成人精品女人久久久 | 日日夜夜天天操 | 成人久久免费视频 | 日韩激情视频在线 | 337p西西人体大胆瓣开下部 | 国产区精品 | 国产高清专区 | 亚洲精品国产第一综合99久久 | 福利久久 | 久草热视频 | 国产手机在线播放 | 亚洲最大av网站 | 国产中文欧美日韩在线 | 中文字幕在线播放一区 | 久热免费 | 国产精品嫩草影院123 | 中文在线字幕免 | www.久久精品视频 | 高清有码中文字幕 | 四虎小视频 | 99久久99久久精品国产片 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产精品毛片一区 | 人人爱人人舔 | 欧美激情精品久久久久久变态 | 99中文视频在线 | 91在线超碰| 国产成人三级在线播放 | 久久久久中文字幕 | 中文字幕一区二区三区久久 | 91精品国自产拍天天拍 | 丰满少妇在线观看资源站 | 久久九九久久九九 | 808电影免费观看三年 | 免费手机黄色网址 | 啪啪免费视频网站 | 永久免费观看视频 | 欧美成人精品在线 | 国产精品一区二区久久精品 | 91视频在线观看下载 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 91麻豆精品国产自产 | 日日爱夜夜爱 | 免费在线观看午夜视频 | a级片久久久 | 久久字幕精品一区 | 国产一区久久久 | 人人精品久久 | 香蕉视频91| 天天夜操| 九色视频网| 久久午夜电影院 | 日韩精品免费在线观看视频 | 97色se| 黄色毛片网站在线观看 | 国产精品久久久久久久99 | 五月天婷亚洲天综合网精品偷 | 91九色蝌蚪国产 | 在线成人国产 | 免费在线电影网址大全 | 首页中文字幕 | 精品国产一二三 | 久久99精品久久久久蜜臀 | 国产在线中文字幕 | 天天天操天天天干 | 天天操天天操天天爽 | 久久精品网址 | 日韩av资源站 | 亚洲午夜剧场 | 成人精品视频久久久久 | 久久国产精品一区二区三区 | 在线激情小视频 | 国产成人亚洲在线观看 | 欧美午夜寂寞影院 | 日韩av手机在线观看 | 人人爽人人爽人人爽学生一级 | 精品一区二区视频 | 国产精品免费在线播放 | 丁香激情综合国产 | 六月色婷 | 色全色在线资源网 | 国产区欧美| 深爱五月激情五月 | 九色91在线| 欧美日韩视频在线观看一区二区 | 韩国av电影在线观看 | 日韩在线视频观看免费 | 在线黄色免费 | 日韩中文在线字幕 | 99国产在线视频 | 久久久www成人免费毛片麻豆 | 欧美小视频在线 | 亚洲视频 在线观看 | 夜夜狠狠 | 四虎永久网站 | 欧美一区二区三区免费看 | 久久久免费精品视频 | 国产精品你懂的在线观看 | 蜜臀av网址| 欧美久久久久久 | 国产原创在线 | 亚洲色图 校园春色 | 又黄又爽免费视频 | а天堂中文最新一区二区三区 | 国产区网址 | 最近中文字幕免费av | 91精品第一页 | 久久久精选 | 国产在线精品视频 | 97理论片 | 亚洲精品成人av在线 | 国产成人av在线影院 | 黄污网站在线观看 | 日韩a级免费视频 | 国产综合小视频 | 久久高清视频免费 | 免费观看午夜视频 | 少妇视频一区 | 国产精品久久久久久久久免费 | 国内精品久久久久久久影视简单 | 91色国产在线 | 国产激情电影综合在线看 | 三级黄色在线观看 | 国产成人久久久77777 | 成人av在线网 | 国产一级大片在线观看 | 新版资源中文在线观看 | 久久亚洲综合色 | 久久综合色播五月 | 波多野结衣视频一区二区三区 | av一区二区三区在线观看 | 蜜臀久久99精品久久久无需会员 | 中文字幕最新精品 | 99热这里| 人人射人人澡 | 高清一区二区三区av | 91视频在线免费看 | 人人澡人人爽欧一区 | 中文字幕 在线看 | av高清在线 | 日b视频在线观看网址 | 正在播放亚洲精品 | 日韩免费中文字幕 | 国产日韩欧美在线观看 | avsex| 国产三级午夜理伦三级 | 美女黄频视频大全 | 激情五月伊人 | 久久精品国产精品亚洲精品 | 亚洲伊人网在线观看 | 日日日操操 | 天堂网av在线 | 精品国产一区二区三区久久久蜜月 | 久久新视频 | 久久福利国产 | 午夜精品视频福利 | 婷婷六月综合亚洲 | 亚洲精品视频网 | 亚洲一区二区三区在线看 | 视频一区二区国产 | 久久久亚洲网站 | 91原创在线观看 | 国产理论一区二区三区 | 一区二区三区国产欧美 | 2019中文最近的2019中文在线 | 成人国产网址 | 久久久久久久久久网 | 久久久激情网 | 久久九九免费视频 | 色五月成人 | 97碰在线 | 久久人人艹 | 丰满少妇久久久 | 国产亚洲精品中文字幕 | 亚洲欧洲精品在线 | 日韩精品一卡 | 中文字幕在线观看的网站 | 国产91国语对白在线 | 黄色的视频 | 玖玖在线免费视频 | 蜜臀av.com | 亚洲区视频在线 | 久久99国产精品久久99 | 91精品伦理 | 在线观看黄色免费视频 | 深爱五月激情网 | 精品视频一区在线观看 | 色噜噜日韩精品一区二区三区视频 | 国内精品久久影院 | 在线观看av大片 | 97超碰在线免费观看 | 97在线观看视频免费 | 99精品视频免费观看 | 成人av在线网址 | 亚洲1区 在线 | 日韩免费中文 | 一区二区三区在线视频111 | 国产精品久久久久久久久久三级 | 久草视频免费观 | 成人av久久 | 91精品久久香蕉国产线看观看 | 黄网站色视频免费观看 | 欧美另类亚洲 | 国产精品免费一区二区三区 | 久久99免费视频 | 日韩在线视频网 | 久久观看最新视频 | 国产成人久久av免费高清密臂 | 国产精品成人自拍 | 欧美人人| 日韩欧美视频 | 久久综合亚洲鲁鲁五月久久 | 亚洲免费国产视频 | 色婷婷综合久久久久 | 国产在线综合视频 | 久久国产一区二区三区 | 午夜国产一区二区三区四区 | 国产区免费在线 | 成片免费| 欧美精选一区二区三区 | 在线观看国产日韩 | av电影在线观看完整版一区二区 | 天天操天天干天天摸 | 久久久精品免费看 | 视频国产在线 | 91精品国产乱码在线观看 | 色综合久久五月天 | 亚洲精品女人久久久 | 色婷婷a | 久久99国产精品久久99 | 久草在线一免费新视频 | 欧美激情精品一区 | 久久久久国产精品免费免费搜索 | 国产成人一区二区在线观看 | 婷婷久久精品 | 中文字幕亚洲精品日韩 | 久久综合久久88 | 日韩欧美精品一区二区 | 日韩电影一区二区在线 | av中文字幕不卡 | 国产a高清| 丁香花在线视频观看免费 | 91精品黄色 | 欧美日韩国产一二 | 国产黄色片一级三级 | 久久久久电影网站 | 成人在线黄色电影 | www.av在线播放 | 婷婷www| 欧美一级xxxx | 免费av在线播放 | 69av视频在线观看 | 深夜免费福利视频 | 免费高清无人区完整版 | 成人免费在线播放 | 国产在线一线 | 成人国产精品久久久久久亚洲 | 999成人 | 久久久久久久久久久网 | 欧美日韩精品电影 | 射久久 | 综合久久2023 | 500部大龄熟乱视频 欧美日本三级 | 亚洲精品视频在线播放 | 99久久久国产精品免费99 | 五月婷婷激情 | a级国产乱理论片在线观看 伊人宗合网 | 日韩欧美高清不卡 | 久久天 | 安徽妇搡bbbb搡bbbb | 国产日本高清 | 国产精品国产三级国产不产一地 | 日韩女同一区二区三区在线观看 | 青青河边草免费视频 | 久久草草影视免费网 | 亚洲国产97在线精品一区 | 国产精品永久免费在线 | 国产成人777777 | 国产精品69av | 亚洲精品乱码久久久久久蜜桃不爽 | 99视频这里只有 | 久久久精品高清 | 国产精品久久久久久久久软件 | 亚洲国产精品成人av | 久久99精品久久久久久清纯直播 | 99久久这里有精品 | 亚洲精品婷婷 | 全黄网站 | 国产精品一区二区久久国产 | 国产一级精品在线观看 | 久久国产热视频 | 日本一区二区三区免费观看 | av东方在线 | 亚洲精品久久久久久中文传媒 | 色综合天天狠天天透天天伊人 | 五月婷婷在线视频观看 | 伊人成人精品 | 99精品国产一区二区三区麻豆 | 婷婷狠狠操 | 亚洲欧美国产日韩在线观看 | 亚洲免费成人av电影 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日日夜夜91 | 91视频在线 | 五月天综合网 | 国产中文字幕在线 | 丁香婷婷综合五月 | 免费黄色网址网站 | 欧美激情第八页 | 涩五月婷婷 | 亚洲好视频 | 成人h在线观看 | 九九99视频 | 在线亚洲播放 | 欧美精品一区二区在线观看 | 99999精品 | 狠狠操夜夜操 | 国内综合精品午夜久久资源 | 99久视频 | 国产一区视频免费在线观看 | 国产亚洲精品女人久久久久久 | 国产精品久久久久久影院 | 最新av在线播放 | 国产一级电影免费观看 | 色资源二区在线视频 | 久久精品电影 | 欧美韩国日本在线观看 | 国产91在线 | 美洲 | 91毛片在线观看 | 精品国产免费人成在线观看 | 亚洲成人家庭影院 | 国产成人av综合色 | 激情av网| 久草爱| 成年人免费看 | 国产精品久久久久久久久搜平片 | 美女久久久久久久久久 | 69国产盗摄一区二区三区五区 | 国产精品99视频 | 亚洲美女免费精品视频在线观看 | 在线亚洲欧美视频 | 日韩久久精品 | 日韩高清精品一区二区 | 成人在线免费小视频 | 亚洲更新最快 | 亚洲91中文字幕无线码三区 | 久草视频一区 | av成人免费 | 色婷婷亚洲综合 | 国产成人精品一区二区三区在线观看 | av动态图片 | 又湿又紧又大又爽a视频国产 | 伊人久久影视 | 亚洲成人高清在线 | 欧美另类重口 | 五月婷婷视频 | 国产欧美日韩精品一区二区免费 | 日韩视频免费在线观看 | 天躁狠狠躁 | 99热在线观看免费 | 黄色av免费电影 | 91亚洲综合 | 色综合久久久久综合99 | 久久久精品免费观看 | 国产精品精品国产色婷婷 | 日女人电影 | 成人在线视频网 | 国产在线观看免费观看 | 91精品国产91久久久久久三级 | 国产破处在线视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 一区av在线播放 | 久久国产网 | 亚洲毛片一区二区三区 | 顶级bbw搡bbbb搡bbbb | 四虎影视成人永久免费观看亚洲欧美 | 五月婷婷在线视频观看 | 美女久久网站 | 国产只有精品 | 国产精品视频一二三 | 国产精品资源在线 | 日b视频国产 | 91精品国产高清自在线观看 | 久久久久久久久毛片精品 | 欧美成人在线免费 | 精品国产乱码久久久久久三级人 | 免费观看成年人视频 | 国模视频一区二区三区 | 国产精品一区在线播放 | 日韩av高潮| 久草久草视频 | 欧美在线资源 | www色网站| 黄色三级免费看 | 亚洲综合黄色 | 国产精品免费观看国产网曝瓜 | 国产99在线免费 | 五月婷网 | 91视频88av | www.亚洲黄色 | 亚洲国产福利视频 | 久草在线视频免费资源观看 | 久久久精品99 | 天天色天天色天天色 | 国产91免费在线观看 | 九九九九热精品免费视频点播观看 | 欧美在线视频第一页 | 久久国产欧美日韩精品 | 亚洲资源片| 99热只有精品在线观看 | 国产精品不卡一区 | 日韩在线中文字幕视频 | 欧美一级性生活 | 99se视频在线观看 | 欧美精品一区二区免费 | 狠狠干成人| 国产成人免费精品 | 国产精品视频专区 | 国产午夜精品在线 | 国产精品不卡在线观看 | 国产小视频91 | 日韩精品视频免费 | 九色精品在线 | 一区二区三区电影大全 | 极品嫩模被强到高潮呻吟91 | 欧美激情视频在线免费观看 | 最新久久免费视频 | 婷婷激情欧美 | 91一区一区三区 | 在线免费中文字幕 | 97色狠狠| 美女视频黄频大全免费 | 免费试看一区 | 韩国一区视频 | av福利在线 | 国产美女免费观看 | 亚洲免费永久精品国产 | 精品国产一区二区三区日日嗨 | 六月婷色| 免费看的黄色录像 | 国产精品美女999 | 精品视频免费久久久看 | 99热精品国产一区二区在线观看 | 久久精品黄 | 欧洲精品码一区二区三区免费看 | 久久久国产精品麻豆 | 成年人免费av | 中文在线免费看视频 | 精品一区二区免费视频 | 黄色av电影免费观看 | 超碰免费观看 | 国产精品手机视频 | 看v片| 99久久免费看 | av福利超碰网站 | 99精品欧美一区二区蜜桃免费 | 五月在线视频 | 在线天堂中文在线资源网 | 亚洲高清久久久 | 这里只有精品视频在线观看 | 国产一二三区av | 欧美精品视 | 亚洲视频,欧洲视频 | 欧美日韩xxx| 亚洲精品黄色片 | 爱爱av网站 | 成人av片在线观看 | 国产中文在线字幕 | 欧美黄色免费 | 亚洲精品视频在线观看免费 | 精品一区欧美 | 一级做a爱片性色毛片www | 中文不卡视频在线 | 国产黄色免费在线观看 | 久久免费在线观看 | 日韩av影视在线 | 日韩精品一区在线观看 | 伊香蕉大综综综合久久啪 | 亚洲黄色av网址 | 狠狠色丁香久久婷婷综 | 久黄色 | 91插插插免费视频 | 久久精品人人做人人综合老师 | 99久久精品久久久久久动态片 | 91亚·色| 亚洲精品乱码久久久久久蜜桃动漫 | 98精品国产自产在线观看 | 免费日韩一级片 | 日韩视频欧美视频 | 毛片网在线 | 五月开心六月伊人色婷婷 | 亚洲综合色网站 | 最近中文字幕完整视频高清1 | 色全色在线资源网 | 精品国产自在精品国产精野外直播 | 免费a一级| 成人av地址 | 人人爽人人澡人人添人人人人 | 91传媒激情理伦片 | 亚洲一级特黄 | 高清精品在线 | 国产网站在线免费观看 | 久久久999精品视频 国产美女免费观看 | 欧美一二三区在线观看 | 国产精品一区二区免费在线观看 | 91成人在线视频观看 | 五月天激情在线 | 在线精品亚洲 | 亚洲午夜精品在线观看 | 91麻豆精品国产91久久久久久久久 | 日韩免费看片 | 黄色日本片 | 亚洲国产成人精品在线观看 | 在线99热| 91精品国产亚洲 | 黄网站色 | 日韩,精品电影 | 亚洲激情 | 免费在线观看av | 久草爱视频 | 国产精品久久久久久妇 | 久久综合一本 | 8x成人在线 | 五月亚洲综合 | 国产精品一区久久久久 | 一区二区视频在线看 | 日韩欧美精品一区二区三区经典 | 国产免费人成xvideos视频 | 精品美女国产在线 | 婷婷狠狠操 | 国产精品99久久久精品免费观看 | 久久综合久久综合久久综合 | 中文字幕在线观看视频一区 | 91人人爽人人爽人人精88v | 69xx视频 | 视频1区2区 | 午夜精品一区二区三区在线视频 | 日韩欧美一二三 | 亚洲精品观看 | 国产精品免费久久久久久 | 国产黄色片久久 | 色网av| www.玖玖玖| 久久久久成人精品免费播放动漫 | 日韩大片在线播放 | 色综合五月| 在线免费观看的av网站 | 亚洲成人精品在线观看 | 日韩欧美综合在线视频 | 五月婷网站 | 奇米导航| 天天人人 | 91亚洲精品乱码久久久久久蜜桃 | 最新av在线网站 | 亚洲国产婷婷 | 欧美人牲| 五月婷婷丁香激情 | 激情综合国产 | 亚洲国产视频a | 久久人人爽人人片av | 国产专区在线 | 精品国产一区二区三区蜜臀 | 欧美日韩三级在线观看 | 公开超碰在线 | 日本黄色一级电影 | 黄色免费观看网址 | 91免费看片黄 | 国产精品久久久久久模特 | 日本黄网站 | 欧美国产日韩一区二区三区 | 精品99在线| 国产a视频免费观看 | 激情综合五月天 | 777视频在线观看 | 久久精品视频免费播放 | 狠狠搞,com| 欧美一级片免费 | 中文字幕av一区二区三区四区 | 日韩免费视频一区二区 | 国产一级免费播放 | 久久久 精品 | 久久人人爽人人爽 | 在线免费av网站 | 日本大尺码专区mv | 亚洲精品在线观看视频 | 日韩一二三 | 亚洲精品免费在线播放 | 99色视频 | 欧美 日韩 国产 成人 在线 | 色综合久久精品 | 天天爱天天操天天射 | 在线免费观看欧美日韩 | 国产情侣一区 | 国产精品久久电影观看 | 日韩xxxxxxxxx | 人人插人人澡 | 成人久久影院 | 美女福利视频网 | 麻豆免费看片 | 国产成人久久精品 | 国产免费又爽又刺激在线观看 | 天天操天天操天天 | 一级特黄aaa大片在线观看 | 最新国产福利 | www.黄色| 免费视频久久久久 | 国产福利在线免费 | 日韩18p| 激情综合久久 | 少妇视频一区 | 久久成人国产精品免费软件 | 午夜久久| 97超碰精品 | 久久国产精品色婷婷 | 一区二区视频免费在线观看 | 亚洲成人精品在线观看 | 国产精品美女久久久久久 | 精品久久国产精品 | av免费网页 | 91在线观| 久草影视在线观看 | 国产在线小视频 | 欧美精品v国产精品v日韩精品 | 国产精品久久久久久久久软件 | 成人app在线播放 | 日韩最新中文字幕 | 99久久日韩精品视频免费在线观看 | 亚洲精品午夜久久久久久久久久久 | 99人久久精品视频最新地址 | 又黄又色又爽 | 久精品一区 | 国产成人精品综合久久久久99 | 天天干天天做天天爱 | 人人舔人人插 | japanesefreesex中国少妇 | 久久久久免费精品视频 | 99精品在线视频播放 | 成人免费网站在线观看 | 国产视频精选在线 | 经典三级一区 | 成人a视频| 国产在线资源 | 美女免费视频一区二区 | 中文字幕日韩在线播放 | 美女久久久久久久久久久 | 国产精品免费不 | 国内精品久久久久久久久久久久 | 欧美日韩一区二区久久 | 一级黄色在线视频 | 27xxoo无遮挡动态视频 | 国产精品美女久久久网av | 狠狠狠狠狠狠天天爱 | 在线看片a | 91色亚洲 | 色综合久久综合中文综合网 | 四虎欧美| 免费福利在线视频 | 69欧美视频 | 在线观看一区 | 成年人黄色在线观看 | 国产精品欧美久久久久无广告 | 国产91综合一区在线观看 | 欧美a√在线 | 婷婷丁香色| 天天天色综合a | 国产成人一区二区三区久久精品 | 国产麻豆视频在线观看 | 999免费视频| 黄色av成人在线观看 | 91视频 - 88av| 日韩av资源在线观看 | www日韩精品| 一区二区三区四区精品 | 97精品久久人人爽人人爽 | 国产精品福利午夜在线观看 | 日韩在线电影 | 中文字幕在线免费播放 | 国产1区在线观看 | 亚洲一级电影视频 | 亚洲va韩国va欧美va精四季 | 亚洲视频久久 | av动态图片 | 综合久久久 | 亚洲精品国产精品国产 | 色婷婷激情五月 | 亚洲国产一区二区精品专区 | 人人看黄色 | avwww在线观看 | 久久1区| 娇妻呻吟一区二区三区 | 婷婷av综合 | 欧美日韩中文国产一区发布 | 国产日韩精品视频 | 精品视频久久 | 成人在线观看资源 | 亚洲天堂精品视频在线观看 | 美女久久久久久 | 日韩精品久久久久久久电影99爱 | 91亚瑟视频| 在线影院中文字幕 | 日韩精品免费一区 | 在线观看香蕉视频 | 久久国产精品久久精品国产演员表 | 日韩在线不卡视频 | 黄色av在| 午夜18视频在线观看 | 国产91电影在线观看 | 久久只精品99品免费久23小说 | 国产一级免费av | 国产日韩欧美在线免费观看 | 欧美精品视 | 高清在线一区 | 最新午夜电影 | 国产精品毛片一区二区在线 | 欧美精品999 | 日韩理论视频 | 这里只有精品视频在线观看 | 日本精品一区二区三区在线播放视频 | 黄色毛片网站在线观看 | 国产日韩精品一区二区三区在线 | 草久视频在线观看 | 国产99久久久精品 | 国产免费久久久久 | 中文字幕免费一区 | 国产精品久久久久免费 | 五月婷婷综 | 日韩一级电影在线 | 在线观看免费视频 | 国产精品日韩在线观看 | 久久亚洲福利视频 | 18国产精品福利片久久婷 | 中文字幕一区二区三区四区久久 | 成全在线视频免费观看 | 91免费观看网站 | 午夜av免费观看 | www.看片网站 | 中文字幕乱码电影 | 激情网色| 精品电影一区 | 激情影音先锋 | 麻豆国产精品永久免费视频 | 激情网在线视频 | 亚洲手机av| 国产精品久久久久久高潮 | 久久久久伊人 | 国际精品久久 | 国产资源站 | 狠狠操天天射 | 国产精品区二区三区日本 | 免费观看国产精品视频 | 99久久网站| 香蕉视频国产在线 | 久草网视频在线观看 | www.黄色小说.com | www久 | 超碰在线网 | 激情影音 | 亚洲精品色婷婷 | 国产在线免费观看 | 亚洲精选99| 欧美一区二区三区免费观看 | 日日夜夜精品视频天天综合网 | 色噜噜在线观看视频 | 婷婷色狠狠 | 欧美伦理一区二区 | 玖玖在线看 | 日韩免费观看一区二区 | 精品96久久久久久中文字幕无 | 亚洲成人网av | 美女视频黄免费的久久 | 国产剧情一区 | 久久电影网站中文字幕 | 亚洲 欧美 另类人妖 | 久久久久久国产精品 | 日韩欧美综合在线视频 | 久久大片 | 最近中文字幕在线中文高清版 | 国语精品免费视频 | 91精品一 | 国产精品美女毛片真酒店 | 日本激情动作片免费看 | 欧美激情视频在线观看免费 | 免费性网站 | 狠狠色丁婷婷日日 | 精品久久一区 | 婷婷六月综合亚洲 | 亚洲精品中文在线观看 | 精品一区二区三区香蕉蜜桃 | 狠狠躁日日躁狂躁夜夜躁av | 欧美日韩亚洲精品在线 | 91片黄在线观 | 亚洲成人精品久久久 | 久久人人爽视频 | 波多野结衣在线播放视频 | 在线观看视频在线 | 亚洲婷婷在线视频 | 激情五月在线视频 | 在线观看国产v片 | 欧美日韩精品免费观看视频 | 精品天堂av | 亚洲经典视频在线观看 | 国产一级片播放 | 亚洲欧美视频在线播放 | 99免费在线视频观看 | 久操久 | 狠狠色丁香久久婷婷综合_中 | 免费三级黄色片 | 国产成人精品女人久久久 | 久久国产系列 | 亚洲精品男人天堂 | 91精品国产三级a在线观看 | 91麻豆精品国产自产在线游戏 | 麻豆久久精品 | 国产高清一| 美女在线国产 | 色综合久久88色综合天天人守婷 | 夜夜夜影院 | 日韩免费视频线观看 | 99精品视频在线免费观看 | 美女久久99 | 成人午夜影院在线观看 | 人人爽人人爽人人 | 成人黄色影片在线 | 日韩三级免费 |