Flutter数据可见性管理插件visibility_data_manager的使用

Flutter数据可见性管理插件visibility_data_manager的使用

Visibility Data Manager

管理可见小部件的数据。


概述

本指南重点介绍了visibility_data_manager库的功能,提供了高效使用该库监控小部件可见性和管理与可见小部件相关数据的见解。它演示了如何在用户与其父级小部件内的滚动小部件交互时有效地利用该库。


关键功能

  • 可见性监控: 轻松跟踪滚动容器内小部件的可见状态。
  • 跟踪公共数据: 公共数据可以依赖于可见的小部件。
  • 依赖公共数据: 可管理的小部件可以依赖于公共数据的变化。
  • 股票交易所订单簿: 实现‘依赖公共数据’场景的真实应用(开发中)。

场景

展示涵盖了各种场景,包括:

  • 基本场景: 小部件跟踪自己的可见状态。
  • 跟踪公共数据场景: 小部件通知可见性管理器其可见性,管理器跟踪公共数据。
  • 依赖公共数据场景: ‘小部件数据’连接到可管理的小部件。管理器从可见小部件的数据更新公共数据,并通知小部件新的公共数据。
  • 股票交易所订单簿: 实现‘依赖公共数据’场景的真实应用(开发中)。

基本场景

GitHub链接

小部件跟踪自己的可见状态。

库提供了一个State混入类,为小部件提供currentVisible状态和changeVisible流。

只需用VisiblityManagerIsVisible.isVisible包装您的ListView

class IsVisiblePage StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return VisiblityManagerIsVisible.isVisible(
            child: ListView(
                children: [
                    ItemWidget()
                ],),);
    }
}

然后在您的项目中使用IsVisible混入类:

class ItemWidget extends StatefulWidget {
    @override
    State<ItemWidget> createState() => _ItemWidgetState();
}

class _ItemWidgetState extends State<ItemWidget> with IsVisible{
    @override
    Widget build(BuildContext context) {
        return Card(
            child: Text(
            currentVisible?'visible':'invisible',
            style: TextStyle(color: currentVisible?Colors.black:Colors.grey),
        ),);
    }
}

跟踪公共数据场景

GitHub链接

小部件通知可见性管理器其可见性,管理器跟踪公共数据。

实现公共数据存储:

class NumOfVisibleStore extends VisiblityCommonDataStore<int> {
    int numOfVisible = 0;

    @override
    void update(int num) {
        if (numOfVisible != num) {
            numOfVisible = num;
            super.update(num);
        }
    }
}

在管理器小部件中初始化存储:

class _NumOfVisibleState extends State<NumOfVisible> {
    final store = NumOfVisibleStore();

创建onVisiblityChange函数:

void onVisiblityChange<TCommon>({
    VisiblityCommonDataStore<TCommon>? dataStore,
    required VisiblityStore visiblyStore}) {
    if (dataStore is NumOfVisibleStore) {
    (dataStore as NumOfVisibleStore)
        .update(visiblyStore.getVisibleKeys().length);
    }
}

VisiblityManagerCommonData.commonData<TCommon>包装您的ListView

@override
Widget build(BuildContext context) {
    return VisiblityManagerCommonData.commonData<int>(
        store: store,
        onChange: onVisiblityChange,
        child: ListView(
            children: items,
        ),);
    }
}

VisiblityManageble包装您的项目,并在创建项目时使用键:

void addItem() {
    final Key key = UniqueKey();
    items = List<Widget>.from([
      ...items,
      Card(
        child: VisiblityManageble(
        key: key,
        builder: () => Text(
            '$key ${store.numOfVisible}',
    ),),)]);
    setState(() {});
}

依赖可计算数据场景

GitHub链接

‘值数据’连接到可管理的小部件。管理器从可见小部件的‘值数据’更新‘可计算数据’并通知小部件新的‘可计算数据’。

实现可计算数据存储:

class MaxVisibleValueStore extends VisiblityCalculableDataStore<double, double> {
    double maxValue = 0;

    @override
    double? calculate(List<Key> keys) {
        maxValue = 0;
        for (var key in keys){
            maxValue = max(maxValue, registred[key]??0);
        }
        super.calculate(keys);
        return maxValue;
    }

    @override
    void update(double data) {
        if (maxValue != data) {
            maxValue = data;
            super.update(data);
        }
    }
}

在管理器小部件中初始化存储:

