Flutter可观察集合管理插件observable_collections的使用

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

Flutter可观察集合管理插件observable_collections的使用

observable_collections 是一个用于管理可观察集合的 Flutter 插件。通过它,你可以订阅集合的变化并通过 Stream 接收通知。

安装插件

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

dependencies:
  observable_collections: ^0.4.0

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

使用示例

示例代码

以下是一个简单的示例,展示了如何使用 observable_collections 管理可观察集合并订阅变化。

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

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

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

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

class _ObservableCollectionsExampleState extends State<ObservableCollectionsExample> {
  final List<int> _list = ObservableCollection<int>();
  final StreamController<List<int>> _streamController = StreamController<List<int>>();

  [@override](/user/override)
  void initState() {
    super.initState();
    // 订阅列表变化
    _list.changes.listen((change) {
      print('List changed: $change');
      _streamController.add(List.of(_list));
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
          onPressed: () {
            // 添加元素到列表
            _list.add(1);
          },
          child: Text('Add Element'),
        ),
        ElevatedButton(
          onPressed: () {
            // 删除元素从列表
            _list.remove(1);
          },
          child: Text('Remove Element'),
        ),
        Expanded(
          child: StreamBuilder<List<int>>(
            stream: _streamController.stream,
            initialData: List.of(_list),
            builder: (context, snapshot) {
              if (!snapshot.hasData) {
                return Center(child: CircularProgressIndicator());
              }
              return ListView.builder(
                itemCount: snapshot.data!.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('Element ${snapshot.data![index]}'),
                  );
                },
              );
            },
          ),
        ),
      ],
    );
  }

  [@override](/user/override)
  void dispose() {
    _streamController.close();
    super.dispose();
  }
}

代码解释

  1. 导入库

    import 'package:flutter/material.dart';
    import 'package:observable_collections/observable_collections.dart';
    
  2. 定义主应用

    void main() {
      runApp(MyApp());
    }
    
  3. 创建应用界面

    class MyApp extends StatelessWidget {
      [@override](/user/override)
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('Observable Collections Example')),
            body: ObservableCollectionsExample(),
          ),
        );
      }
    }
    
  4. 定义可观察集合示例状态

    class ObservableCollectionsExample extends StatefulWidget {
      [@override](/user/override)
      _ObservableCollectionsExampleState createState() => _ObservableCollectionsExampleState();
    }
    
  5. 初始化可观察集合

    class _ObservableCollectionsExampleState extends State<ObservableCollectionsExample> {
      final List<int> _list = ObservableCollection<int>();
      final StreamController<List<int>> _streamController = StreamController<List<int>>();
    
  6. 订阅列表变化

    [@override](/user/override)
    void initState() {
      super.initState();
      _list.changes.listen((change) {
        print('List changed: $change');
        _streamController.add(List.of(_list));
      });
    }
    
  7. 添加和删除元素

    ElevatedButton(
      onPressed: () {
        _list.add(1);
      },
      child: Text('Add Element'),
    ),
    ElevatedButton(
      onPressed: () {
        _list.remove(1);
      },
      child: Text('Remove Element'),
    ),
    
  8. 显示列表

    StreamBuilder<List<int>>(
      stream: _streamController.stream,
      initialData: List.of(_list),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Center(child: CircularProgressIndicator());
        }
        return ListView.builder(
          itemCount: snapshot.data!.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('Element ${snapshot.data![index]}'),
            );
          },
        );
      },
    ),
    
  9. 释放资源

    [@override](/user/override)
    void dispose() {
      _streamController.close();
      super.dispose();
    }
    

更多关于Flutter可观察集合管理插件observable_collections的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可观察集合管理插件observable_collections的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,observable_collections 是一个在 Flutter 中用于管理可观察集合的插件。这个插件使得集合(如 List 和 Map)的变化能够被监听和响应。这对于实现响应式 UI 非常有用。下面是如何在 Flutter 中使用 observable_collections 的一个简单示例。

首先,确保在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  observable_collections: ^2.0.0  # 确保使用最新版本

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

接下来,我们可以编写一些代码来展示如何使用 observable_collections

import 'package:flutter/material.dart';
import 'package:observable_collections/observable_list.dart';
import 'package:observable_collections/observable_map.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Observable Collections Demo'),
        ),
        body: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 创建一个 ObservableList
  final ObservableList<String> observableList = ObservableList<String>()
    ..add('Item 1')
    ..add('Item 2')
    ..add('Item 3');

  // 创建一个 ObservableMap
  final ObservableMap<String, int> observableMap = ObservableMap<String, int>()
    ..['Item A'] = 1
    ..['Item B'] = 2
    ..['Item C'] = 3;

  @override
  void initState() {
    super.initState();

    // 监听 ObservableList 的变化
    observableList.addListener(() {
      print('ObservableList changed: $observableList');
      setState(() {}); // 更新UI
    });

    // 监听 ObservableMap 的变化
    observableMap.addListener(() {
      print('ObservableMap changed: $observableMap');
      setState(() {}); // 更新UI
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Expanded(
          child: ListView.builder(
            itemCount: observableList.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(observableList[index]),
                trailing: IconButton(
                  icon: Icon(Icons.delete),
                  onPressed: () {
                    observableList.removeAt(index);
                  },
                ),
              );
            },
          ),
        ),
        SizedBox(height: 20),
        Expanded(
          child: ListView.builder(
            itemCount: observableMap.length,
            itemBuilder: (context, index) {
              final MapEntry<String, int> entry = observableMap.entries.elementAt(index);
              return ListTile(
                title: Text('${entry.key}: ${entry.value}'),
                trailing: IconButton(
                  icon: Icon(Icons.delete),
                  onPressed: () {
                    observableMap.remove(entry.key);
                  },
                ),
              );
            },
          ),
        ),
      ],
    );
  }
}

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

  1. 创建了一个 ObservableList 和一个 ObservableMap
  2. initState 方法中添加了监听器,监听集合的变化。
  3. 当集合变化时,监听器会打印集合的新状态,并调用 setState 方法来更新 UI。
  4. 使用 ListView.builder 来显示集合中的项目,并提供了删除按钮来修改集合。

这样,当用户在 UI 中删除集合中的项目时,集合会自动更新,并且 UI 会响应这些变化。

回到顶部