Flutter列表滑動曝光埋點,支持SliverList、SliverGrid

flutter_sliver_tracker

GitHub鏈接git

滑動曝光埋點框架,支持SliverList、SliverGridgithub

什麼是滑動曝光埋點

滑動曝光埋點用於滑動列表組件中的模塊曝光,例如Flutter中的SliverListSliverGrid。 當SliverList中的某一個行(或列)移動到ViewPort中,而且顯示比例超過必定閾值時,咱們把這個事件記爲一次滑動曝光事件。框架

固然咱們對滑動曝光有一些額外的要求:ide

  • 須要滑出必定比例的時候纔出發曝光(已實現)
  • 滑動速度快時不觸發曝光事件(須要throttle)
  • 滑出視野的模塊,再次滑入視野時須要再次上報(已實現)
  • 模塊在視野中上下反覆移動只觸發一次曝光(還未實現)

運行Demo

圖片名稱
  • 克隆代碼到本地: git clone git@github.com:SBDavid/flutter_sliver_tracker.git
  • 切換工做路徑: cd flutter_sliver_tracker/example/
  • 啓動模擬器
  • 運行: flutter run

內部原理

滑動曝光的核心難點是計算組件的露出比例。也是說咱們須要知道ListView中的組件的總高度當前顯示高度。 這兩個高度作除法就能夠得出比例。佈局

組件總高度

組件的總高度能夠在renderObject中獲取。咱們能夠獲取renderObject下的size屬性,其中包含了組件的長寬。ui

當前顯示高度

顯示高度能夠從SliverGeometry.paintExtent中獲取。spa

使用文檔

1. 安裝

dependencies:
 flutter_sliver_tracker: ^1.0.0
複製代碼

2. 引用插件

import 'package:xm_sliver_listener/flutter_sliver_tracker.dart';
複製代碼

3. 發送滑動埋點事件

3.1 經過ScrollViewListener捕獲滾動事件,ScrollViewListener必須包裹在CustomScrollView之上。

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 經過ScrollViewListener捕獲滾動事件
      body: ScrollViewListener(
        child: CustomScrollView(
          slivers: <Widget>[
          ],
        ),
      ),
    );
  }
}
複製代碼

3.2 在SliverToBoxAdapter中監聽滾動中止事件,並計算顯示比例

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 經過ScrollViewListener捕獲滾動事件
      body: ScrollViewListener(
        child: CustomScrollView(
          slivers: <Widget>[
            SliverToBoxAdapter(
              // 監聽中止事件,若是在頁面上展現比例,能夠自行setState
              child: SliverEndScrollListener(
                onScrollInit: (SliverConstraints constraints, SliverGeometry geometry) {
                  // 顯示高度 / sliver高度
                  Fluttertoast.showToast(msg: "展現比例:${geometry.paintExtent / geometry.scrollExtent}");
                },
                onScrollEnd: (ScrollEndNotification notification,
                    SliverConstraints constraints,
                    SliverGeometry geometry) {
                  Fluttertoast.showToast(msg: "展現比例:${geometry.paintExtent / geometry.scrollExtent}");
                },
                child: Container(
                  height: 300,
                  color: Colors.amber,
                 
                  ),
                ),
            ),
          ],
        ),
      ),
    );
  }
}
複製代碼

3.3 在SliverListSliverGrid中監聽滾動中止事件,並計算顯示比例

  • itemLength:列表項佈局高度
  • displayedLength:列表項展現高度
  • 若是須要在widget中顯示高度,能夠自行setState
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 經過ScrollViewListener捕獲滾動事件
      body: ScrollViewListener(
        child: CustomScrollView(
          slivers: <Widget>[
            SliverList(
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  // 監聽滾動中止
                  return SliverMultiBoxScrollEndListener(
                    debounce: 1000,
                    child: Container(
                      height: 300,
                      color: Colors.redAccent,
                      child: Center(
                        child: Text("SliverList Item", style: TextStyle(fontSize: 30, color: Colors.white))
                      ),
                    ),
                    onScrollInit: (double itemLength, double displayedLength) {
                      Fluttertoast.showToast(msg: "顯示高度:${displayedLength}");
                    },
                    onScrollEnd: (double itemLength, double displayedLength) {
                      Fluttertoast.showToast(msg: "顯示高度:${displayedLength}");
                    },
                  );
                },
                childCount: 1
              ),
            ),
          ],
        ),
      ),
    );
  }
}
複製代碼

3.4 在SliverListSliverGrid中監聽滾動更新事件,並計算顯示比例

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 經過ScrollViewListener捕獲滾動事件
      body: ScrollViewListener(
        child: CustomScrollView(
          slivers: <Widget>[
            SliverList(
              delegate: SliverChildBuilderDelegate(
                      (BuildContext context, int index) {
                // 監聽滾動更新事件
                return SliverMultiBoxScrollUpdateListener(
                  onScrollInit: (double percent) {
                    // percent 列表項顯示比例
                  },
                  onScrollUpdate: (double percent) {
                    // percent 列表項顯示比例
                  },
                  debounce: 1000,
                  // percent 列表項顯示比例
                  builder: (BuildContext context, double percent) {
                    return Container(
                      height: 200,
                      color: Colors.amber.withAlpha((percent * 255).toInt()),
                      child: Center(
                          child: Text("SliverList Item Percent ${percent.toStringAsFixed(2)}", style: TextStyle(fontSize: 30, color: Colors.white))
                      ),
                    );
                  },
                );
              },
              childCount: 6
              ),
            ),
          ],
        ),
      ),
    );
  }
}
複製代碼
相關文章
相關標籤/搜索