Flutter追踪与显示插件flutter_tracker_widget的使用

Flutter追踪与显示插件flutter_tracker_widget的使用

这是一个支持滚动播放和合理曝光的组件。

开始使用

1. 在 pubspec.yaml 文件中添加依赖

dependencies:
  flutter_tracker_widget: any

2. 获取依赖

在终端运行以下命令以获取依赖:

flutter pub get

3. 导入库

在需要使用的文件中导入以下包:

import 'package:flutter_tracker_widget/flutter_tracker_widget.dart';

4. 使用插件

下面是一个完整的示例代码,展示了如何使用 flutter_tracker_widget 插件来追踪和显示列表项的可见状态:

import 'package:flutter/material.dart';
import 'package:flutter_tracker_widget/flutter_tracker_widget.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Tracker Widget Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Tracker Widget Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: TrackerScrollWidget(
        initialInViewIds: ['0'],
        isInViewPortCondition: (
          double deltaTop,
          double deltaBottom,
          double viewPortDimension,
        ) {
          // 当元素顶部和底部都进入视口一半时,认为元素可见
          return deltaTop < (0.5 * viewPortDimension) && deltaBottom > (0.5 * viewPortDimension);
        },
        child: ListView.builder(
          itemBuilder: (c, index) {
            return TrackerItemWidget(
              id: '$index',
              child: Container(
                height: 200,
                color: Colors.blue[100 * (index % 9 + 1)],
                child: Center(
                  child: Text(
                    '$index',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                displayNotifier: (
                  BuildContext context,
                  bool visible,
                  String id,
                ) {
                  // 打印当前元素的可见状态
                  print('id:$id - index:$index - visible:$visible');
                },
                builder: (
                  BuildContext context,
                  bool isInView,
                  Widget child,
                ) {
                  // 根据元素是否在视口中显示不同的内容
                  return Stack(
                    children: [
                      child,
                      Positioned(
                        right: 0,
                        top: 0,
                        child: Text(
                          isInView ? '显示' : '',
                          style: TextStyle(color: Colors.white),
                        ),
                      )
                    ],
                  );
                },
              ),
            );
          },
          itemCount: 100,
        ),
      ),
    );
  }
}

效果图

特性

  • 滚动结束时处理cell可见逻辑:避免滚动中影响性能。
  • 增加曝光逻辑:支持滚动过程中只曝光一次或每次都曝光。
  • 首次进入也会走曝光和inview逻辑:确保首次加载时也能正确处理。
  • 更合理的释放机制:提高内存管理效率。
  • 优化inview_notifier_list逻辑:提升整体性能。

跟踪策略

/// 跟踪策略
enum TrackerStrategy {
  only, // 只有一次
  every // 每一次
}

更多关于Flutter追踪与显示插件flutter_tracker_widget的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter追踪与显示插件flutter_tracker_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_tracker_widget 是一个用于在 Flutter 应用中追踪和显示某些事件的插件。它可以帮助你监听和响应某些事件的变化,并在 UI 上显示相应的信息。以下是如何使用 flutter_tracker_widget 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_tracker_widget 的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_tracker_widget: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 flutter_tracker_widget

import 'package:flutter_tracker_widget/flutter_tracker_widget.dart';

3. 使用 TrackerWidget

TrackerWidget 是一个可以监听和响应某些事件的 Widget。你可以通过它来追踪某些状态的变化,并在 UI 上显示相应的信息。

以下是一个简单的示例,展示了如何使用 TrackerWidget 来追踪一个计数器并显示其值:

import 'package:flutter/material.dart';
import 'package:flutter_tracker_widget/flutter_tracker_widget.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TrackerExample(),
    );
  }
}

class TrackerExample extends StatefulWidget {
  [@override](/user/override)
  _TrackerExampleState createState() => _TrackerExampleState();
}

class _TrackerExampleState extends State<TrackerExample> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tracker Widget Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            TrackerWidget(
              value: _counter,
              builder: (context, value) {
                return Text(
                  '$value',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

4. 解释

  • TrackerWidget 接受一个 value 参数,这个参数是你想要追踪的值。
  • builder 是一个回调函数,它会在 value 发生变化时被调用,并返回一个 Widget。你可以在这个回调中根据 value 的值来构建 UI。
  • 在上面的示例中,TrackerWidget 追踪了 _counter 的值,并在 _counter 发生变化时更新显示的文本。

5. 进阶使用

TrackerWidget 还可以与其他状态管理工具(如 ProviderRiverpodBloc 等)结合使用,以便更好地管理应用的状态。

例如,使用 Provider 来管理 _counter 的状态:

import 'package:flutter/material.dart';
import 'package:flutter_tracker_widget/flutter_tracker_widget.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => CounterModel(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TrackerExample(),
    );
  }
}

class TrackerExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tracker Widget Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            TrackerWidget(
              value: Provider.of<CounterModel>(context).counter,
              builder: (context, value) {
                return Text(
                  '$value',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => Provider.of<CounterModel>(context, listen: false).increment(),
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class CounterModel extends ChangeNotifier {
  int _counter = 0;

  int get counter => _counter;

  void increment() {
    _counter++;
    notifyListeners();
  }
}
回到顶部