搜索插件、代码仓与 APP 分类

widgets_visibility_provider 封面
插件详情v3.0.1

widgets_visibility_provider

这是一个监听 ScrollView 内部子项的库。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
132
喜欢数
24
Pub 分数
120

安装插件

flutter pub add widgets_visibility_provider

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

widgets_visibility_provider 包是一个 Flutter 库,旨在监控可滚动容器内子小部件的可见性。它会监听 ScrollView 内子项的位置,并在它们变为可见或隐藏时发出通知,从而实现基于用户滚动的动态行为。非常适合用于实现懒加载、动画或跟踪用户对特定内容部分的参与度等功能。该包支持所有主要平台,包括 Android、iOS、Web、macOS、Windows 和 Linux,使其在跨平台应用中具有高度的通用性。

适合场景

  • 内容的惰性加载
  • 用于分析的跟踪可见性
  • 滚动时触发动画
  • 实现无限滚动
  • 基于可见性的动态UI更新

主要特点

  • 实时可见性检测
  • 跨平台兼容性
  • 与 ScrollView 的简单集成
  • 基于回调的通知系统
  • 轻量且高效

适合对象

  • 带有长可滚动列表的应用程序
  • 内容密集型界面
  • 交互式滚动驱动体验
  • 集成分析的用户界面
  • 注重性能的开发人员

使用建议

  • 如果监控许多小部件,可能会影响性能
  • 需要仔细管理回调
  • 最适合可见子项数量适中的情况
  • 不适合复杂的嵌套滚动结构
  • 需要在不同平台的滚动行为上进行测试

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

widgets_visibility_provider

Pub 996.icu License: 996.icu License: MIT

A library that listens to children inside scrollview

一个监听 scrollview 内部 child 的库

Screenshot

like Instagram show comment

Screenshot

Getting Started

widgets_visibility_provider: ^2.0.2

More info

Flutter 如何在 scrollview 监听子 widget

Flutter 实现类似 ins 的显示评论框效果

How to use

如何使用

First

Use WidgetsVisibilityProvider to wrap scrollview(CustomScrollView, ListView...)

使用 WidgetsVisibilityProvider 包裹 scrollview(CustomScrollview, ListView..)

WidgetsVisibilityProvider(
  // range condition default or return null condition is:
  // 范围判断默认或者返回 null 情况下执行的是:
  // positionData.endPosition >= 0 && positionData.startPosition <= positionData.viewportSize
  condition: (PositionData positionData)=> null,
  // No need to wrap directly
  // 不必直接包裹
  child: SomeWidget(
    child:  ListView.builder(// CustomScrollView, GridView...
      ...some code...
    ),
  ),
)
Second

Use VisibleNotifierWidget to wrap child widget

使用 VisibleNotifierWidget 包裹子 widget

on ListView:

ListView.builder(
  itemCount: itemCount,
  itemBuilder: (context, index) => VisibleNotifierWidget(
    // data type is dynamic, you can set everything or don't set or null
    // data 的类型是 dynamic, 你可以设置任何数据或者为 null 或者不设置
    data: index,
    // you can use builder or child
    // 你可以使用 builder 或者 child
    // positionData and notification is nullable
    // positionData 和 notification 有可能为空
    builder: (context, notification, positionData) => ...,
    // if you use builder, can't use listener and child
    // 如果你使用了 builder, 就不能使用 listener 和 child
    listener: (context, notification, positionData) {
      ...
    },
    child: child(),
    // default buildWhen or return null condition is:
    // 默认判断或者返回 null 情况下执行的是:
    // if (previousPositionData != currentPositionData) return true;
    // if (previousPositionData != null && currentPositionData != null)
    // return previousNotification != currentNotification;
    // return false;
    condition: (
      previousNotification,
     previousPositionData,
     currentNotification,
     currentPositionData,
     )=>...,
  ),
)

on SliverToBoxAdapter

SliverToBoxAdapter(
  child: VisibleNotifierWidget(
    // same to ListView example
    // 和上面一样
    ...
    child: child,
  ),
)

on SliverList

SliverList(
  delegate: SliverChildBuilderDelegate(
    (BuildContext context, int index) => VisibleNotifierWidget(
      // same to ListView example
      // 和上面一样
      ...
      child: child,
    ),
  ),
)
Maybe Third

If you want to watch all widget information

如果你希望一次过获取所有范围内的 widget 信息

Use WidgetsVisibilityBuilder or WidgetsVisibilityListener or WidgetsVisibilityConsumer in WidgetsVisibilityProvider childtree If you use bloc, you can also use WidgetsVisibilityProviderBloc

在 WidgetsVisibilityProvider 的子 widget 使用 WidgetsVisibilityBuilder 或者 WidgetsVisibilityListener或者WidgetsVisibilityConsumer 如果你使用 bloc,也可以使用 WidgetsVisibilityProviderBloc

WidgetsVisibilityBuilder(
  builder: (context, event) => someWidget,
  // Of course, you can also increase the judgment buildWhen
  // 当然你也可以增加条件
  buildWhen: (previous, current)=>...,
)

WidgetsVisibilityListener(
  // Of course, you can also increase the judgment listenWhen
  // 当然你也可以增加条件
  listenWhen: (previous, current)=>...,
  listener: (context, event) {
    ...
  },
  child: child,
)

WidgetsVisibilityConsumer(
  builder: (context, event) => someWidget,
  buildWhen: (previous, current)=>...,
  listenWhen: (previous, current)=>...,
  listener: (context, event) {
)
About data bean

PositionData

class PositionData extends Equatable {
  final double startPosition;
  final double endPosition;
  final double viewportSize;
  final dynamic data;

  ...other code
}

WidgetsVisibilityEvent

class WidgetsVisibilityEvent extends Equatable {
  final ScrollNotification notification;
  final List<PositionData> positionDataList;

  ...other code
}

所属分类

依赖

依赖清单 3 项

源码仓库

使用此插件的项目

暂无相关数据。