Flutter组件可见性检测插件widgets_visibility_provider的使用
Flutter组件可见性检测插件widgets_visibility_provider的使用
标题
widgets_visibility_provider
内容
-
简介
- widgets_visibility_provider 是一个监听
scrollview
内部 child 的的库。 - 它可以帮助你实现类似 Instagram 显示评论框的效果。
- widgets_visibility_provider 是一个监听
-
示例图片
-
如何使用
1 第一步
- 使用
WidgetsVisibilityProvider
包裹scrollview
(如CustomScrollView
,ListView
等)。
WidgetsVisibilityProvider( condition: (PositionData positionData) => 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, ) =>..., ), )
- 同样适用于
SliverToBoxAdapter
和SliverList
。
3 第三步
- 如果你想获取所有范围内的 widget 信息,可以使用
WidgetsVisibilityBuilder
或者WidgetsVisibilityListener
或者WidgetsVisibilityConsumer
在WidgetsVisibilityProvider
子 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
插件来检测组件可见性的一个代码示例。这个插件通过VisibilityProvider
和VisibilityDetector
组件来检测某个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), // 添加一些空白空间以便滚动
],
),
),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 安装依赖:确保在
pubspec.yaml
中添加了widgets_visibility_provider
依赖。 - 使用
VisibilityProvider
:在需要检测可见性的widget树的顶层包裹一个VisibilityProvider
。这允许我们在整个widget树中使用VisibilityDetector
。 - 使用
VisibilityDetector
:在每个需要检测可见性的widget上包裹一个VisibilityDetector
。在这个例子中,我们对ListView
中的每个ListTile
使用了VisibilityDetector
。 - 处理可见性变化:通过
onVisibilityChanged
回调,我们可以获取到每个VisibilityDetector
的可见性信息。在这个例子中,当ListTile
的可见性发生变化时,我们在控制台打印相关信息。
这个示例展示了如何使用widgets_visibility_provider
插件来检测widget的可见性,并根据可见性变化执行相应的操作。你可以根据需要调整这个示例以适应你的应用。