Flutter组件可见性检测插件widgets_visibility_provider的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter组件可见性检测插件widgets_visibility_provider的使用

标题

widgets_visibility_provider

内容

  • 简介

    • widgets_visibility_provider 是一个监听 scrollview 内部 child 的的库。
    • 它可以帮助你实现类似 Instagram 显示评论框的效果。
  • 示例图片

  • 如何使用

    1 第一步

    • 使用 WidgetsVisibilityProvider 包裹 scrollview(如 CustomScrollView, ListView 等)。
    WidgetsVisibilityProvider(
      condition: (PositionData positionData) =&gt null,
      child: SomeWidget(
        child: ListView.builder( // CustomScrollView, GridView...
          ...some code...
        ),
      ),
    )
    

    2 第二步

    • 使用 VisibleNotifierWidget 包裹子 widget。
    ListView.builder(
      itemCount: itemCount,
      itemBuilder: (context, index) => VisibleNotifierWidget(
        data: index,
        builder: (context, notification, positionData) => ...,
        listener: (context, notification, positionData) {
          ...
        },
        child: child(),
        condition: (
          previousNotification,
          previousPositionData,
          currentNotification,
          currentPositionData,
        ) =>...,
      ),
    )
    
    • 同样适用于 SliverToBoxAdapterSliverList

    3 第三步

    • 如果你想获取所有范围内的 widget 信息,可以使用 WidgetsVisibilityBuilder 或者 WidgetsVisibilityListener 或者 WidgetsVisibilityConsumerWidgetsVisibilityProvider 子 widget 中。
    WidgetsVisibilityBuilder(
      builder: (context, event) => someWidget,
      buildWhen: (previous, current)=>...,
    )
    
    WidgetsVisibilityListener(
      listenWhen: (previous, current)=>...,
      listener: (context, event) {
        ...
      },
      child: child,
    )
    
    WidgetsVisibilityConsumer(
      builder: (context, event) => someWidget,
      buildWhen: (previous, current)=>...,
      listenWhen: (previous, current)=>...,
      listener: (context, event) {
      }
    )
    
  • 关于数据对象

    • 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
      }
      

示例代码

import 'package:example/instagram_show_comment.dart';
import 'package:example/monitor_children.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        body: Center(child: List()),
      ),
    );
  }
}

class List extends StatelessWidget {
  const List({
    Key key,
  }) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        ElevatedButton(
          child: Text('Monitor Children'),
          onPressed: () => Navigator.of(context)
              .push(MaterialPageRoute(builder: (_) => MonitorChildren())),
        ),
        ElevatedButton(
          child: Text('Instagram show comment'),
          onPressed: () => Navigator.of(context)
              .push(MaterialPageRoute(builder: (_) => InstagramShowComment())),
        )
      ],
    );
  }
}

更多关于Flutter组件可见性检测插件widgets_visibility_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter组件可见性检测插件widgets_visibility_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用widgets_visibility_provider插件来检测组件可见性的一个代码示例。这个插件通过VisibilityProviderVisibilityDetector组件来检测某个widget是否在视图中可见。

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

dependencies:
  flutter:
    sdk: flutter
  widgets_visibility_provider: ^latest_version  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个简单的示例,展示如何使用widgets_visibility_provider来检测一个widget的可见性。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Visibility Detector Example'),
        ),
        body: VisibilityProvider(
          key: ValueKey('visibilityProviderKey'), // 提供一个唯一的key
          child: Column(
            children: [
              Expanded(
                child: ListView.builder(
                  itemCount: 20,
                  itemBuilder: (context, index) {
                    return VisibilityDetector(
                      key: ValueKey('item_$index'), // 提供一个唯一的key
                      onVisibilityChanged: (VisibilityInfo visibilityInfo) {
                        print('Item $index is ${visibilityInfo.visible ? 'visible' : 'not visible'}');
                      },
                      child: ListTile(
                        title: Text('Item $index'),
                      ),
                    );
                  },
                ),
              ),
              SizedBox(height: 200), // 添加一些空白空间以便滚动
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 安装依赖:确保在pubspec.yaml中添加了widgets_visibility_provider依赖。
  2. 使用VisibilityProvider:在需要检测可见性的widget树的顶层包裹一个VisibilityProvider。这允许我们在整个widget树中使用VisibilityDetector
  3. 使用VisibilityDetector:在每个需要检测可见性的widget上包裹一个VisibilityDetector。在这个例子中,我们对ListView中的每个ListTile使用了VisibilityDetector
  4. 处理可见性变化:通过onVisibilityChanged回调,我们可以获取到每个VisibilityDetector的可见性信息。在这个例子中,当ListTile的可见性发生变化时,我们在控制台打印相关信息。

这个示例展示了如何使用widgets_visibility_provider插件来检测widget的可见性,并根据可见性变化执行相应的操作。你可以根据需要调整这个示例以适应你的应用。

回到顶部