class _NumOfVisibleState extends State<NumOfVisible> {
    final store = MaxVisibleValueStore();

创建onVisiblityChange函数:

void onVisiblityChange<TValue, TCommon>({
    VisiblityCalculableDataStore<TValue, TCommon>? dataStore,
    required VisiblityStore visiblyStore
    }) {
        if (dataStore is MaxVisibleValueStore) {
            final double? maxValue = (dataStore as MaxVisibleValueStore).calculate(visiblyStore.getVisibleKeys());
        store.update(maxValue??0);
        Future.delayed(Duration.zero, () async{ setState(() {});}); 
    }
}

VisiblityManagerCalculableData.calculable<TValue, TCommon>包装您的ListView

@override
Widget build(BuildContext context) {
    return VisiblityManagerCalculableData.calculable<double, double>(
      store: store,
      onChange: onVisiblityChange,
      child: ListView(
        children: items,
      ),);
    }
}

VisiblityManageble包装您的项目,并在创建它们时设置initValue和使用键:

void addItem() {
    double value = Random().nextDouble();
    items = List<Widget>.from([
        ...items,
        VisiblityManageble(
            key: ValueKey(value),
            initValue: value,
            builder: () => Text('value: $value maxValue: ${store.maxValue}')
        )
    ]);
    setState(() {});
}

更多关于Flutter数据可见性管理插件visibility_data_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据可见性管理插件visibility_data_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


visibility_data_manager 是一个用于管理 Flutter 应用中数据可见性的插件。它可以帮助你在应用中轻松地控制哪些数据对用户可见,哪些数据需要隐藏或根据特定条件显示。下面是如何使用 visibility_data_manager 插件的基本步骤。

1. 添加依赖

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

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

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

2. 导入插件

在你的 Dart 文件中导入 visibility_data_manager 插件:

import 'package:visibility_data_manager/visibility_data_manager.dart';

3. 初始化 VisibilityDataManager

在使用 VisibilityDataManager 之前,你需要先初始化它。通常,你可以在应用的 main 函数中进行初始化:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  VisibilityDataManager.initialize();
  runApp(MyApp());
}

4. 设置数据可见性

你可以使用 VisibilityDataManager 来设置数据的可见性。例如,你可以为某个特定的数据项设置可见性规则:

VisibilityDataManager.setVisibility('data_key', true);

这里,'data_key' 是你想要控制可见性的数据项的标识符,true 表示该数据项是可见的,false 表示该数据项是隐藏的。

5. 检查数据可见性

你可以使用 VisibilityDataManager 来检查某个数据项的可见性:

bool isVisible = VisibilityDataManager.getVisibility('data_key');

如果 isVisibletrue,则表示该数据项是可见的;如果为 false,则表示该数据项是隐藏的。

6. 监听数据可见性变化

你可以监听数据可见性的变化,以便在可见性发生变化时执行某些操作:

VisibilityDataManager.addListener('data_key', (bool isVisible) {
  print('Visibility of data_key changed to: $isVisible');
});

7. 在 UI 中使用数据可见性

你可以在 UI 中使用 VisibilityDataManager 来控制某些 Widget 的可见性。例如,你可以根据数据的可见性来决定是否显示某个 Widget:

class MyWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Visibility(
      visible: VisibilityDataManager.getVisibility('data_key'),
      child: Text('This is some visible data'),
    );
  }
}

8. 清理资源

在不再需要 VisibilityDataManager 时,你可以清理资源:

VisibilityDataManager.dispose();

示例代码

以下是一个完整的示例代码,展示了如何使用 visibility_data_manager 插件:

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  VisibilityDataManager.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Visibility Data Manager Example')),
        body: MyWidget(),
      ),
    );
  }
}

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

class _MyWidgetState extends State<MyWidget> {
  bool _isVisible = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    VisibilityDataManager.addListener('data_key', (bool isVisible) {
      setState(() {
        _isVisible = isVisible;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        Visibility(
          visible: _isVisible,
          child: Text('This is some visible data'),
        ),
        ElevatedButton(
          onPressed: () {
            VisibilityDataManager.setVisibility('data_key', !_isVisible);
          },
          child: Text(_isVisible ? 'Hide Data' : 'Show Data'),
        ),
      ],
    );
  }

  [@override](/user/override)
  void dispose() {
    VisibilityDataManager.removeListener('data_key');
    super.dispose();
  }
}
回到顶部